Delphi标记标签抛出“控件'MDLabel1'没有父窗口。”
我遇到了一个具有基本格式/标记支持的Delphi标签组件。作为奖励,它支持链接。不幸的是,我不能让它工作。该组件作为单个MD_Label.pas文件提供。我已经为它创建了一个组件包并安装了它。现在,我可以从组件列表中选择它,但将其添加到表单会引发错误: 控件“MDLabel1”没有父窗口 我追溯到CreateWnd调用,找到了一些类似问题的主题,但仍然无法解决这个问题。是我做错了什么,还是因为最初的代码是为Delphi2007编写的,而我使用的是XE,所以需要进行调整 该组件太大,无法在此处发布整个源代码,但您可以从上面的链接下载它。以下是创建部分:Delphi标记标签抛出“控件'MDLabel1'没有父窗口。”,delphi,delphi-xe,Delphi,Delphi Xe,我遇到了一个具有基本格式/标记支持的Delphi标签组件。作为奖励,它支持链接。不幸的是,我不能让它工作。该组件作为单个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;
完整资料来源:
作为旁注:如果您觉得有更好的组件支持在标签中格式化文本,请随时以评论的形式分享TJvHTLabel和TJvMarkupLabel不好。对于不了解VCL内部工作原理的组件作者来说,此错误非常常见 在设计时将组件拖放到窗体上时发生错误,这意味着组件的构造函数正在执行不应该执行的操作。其中一个操作要求组件的句柄具有已分配的HWND,但由于尚未分配组件的父属性,或者父.Handle自身没有已分配的HWND,因此在发生错误时不可能这样做。直到构造函数退出后,才分配父级
因此,您需要调试代码并找到依赖于组件句柄属性的违规构造函数代码,然后将其移出构造函数。根据代码的不同,它可能属于Loaded或CreateWnd,甚至是SetParent,或者甚至可能需要在设计时完全禁用,有时运行时代码不应该在设计时或DFM流媒体期间执行。我从未使用过Jv标签。但它们大概能起作用。为什么它们不好,而一个甚至不能在表单上删除的是?问题不在CreateWnd中。问题是该控件没有父控件。我不会删除该组件。但是,组件的层次结构对于理解问题可能很重要。然后检查整个层次结构是否以及如何覆盖SetParent。注意任何可能触发异常的代码。我推荐您付出一些努力。包括复制步骤和错误消息。可悲的是,太多的帖子没有考虑到这一最低要求。但是,您的故障排除有很大的改进空间。阅读错误消息时,您应该首先调查与控制家长有关的任何事情。也就是说,构造函数的第一行有些启示:FInitialized:=False;//运行时创建MDLabel时需要。这是一篇骇人听闻的文章,暗示了作者在德尔菲知识方面的差距。您最好不要使用这个组件,或者只提取有用的位。将其减少到最少的复制。如果你不能这样做,那就考虑雇佣一个程序员或者自己学习必要的技能。我一段一段地缩减代码,发现ParseText方法是在创建过程中间接调用的。为了不改变太多的原始代码,我只添加了一个if not AssignedParent then exit;在这个方法的开始,它解决了这个问题。