我有一个应用程序,它总是同时显示至少两个表单。
一般来说,我在主表单的子表单中有一个作业列表,主表单上显示相关详细信息。可以使用ShowModal管理其他详细信息。
目前的问题是用户最近要求可以在主列表前拖动主表单。
据我所见,因为作业清单表格是在主表格之后创建的,并从主表格调用显示,所以它获得了“正面”位置。
有什么方法可以在运行时更改,即我可以将Active窗体设置在前面吗?
答案 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()
方法显示,然后用户应该能够随意在两个窗口之间切换。