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