Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi标记标签抛出“控件'MDLabel1'没有父窗口。”_Delphi_Delphi Xe - Fatal编程技术网

Delphi标记标签抛出“控件'MDLabel1'没有父窗口。”

Delphi标记标签抛出“控件'MDLabel1'没有父窗口。”,delphi,delphi-xe,Delphi,Delphi Xe,我遇到了一个具有基本格式/标记支持的Delphi标签组件。作为奖励,它支持链接。不幸的是,我不能让它工作。该组件作为单个MD_Label.pas文件提供。我已经为它创建了一个组件包并安装了它。现在,我可以从组件列表中选择它,但将其添加到表单会引发错误: 控件“MDLabel1”没有父窗口 我追溯到CreateWnd调用,找到了一些类似问题的主题,但仍然无法解决这个问题。是我做错了什么,还是因为最初的代码是为Delphi2007编写的,而我使用的是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;在这个方法的开始,它解决了这个问题。