在这种特殊情况下我使用PowerPDF库动态生成PDF文档,但同样适用于的家长控制的内部动态校准顺序控制的一般概念。 在这种库中, TPRPage
是基本控制以包含所有元件的控制,在这种情况下,顺序实例TPRLayoutPanel
。
我做什么时动态添加控件:
- 创建一个控制(
TPRLayoutPanel
) - 设置控件的父(
TPRPage
) - 对准控制到顶部(
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;
您需要设置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;
我相信你的想法!
再次, 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
阵列; 即在其创建的顺序。
您可以使用alCustom对准型,并通过CustomAlignPosition方法控制所有的面板位置(你将需要重写它在父控件)。 这会给你更多的灵活性和控制。
文章来源: How to dynamically create controls aligned to the top but after other aligned controls?