我有一个带有多个面板的表单,每个面板都有Align=alTop
,因此它们从表单顶部很好地堆叠起来。
但是,我想动态更改这些面板的外观顺序 - 即上下移动它们。这样做的最佳方法是什么?
通过将Top属性设置为0,您可以轻松地将顶部对齐的面板移动到顶部。以相反的顺序执行此操作(首先是底部面板),您就完成了。
移动它们的方式与在设计时使用鼠标移动它们的方式相同:将当前面板的Top
属性设置为比Top
您希望位于当前面板下方的面板的属性小一。VCL 将负责其余的工作。
如果您必须移动多个面板,请从BeginDeferWindowPos
. 使用 将所有面板调整到您想要的任何坐标DeferWindowPos
,然后使用 使它们同时移动EndDeferWindowPos
。
我建议构建一个框架,您可以在其中动态地从/向其父控件中删除/添加表单。通常,创建/添加的顺序是视觉顺序,但从您的问题中我了解到您希望在应用程序生命周期内更改顺序,因此仅更改原始创建顺序是不够的。
要更改顺序,请尝试:
尝试TGridPanel
使用一列和n行进行顶部对齐怎么样 --- 重新排序顶部对齐的面板有点痛苦,真的。
(注意:TGridPanel
如果我没记错的话,在 Delphi 2007 及更高版本中可用)。
如果您更改面板的顶部,则视觉面板的顺序会发生变化。
试试这个(所有面板对齐altop并具有相同的 Height):
面板
0
面板1 面板2 面板3
面板
4
在所有面板的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);使用原始位置和结束位置,您可以计算分配给面板的顶部。
请原谅我糟糕的英语。问候
我使用了以下代码:
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
我知道它是一个旧帖子,但基本上帮助了我 - 将 top 属性设置为零的想法。我不能使用以编程方式设置位置的想法,因为这取决于应用程序用户 - 它可以选择在应用程序上显示一些图表,然后 teecharts 的所有面板(父级)都对齐 altop。我以相反的顺序将它们的 top 属性设置为 0,然后根据用户输入设置可见 true 或 false ...
谢谢。