【问题标题】:Delphi/FMX: How to add a dynamically created top-aligned component under all previously added top-aligned components, instead of second from the top?Delphi / FMX:如何在所有先前添加的顶部对齐组件下添加动态创建的顶部对齐组件,而不是从顶部开始第二个?
【发布时间】:2023-12-15 19:00:01
【问题描述】:

我正在使用 Delphi 和 FMX 为 Android 制作应用程序。在按钮的 onclick 过程中,我动态创建了一个 TPanel(其中包含一些组件),然后将其添加到 TVertScrollBox。我希望 TPanel 相互堆叠,因此我将 Align 属性设置为 Top。

procedure TMainForm.AddGroupButtonClick(Sender: TObject);
var Group : TPanel;
begin
   Group := TPanel.Create(Self);
   Group.Parent := Groups;         // where Groups is a TVertScrollBox on the form
   Group.Align := TAlignLayout.Top;

   //Then I create some other components and set their Parent to Group
end;

用户可能希望将新的 TPanel 添加到所有其他 TPanel 下。但是,除非之前没有添加 TPanel,否则每个新的 TPanel 都会直接添加到最上面的 TPanel 之下,即从顶部开始的第二个。

为什么会这样?如何在之前添加的所有 TPanel 下添加新的 TPanel?

我在这里看到了一个类似的问题,但他们使用的是 VCL,显然有一个可以更改的*属性。不过,在使用 FMX 组件时似乎没有。

【问题讨论】:

    标签: delphi firemonkey


    【解决方案1】:

    当您创建新的Firemonkey 面板时,其Position 属性默认为X=0, Y=0

    当您设置Align := TAlignLayout.Top; 时,它会与之前放置的组件进行比较,发现Y = 0 处已经有一个面板,并将新面板紧压在现有面板下方。

    将新面板置于所有其他面板组的下方

    ...
    Group.Position.Y := 1000; // any sufficiently large value (bigger than the last panel's Y)
    Group.Align := TAlignLayout.Top;
    

    【讨论】:

      【解决方案2】:

      这是因为当您动态创建 TPanel 时,它的位置为 (0,0),因此它高于之前创建的所有其他面板。您可以使用作弊方法在其他面板下方创建新创建的面板。这是两个简单但有点脏的解决方案。

      方法一:

         Group := TPanel.Create(Self);
         Group.Parent := Groups;         // where Groups is a TVertScrollBox on the form
         Group.Align := TAlignLayout.bottom; // :D it firstly created it at bottom and then move it to top
         Group.Align := TAlignLayout.Top;
      
      

      方法二:

         Group := TPanel.Create(Self);
         Group.Parent := Groups;         // where Groups is a TVertScrollBox on the form
         Group.Position.Y:=Groups.Height+1;
         Group.Align := TAlignLayout.Top;
      
      

      希望它能解决你的问题。

      【讨论】:

        最近更新 更多