Delphi:如何以编程方式调整具有align = alTop的组件的可视顺序

20

我有一个表单,其中有多个面板,每个面板的对齐方式为Align=alTop,所以它们从表单的顶部开始很好地堆叠。

然而,我想动态改变这些面板的外观顺序 - 即上下移动它们。最好的方法是什么?

7个回答

38

您可以通过将顶部对齐的面板的顶部属性设置为0来轻松将其移动到顶部。按相反的请求顺序进行此操作(先处理底部面板),然后就完成了。


1
有时候如果您分配一个负值,它会更好地工作。对我来说是这样的。 - HOPE
1
如果没有“Top”属性,例如在FMX中会怎样? - AlexPi

12

使用鼠标与设计器中移动控件的方式进行移动:将当前面板的Top属性设置为要放在该面板下方的面板Top属性减1。VCL会自动处理其余细节。

如果需要移动多个面板,请使用BeginDeferWindowPos。使用DeferWindowPos调整所有面板的坐标,然后使用EndDeferWindowPos将它们同时移动。


不错,我不知道DeferWindowPos。但是,DisableAlign/EnableAlign难道不更容易吗? - NGLN
1
使用 DeferWindowPos,窗口实际上并不会移动,直到您调用 EndDeferWindowPos。如果您要移动多个窗口,这有助于避免某些窗口位置在其他窗口移动之前更新而导致的闪烁。据我所知,DisableAlign 不会阻止控件移动到任何位置,只是防止父控件进行对齐。我无法判断哪种方法更好。 - Rob Kennedy

2
我建议建立一个框架,您可以动态地从/添加表单到其父控件中。一般来说,创建/添加的顺序是视觉顺序,但是从您的问题中我了解到您希望在应用程序生命周期中更改顺序,因此仅更改原始创建顺序将不足以实现目标。
为了更改顺序,请尝试:
  1. 隐藏面板
  2. 从其父控件中删除面板
  3. 按照您希望的新顺序将面板添加到其父控件中
  4. 显示面板

1
我使用了以下代码:

procedure Show_Hide (Flag_Show : boolean);
begin
  if Flag_Show then
  begin
    with Panel_1 do begin Align := alTop; Visible := true; end;
    with Panel_2 do begin Align := alTop; Visible := true; end;
    with Panel_3 do begin Align := alTop; Visible := true; end;
    with Panel_4 do begin Align := alTop; Visible := true; end;
  end else
  begin
    with Panel_1 do begin Visible := false; Align := alNone; end;
    with Panel_2 do begin Visible := false; Align := alNone; end;
    with Panel_3 do begin Visible := false; Align := alNone; end;
    with Panel_4 do begin Visible := false; Align := alNone; end;
  end;
end;

根据我的意愿 Panel_1 Panel_2 Panel_3 Panel_4

1
如果您更改面板的顶部,则可视面板的顺序会更改。
请尝试以下操作(所有面板都对齐,高度相同):
PANEL0 PANEL1 PANEL2 PANEL3 PANEL4
在所有面板的OnClick事件中执行以下操作:
 TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2;

如果您点击面板,它将向上移动一个位置。

这就是想法。更改顶部X像素。
同时,如果您这样做:

   TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2; 
面板向上移动了2个位置。
新增:如果您使用拖放功能,此事件将返回位置(X和Y);通过原始位置和结束位置,您可以计算新的顶部位置并分配给面板。
请原谅我的英语不好。 敬礼

1

尝试使用一个具有一列和n行的顶部对齐TGridPanel,而不是重新排列顶部对齐面板,这样会有点麻烦。

(注意:如果我没记错的话,TGridPanel在Delphi 2007及以上版本中可用)。


好主意,但我的面板实际上并没有直接放在一个表单上 - 它们是放在另一个类似面板的组件上,这个组件提供了背景效果,而 TGridPanel 隐藏了它。为了让问题简单化,我没有提到这个细节... - Roddy
你不能将 TGridPanel.ParentBackground 设置为 True 吗?我以为派生自 TPanel 的控件可以通过这种方式实现透明... - onnodb

0

我知道这是一个旧帖子,但基本上帮了我——设置顶部属性为零的想法。

我无法使用程序设置位置的想法,因为这取决于应用程序用户——它可以选择在应用程序中显示一些图表,然后所有teecharts(父级)的面板都可以对齐altop。

我按相反的顺序设置它们的顶部属性为0,然后根据用户输入仅设置visible true或false...

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接