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
freepascal/delphi组件未出现(我认为是z顺序问题)_Delphi_Freepascal_Lazarus_Z Order - Fatal编程技术网

freepascal/delphi组件未出现(我认为是z顺序问题)

freepascal/delphi组件未出现(我认为是z顺序问题),delphi,freepascal,lazarus,z-order,Delphi,Freepascal,Lazarus,Z Order,我在表格上有一个小组。然后动态地创建更多的面板,并将它们放置在窗体上,使其看起来像菜单 我错误地删除了主面板。然后将其作为新控件放回 现在动态按钮不显示。但是没有错误。所以我猜动态组件在那里,但不可见(在主面板后面) 有办法解决这个问题吗?我似乎找不到组件的z顺序属性 请帮忙 以下是代码段: For MenuItemCount:= 1 to MenuItemLimit Do Begin MenuButtons[MenuItemCount] := TPanel.Crea

我在表格上有一个小组。然后动态地创建更多的面板,并将它们放置在窗体上,使其看起来像菜单

我错误地删除了主面板。然后将其作为新控件放回

现在动态按钮不显示。但是没有错误。所以我猜动态组件在那里,但不可见(在主面板后面)

有办法解决这个问题吗?我似乎找不到组件的z顺序属性

请帮忙

以下是代码段:

  For MenuItemCount:= 1 to MenuItemLimit Do
      Begin
      MenuButtons[MenuItemCount] := TPanel.Create(Self);
      With MenuButtons[MenuItemCount] do
          begin

            Width:=180 - (10*MenuItem[MenuItemCount].Level);
            Left:=4+10*MenuItem[MenuItemCount].Level;

            Height:=25;
            Top:= 5 + Height * (MenuItemCount-1);
            Color:= clMenu;
            Cursor:=crHandPoint;

            Parent := MenuGroup; //Parent container for the items.

            Caption := MenuItem[MenuItemCount].Title;

      end;//End for

MenuGroup
是设计时放置的父面板。

有一种方法
SendToBack
,可以将控件发送到后面(及其
BringToFront
对应项)

但我认为这不能解决你的问题。默认情况下,组件的“Z顺序”是它们的创建顺序。设计时面板是在动态面板之前创建的,即使您已将其删除并在窗体上放置新面板

我认为发生了什么(虽然在没有看到代码的情况下很难猜测),是您试图按名称查找面板,如下所示:

var
  ParentPanel: TPanel;
  DynamicPanel: TPanel;
begin
  ParentPanel := FindComponent('PanelX') as TPanel;

  DynamicPanel := TPanel.Create(Self);
  DynamicPanel.Parent := ParentPanel;

这是可行的,但如果删除PanelX,并使用稍微不同的名称放入新面板,FindComponent将找不到该面板并返回nil。dynamicPanel将nil作为父项,导致它们不显示。

一个小问题:结尾为
end//for
,但实际上它是
with
块的结尾。这意味着下面的代码也将在for循环中执行。您所能做的就是检查它是否实际执行(设置断点),检查MenuItem[MenuItemCount].Level是否不是某个无效值(负值或>=18),以及MenuGroup是否意外为零。在设置顶部、高度等之前,您可能会尝试设置父控件,但我不认为这有什么区别。忘记提及:如果MenuGroup是这些动态控件的父控件,则它们不能按Z顺序显示在MenuGroup后面。控件始终位于其父控件的顶部,并且在其父控件内部只有相对的Z顺序。再次感谢。。。我就是这么做的。我在循环中打印每个元素。我想这是一只虫子。正如您所说,我在创建后不久将父设置移到了行中,是的,您是对的,这没有什么区别:(在这种情况下,我很抱歉,我不能指出这个代码中的其他明显的问题而不需要进行随机猜测。主面板是什么意思,是您的<代码> MunuGue容器吗?如果是的话,那么子控件就被破坏了。BTW。仅仅添加父控件是不够的,希望孩子们能把它作为他们的PAR。ent,您必须再次将它们分配给该父级。但是,当您销毁父级时,您仍将销毁其所有子级。@TLama在主面板中我指的是MenuGroup。它是保存动态创建的子级的面板。这起到了作用。然后,在我意外删除MenuGroup面板并将其放回后,动态面板不会显示在其上。然后它们被销毁了,因为除了
所有者
传入构造函数之外,父级还负责销毁它的所有子级。@TLama请原谅我的无知…我不太明白你的意思。如果你注意到了代码,我正在为每个动态组件设置父属性。如果这是wrong,你能告诉我应该如何更改它吗?谢谢!不,那很好(否则你甚至看不到那些控件),但是如果你破坏了父控件,那些控件也会被破坏。