我有一个表单,其中有多个面板,每个面板的对齐方式为Align=alTop
,所以它们从表单的顶部开始很好地堆叠。
然而,我想动态改变这些面板的外观顺序 - 即上下移动它们。最好的方法是什么?
您可以通过将顶部对齐的面板的顶部属性设置为0来轻松将其移动到顶部。按相反的请求顺序进行此操作(先处理底部面板),然后就完成了。
使用鼠标与设计器中移动控件的方式进行移动:将当前面板的Top
属性设置为要放在该面板下方的面板Top
属性减1。VCL会自动处理其余细节。
如果需要移动多个面板,请使用BeginDeferWindowPos
。使用DeferWindowPos
调整所有面板的坐标,然后使用EndDeferWindowPos
将它们同时移动。
DeferWindowPos
。但是,DisableAlign
/EnableAlign
难道不更容易吗? - NGLNDeferWindowPos
,窗口实际上并不会移动,直到您调用 EndDeferWindowPos
。如果您要移动多个窗口,这有助于避免某些窗口位置在其他窗口移动之前更新而导致的闪烁。据我所知,DisableAlign
不会阻止控件移动到任何位置,只是防止父控件进行对齐。我无法判断哪种方法更好。 - Rob Kennedy
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;
TPanel(Sender).Top := TPanel(Sender).Top - TPanel(Sender).Height - 2;
如果您点击面板,它将向上移动一个位置。
这就是想法。更改顶部X像素。
同时,如果您这样做:
TPanel(Sender).Top := TPanel(Sender).Top - (TPanel(Sender).Height * 2)- 2;
尝试使用一个具有一列和n行的顶部对齐TGridPanel
,而不是重新排列顶部对齐面板,这样会有点麻烦。
(注意:如果我没记错的话,TGridPanel
在Delphi 2007及以上版本中可用)。
TGridPanel.ParentBackground
设置为 True
吗?我以为派生自 TPanel
的控件可以通过这种方式实现透明... - onnodb我知道这是一个旧帖子,但基本上帮了我——设置顶部属性为零的想法。
我无法使用程序设置位置的想法,因为这取决于应用程序用户——它可以选择在应用程序中显示一些图表,然后所有teecharts(父级)的面板都可以对齐altop。
我按相反的顺序设置它们的顶部属性为0,然后根据用户输入仅设置visible true或false...
谢谢。