德尔福标记标签抛出"Control 'MDLabel1' has no parent window."



在搜索支持基本格式/标记的Delphi标签组件时,我发现了Delphi标记标签(MDLabel)。作为奖励,它支持链接。不幸的是,我不能让它工作。该组件作为单个MD_Label.pas文件提供。我已经为它创建了一个组件包并安装了它。我现在可以从组件列表中选择它,但将它添加到表单中会引发一个错误:

控件"MDLabel1"没有父窗口。">

我追踪到调用CreateWnd,发现了一些类似问题的主题,但仍然无法解决。是我做错了什么,还是因为最初的代码是为Delphi2007编写的,而我使用的是XE,所以需要调整?

这个组件太大了,无法在这里发布整个源代码,但您可以从上面的链接下载它。以下是创建部分:

constructor TMDLabel.Create(AOwner: TComponent);
begin
FInitialized := False; // required for runtime creation of MDLabel
inherited;
ControlStyle := [csOpaque, csCaptureMouse, csClickEvents, csSetCaption];
FLinkFontNormal := TFont.Create;
FLinkFontNormal.Assign(Font);
FLinkFontNormal.Color := clBlue;
FLinkFontNormal.Style := [];
FLinkFontHover := TFont.Create;
FLinkFontHover.Assign(Font);
FLinkFontHover.Color := clRed;
FLinkFontHover.Style := [fsUnderline];
Width := 100;
Height := 13;
Cursor := crArrow;
TabStop := False;
DoubleBuffered := True;
FTextHeight := 0;
FAutoSizeWidth := True;
FAutoSizeHeight := True;
FTextAlignment := taLeftJustify;
FCompressSpaces := False;
FTabWidth := 8;
FParsingText := False;
FBuildingLines := False;
FRebuildLines := False;
FMaxWidth := 0;
FLinkFontNormal.OnChange := DoFontChange;
FLinkFontHover.OnChange := DoFontChange;
FOnLinkClicked := nil;
FOnPaintBackground := nil;
FOnHeightChanged := nil;
FOnWidthChanged := nil;
FLines := TList.Create;
FWords := TList.Create;
FLinkRCs := TList.Create;
FMouseDownMove := False;
FMouseWasDown := False;
FMouseDownIndex := - 1;
FInitialized := True;
end;
procedure TMDLabel.CreateWnd;
begin
inherited CreateWnd;
{$IFNDEF UNICODE}
if (inherited Caption <> '') and (FCaptionUTF8 = '') then CaptionUTF8 := inherited Caption;
{$ENDIF}
end;

完整来源:http://pastebin.com/sxYvpqTy

附带说明:如果您觉得有一个更好的组件支持在标签中格式化文本,请随时作为评论分享(TJvHTLabel和TJvMarkupLabel不好)。

对于不了解VCL内部工作方式的组件作者来说,这个错误是非常常见的。

在设计时将组件拖放到窗体上时发生错误,这意味着组件的构造函数正在执行不该执行的操作。其中一个操作要求组件的Handle具有分配的HWND,但在发生错误时这是不可能的,因为组件的Parent属性尚未分配,或者CCD_ 5没有自己分配的CCD_。Parent直到构造函数退出后才被赋值。

因此,您需要调试代码,找到依赖于组件的Handle属性的有问题的构造函数代码,并将其移出构造函数。根据它是哪种代码,它要么属于Loaded()CreateWnd(),甚至属于SetParent(),甚至可能需要在设计时完全禁用它(有时运行时代码根本不应该在设计时或DFM流期间执行)。

相关内容

最新更新