8

在这种特殊情况下,我使用PowerPDF库来动态构建 PDF 文档,但这同样适用于在父控件内按顺序动态对齐控件的一般概念。在这个库中,TPRPage是包含所有元素控件的基本控件,在这种情况下,是TPRLayoutPanel.

动态添加控件时我会做什么:

  1. 创建控件 ( TPRLayoutPanel)
  2. 设置控件的父级 ( TPRPage)
  3. 将控件顶部对齐 ( PRLayoutPanel.Align:= alTop;)

问题是它被强制到页面的最开始(顶部)而不是最后(底部)。

我试过设置它的顺序PRLayoutPanel.SendToBack;PRLayoutPanel.BringToFront但没有运气。

如何在父控件中按顺序动态创建和对齐多个控件?我目前唯一的解决方法是以相反的顺序(从头到尾)添加控件,这是非常不必要的。

这是我的通用函数,它在此父项中创建对齐控件的每个新实例:

function TfrmReport.InsertPanel: TPRLayoutPanel;
begin
  Result:= TPRLayoutPanel.Create(PRPage);
  Result.Parent:= PRPage;
  Result.Align:= alTop;
  Result.Height:= 40; //Default, may change later
end;
4

3 回答 3

22

再一次,DisableAlign为了EnableAlign救援:

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
  P: TPanel;
begin
  DisableAlign;
  try
    for I := 0 to 4 do
    begin
      P := TPanel.Create(Self);
      P.Caption := IntToStr(I);
      P.Align := alTop;
      P.Parent := Self;
    end;
  finally
    EnableAlign;
  end;
end;

解释:

启用对齐后,每次向容器添加控件(在此特定情况下为表单本身)都将重新评估该容器内所有其他控件的所有对齐(和锚点)设置。如果该控件没有Top设置特定属性,Top则为0. 当已经有另一个控件与顶部对齐时,则有两个带有 的控件Top = 0,即将插入的控件获胜。我(目前)对此没有深入的解释,但确实如此,并且位置顺序确实与创建顺序相反。

现在,当容器的对齐被禁用时,只需插入连续添加的控件,而它们的所有定位属性都不会改变。Controls当再次启用对齐时,所有这些控件都以相同的方式重新评估,不同之处在于它按照数组中索引的顺序在一个循环中进行;即它们的创建顺序。

于 2013-03-25T22:04:14.413 回答
10

您需要将该Top属性设置为上一个面板的底部。例如,像这样:

PanelTop := 0;
for i := 0 to 5 do
begin
  Panel[i] := TPanel.Create(Self);
  Panel[i].Parent := Self;
  Panel[i].Height := PanelHeight;
  Panel[i].Align := alTop;
  Panel[i].Top := PanelTop;
  inc(PanelTop, PanelHeight);
end;

要将其放入您的代码中,您必须跟踪最近添加的面板的位置。也许您可以在函数var中添加一个参数InsertPanel

function TfrmReport.InsertPanel(var PanelTop: Integer): TPRLayoutPanel;
begin
  Result:= TPRLayoutPanel.Create(PRPage);
  Result.Parent:= PRPage;
  Result.Top:= PanelTop;
  Result.Height:= 40;
  Result.Align:= alTop;
  inc(PanelTop, Result.Height);
end;

我相信你明白了!

于 2013-03-25T19:48:16.653 回答
0

您可以使用 alCustom 对齐类型并通过 CustomAlignPosition 方法控制所有面板位置(您需要在父控件中覆盖它)。这将为您提供更大的灵活性和控制力。

于 2013-03-25T20:11:16.330 回答