多种形式的Delphi应用程序和对话框
我有一个具有两个文档视图的Delphi 7应用程序(例如,所见即所得HTML编辑可能具有所见即所得视图和源视图,而不是我的真实应用程序)。它们可以在单独的窗口中打开,也可以停靠在主窗口的选项卡中。
如果我从其中一个单独的表单中打开模式对话框,则将主表单置于最前面,并在Windows任务栏中显示为选定的窗口。说主要的形式是所见即所得的视图,并弹出源视图。我们转到源视图中的特定点并插入图像标签。出现一个对话框,允许我们选择并输入图像所需的属性。如果WYSIWYG视图和源视图重叠,则WYSIWYG视图将显示在最前面,而源视图被隐藏。取消该对话框后,源视图将重新显示。
我尝试将所有者和ParentWindow属性设置为与之相关的形式:
dialog := TDialogForm.Create( parentForm ); dialog.ParentWindow := parentForm.Handle;
我该如何解决这个问题?我还应该尝试什么?
考虑到人们似乎对我的示例不满意,也许我可以尝试一个更好的示例:一个文本编辑器,它允许我们同时打开多个文件。我们打开的文件在选项卡中(例如在Delphi IDE中)或者在其自己的窗口中。假设用户调出拼写检查对话框或者查找对话框。发生的情况是,如果文件正在其自己的窗口中进行编辑,则在显示模式对话框时,该窗口将以z顺序发送到主窗体下方;对话框关闭后,它将返回到其原始的z顺序。
注意:如果我们使用的是Delphi 7,并且正在寻找解决此问题的方法,请在页面的下方查看我的答案,以查看最终的操作。
解决方案
回答
首先,我不确定我会完全遵循,我们可能需要提供一些其他详细信息,以帮助我们了解正在发生的事情和问题所在。我想我不确定我是否完全了解我们要完成的工作以及问题所在。
其次,我们不需要设置对话框的父级,因为从本质上讲,这就是调用Create(传递父级)时发生的事情。老实说,我们所描述的对话框听起来可能需要一些"重新思考"。输入图像属性的对话框是源窗口还是"所见即所得"窗口的子窗口?
回答
使用ShowModal还是仅显示对话框?我们可能应该将对话框的PopupMode属性设置为正确。 pmAuto可能是我们最好的选择。另请参阅是否需要设置PopupParent属性。
回答
我会使用此代码...(基本上是拉斯所说的话)
dialog := TDialogForm.Create( parentForm ); dialog.PopupParent := parentForm; dialog.PopupMode := pmExplicit; dialog.ShowModal();
回答
我不确定我是否完全理解意思,但是我建议我们可以尝试以下几件事...
- 此行为在不同版本的Delphi之间更改。我建议这是由于他们跳了起来以支持Delphi 2007中的Windows Vista而产生的麻烦。
- 如果使用的是Delphi 2007,请尝试从项目源文件中删除设置Application.MainFormOnTaskBar布尔变量的行。
- 删除此选项后,我们应该能够使用各种Form的BringToFront / SendToBack方法来实现我们所追求的Z顺序。
我怀疑我们发现的内容已在此链接上讨论过
当然,我可能完全想念观点,所以提前致歉!
回答
最后,我最终使用Google网上论坛找到了答案。简而言之,所有模式对话框都需要添加以下内容:
procedure TDialogForm.CreateParams(var Params: TCreateParams); begin inherited; Params.Style := Params.Style or WS_POPUP; Params.WndParent := (Owner as TWinControl).Handle; end;
我猜这相当于在Delphi 7中的Lars和Marius的答案。