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

Dan*_*lly 6 forms delphi delphi-2010

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

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

当前的问题是用户最近要求可以将主表单拖到作业列表的前面.

据我所知,因为作业列表表格是在主表格之后创建的,并从主表格调用显示,所以它获得"前"位置.

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

Dav*_*nan 7

注意:在本答案的其余部分中,所拥有的术语具有Windows文档使用的含义.这与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;
Run Code Online (Sandbox Code Playgroud)

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

procedure TJobListForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;
end;
Run Code Online (Sandbox Code Playgroud)

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

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