如何将Delphi表格移到另一个表格之前?

时间:2011-11-01 16:01:24

标签: forms delphi delphi-2010

我有一个应用程序,它总是同时显示至少两个表单。

一般来说,我在主表单的子表单中有一个作业列表,主表单上显示相关详细信息。可以使用ShowModal管理其他详细信息。

目前的问题是用户最近要求可以在主列表前拖动主表单。

据我所见,因为作业清单表格是在主表格之后创建的,并从主表格调用显示,所以它获得了“正面”位置。

有什么方法可以在运行时更改,即我可以将Active窗体设置在前面吗?

2 个答案:

答案 0 :(得分:6)

注意:在本答复的其余部分中,术语拥有采用Windows documentation使用的含义。这与VCL中相同术语的含义不同。

发生的事情是您的工作清单窗口是顶级拥有的窗口。

  

拥有会在窗口上放置几个约束。

     
      
  • 拥有的窗口始终位于z订单的所有者之上。
  •   
  • 系统会在其所有者被销毁时自动销毁拥有的窗口。
  •   
  • 拥有的窗口在其所有者最小化时隐藏。
  •   

如果您希望您的作业列表窗口能够位于z顺序中的主窗口下方,则它不能由主窗口拥有。您可以按如下方式实现此目的:

class TJobListForm = class(...)
protected
  procedure CreateParams(var Params: TCreateParams); override;
...
procedure TJobListForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := Application.Handle;
end;

这使得作业列表窗口成为隐藏应用程序窗口所拥有的顶级窗口。或者像这样:

procedure TJobListForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;
end;

这使得作业列表窗口成为无主的顶级窗口。因此,它现在在任务栏中收到一个按钮。

进行此类更改将对您的应用程序产生深远影响。上面列表中的第二个和第三个要点是明显的影响。最小化窗口时的行为以及它们与任务栏的交互也会受到影响。我只是在这里划伤了表面。您可能会发现,使您的工作列表窗口不再由主窗口拥有会对您的程序产生很大影响。你会发现Windows在拥有窗口的幕后为你做了很多工作。如果切换到无主窗口,则可能需要重现其中一些工作。

答案 1 :(得分:2)

只要“作业列表表单”不是任何其他窗口的子项(即,未设置其Parent属性且未覆盖其CreateParams()方法以设置TCreateParams.WndParent字段),它使用Show()方法而不是ShowModal()方法显示,然后用户应该能够随意在两个窗口之间切换。