18

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

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

4

7 回答 7

36

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

于 2009-08-11T16:09:06.170 回答
11

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

如果您必须移动多个面板,请从BeginDeferWindowPos. 使用 将所有面板调整到您想要的任何坐标DeferWindowPos,然后使用 使它们同时移动EndDeferWindowPos

于 2009-08-11T14:19:57.540 回答
1

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

要更改顺序,请尝试:

  1. 隐藏面板
  2. 从其父控件中删除面板
  3. 以您希望的新顺序将面板添加到其父控件
  4. 显示面板
于 2009-08-11T11:47:56.100 回答
1

尝试TGridPanel使用一列和n行进行顶部对齐怎么样 --- 重新排序顶部对齐的面板有点痛苦,真的。

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

于 2009-08-11T12:02:12.980 回答
1

如果您更改面板的顶部,则视觉面板的顺序会发生变化。

试试这个(所有面板对齐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);使用原始位置和结束位置,您可以计算分配给面板的顶部。

请原谅我糟糕的英语。问候

于 2009-08-11T12:10:07.707 回答
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

于 2015-11-05T08:14:39.760 回答
0

我知道它是一个旧帖子,但基本上帮助了我 - 将 top 属性设置为零的想法。我不能使用以编程方式设置位置的想法,因为这取决于应用程序用户 - 它可以选择在应用程序上显示一些图表,然后 teecharts 的所有面板(父级)都对齐 altop。我以相反的顺序将它们的 top 属性设置为 0,然后根据用户输入设置可见 true 或 false ...

谢谢。

于 2009-12-18T01:01:36.640 回答