如何动态地创建对齐到顶部,但其他对齐控件后的控制?(How to dynamically creat

2019-07-23 08:25发布

在这种特殊情况下我使用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;

Answer 1:

您需要设置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;

我相信你的想法!



Answer 2:

再次, DisableAlignEnableAlign救援:

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阵列; 即在其创建的顺序。



Answer 3:

您可以使用alCustom对准型,并通过CustomAlignPosition方法控制所有的面板位置(你将需要重写它在父控件)。 这会给你更多的灵活性和控制。



文章来源: How to dynamically create controls aligned to the top but after other aligned controls?