4

我有一个Delphi 7 应用程序,它有一个文档的两个视图(例如,所见即所得的HTML 编辑可能有一个所见即所得的视图和一个源视图——不是我真正的应用程序)。它们可以在单独的窗口中打开,也可以停靠在主窗口的选项卡中。

如果我从其中一个单独的窗体打开一个模式对话框,主窗体将被带到前面,并在 Windows 任务栏中显示为选定的窗口。说主要形式是WYSIWYG视图,弹出源视图。您转到源视图中的特定点并插入图像标签。将出现一个对话框,允许您选择并输入图像所需的属性。如果 WYSIWYG 视图和源视图重叠,则 WYSIWYG 视图将被置于前面,源视图被隐藏。一旦对话框被关闭,源视图就会重新出现。

我尝试将所有者和 ParentWindow 属性设置为与之相关的表单:

dialog := TDialogForm.Create( parentForm );
dialog.ParentWindow := parentForm.Handle;

我该如何解决这个问题?我还应该尝试什么?

鉴于人们似乎在我的示例上磕磕绊绊,也许我可以尝试一个更好的示例:一个允许您同时打开多个文件的文本编辑器。您打开的文件要么在选项卡中(如在 Delphi IDE 中),要么在它自己的窗口中。假设用户打开拼写检查对话框或查找对话框。发生的情况是,如果文件正在其自己的窗口中进行编辑,则当显示模式对话框时,该窗口将发送到 z 顺序中的主窗体下方;一旦对话框关闭,它就会返回到原来的 z 顺序。

注意:如果您正在使用 Delphi 7 并寻找解决此问题的方法,请在页面下方查看我的答案,以了解我最终做了什么。

4

5 回答 5

5

我会使用这段代码......(基本上是拉斯所说的)

dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();
于 2008-08-22T09:28:14.480 回答
3

我最终使用 Google Groups找到了答案。简而言之,所有模式对话框都需要添加以下内容:


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 中的答案。

于 2008-08-27T00:38:15.370 回答
1

是使用 ShowModal 显示的对话框还是仅显示?您可能应该正确设置对话框的 PopupMode 属性。pmAuto 可能是您的最佳选择。另请查看是否需要设置 PopupParent 属性。

于 2008-08-22T07:08:04.850 回答
0

首先,我不完全确定我是否遵循,您可能需要提供一些额外的细节来帮助我们了解正在发生的事情以及问题所在。我想我不确定我是否完全了解您要完成的工作以及问题所在。

其次,您不需要设置对话框的父级,因为这本质上是调用 Create(传递父级)时发生的事情。老实说,您所描述的对话听起来像是他们可以使用一些“重新思考”。这个输入图像属性的对话框是源窗口的子窗口还是 WYSIWYG 窗口的子窗口?

于 2008-08-22T05:06:19.120 回答
0

我不确定我是否完全理解你的意思,但这里有一些我可以建议你尝试的事情......

  1. 这种行为会在不同版本的 Delphi 之间发生变化。我建议这是因为他们在 Delphi 2007 中跳过了支持 Windows Vista 的障碍。
  2. 如果您使用的是 Delphi 2007,请尝试从项目源文件中删除设置 Application.MainFormOnTaskBar 布尔变量的行。
  3. 删除此选项后,您应该能够使用各种 Form 的 BringToFront / SendToBack 方法来实现您所追求的 Z 排序。

我怀疑你的发现已经在这个链接上讨论过了 当然,我可能完全错过了你的观点,所以提前道歉!

于 2008-08-22T11:29:17.013 回答