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