Delphi:如何使用align = alTop以编程方式调整组件的可视排序

时间:2009-08-11 11:39:53

标签: delphi alignment tpanel

我有一个带有多个面板的表单,每个面板都有Align = alTop,所以它们从表单的顶部很好地堆叠。

但是,我想动态地改变这些面板的外观顺序 - 即,上下移动它们。这样做的最佳方式是什么?

8 个答案:

答案 0 :(得分:28)

您可以通过将顶部属性设置为 0 ,轻松地将顶部对齐的面板移动到顶部。以反向请求的顺序(首先是底部面板)执行此操作,您就完成了。

答案 1 :(得分:6)

移动它们的方式与在设计时使用鼠标移动它们的方式相同:将当前面板的Top属性设置为小于要在其下方的面板的Top属性的属性。现任小组。 VCL将负责其余的工作。

如果必须移动多个面板,请从BeginDeferWindowPos开始。使用DeferWindowPos将所有面板调整为您想要的任何坐标,然后使用EndDeferWindowPos将它们全部移动。

答案 2 :(得分:1)

我建议您构建一个框架,您可以在其中动态删除/添加表单到/到其父控件。一般来说,创建/添加的顺序是视觉顺序,但是根据您的问题,我理解您希望在应用程序生命周期内更改顺序,因此仅更改原始创建顺序是不够的。

要更改订单,请尝试:

  1. 隐藏面板
  2. 从父控件中删除面板
  3. 按照您希望的新订单将面板添加到其父控件
  4. 显示面板

答案 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;

最后一个将是第一个。