Delphi多窗体应用程序和对话框

4
我有一个Delphi 7应用程序,其中包含文档的两个视图(例如,WYSIWYG HTML编辑器可能具有WYSIWYG视图和源视图 - 不是我的真实应用程序)。它们可以在单独的窗口中打开,也可以停靠在主窗口的选项卡中。
如果我从其中一个单独的表单中打开模态对话框,则主表单将被置于前景,并显示为Windows任务栏中的选定窗口。假设主表单是WYSIWYG视图,并且源视图弹出。您进入源视图中的特定点并插入图像标记。出现一个对话框,允许您选择和输入所需的图像属性。如果WYSIWYG视图和源视图重叠,则WYSIWYG视图将被置于前景,而源视图将被隐藏。一旦对话框关闭,源视图就会重新出现。
我尝试将Owner和ParentWindow属性设置为相关的窗体:
dialog := TDialogForm.Create( parentForm ); dialog.ParentWindow := parentForm.Handle;
如何解决这个问题?我还应该尝试什么?
鉴于人们似乎在我的示例上遇到了困难,也许我可以使用更好的示例:文本编辑器允许您同时打开多个文件。您打开的文件要么在选项卡中(如在Delphi IDE中),要么在自己的窗口中。假设用户打开拼写检查对话框或查找对话框。发生的情况是,如果文件正在其自己的窗口中进行编辑,则模态对话框显示时,该窗口将被发送到主窗体下方的z顺序;一旦关闭对话框,它将返回到原始z顺序。
注意:如果您使用Delphi 7并寻找解决此问题的解决方案,请参见本页面下面我的答案以查看我最终采取的措施。
5个回答

5
我会使用这段代码...(基本上就是Lars所说的)
dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit; 
dialog.ShowModal();

这刚刚解决了我长期以来的问题。谢谢。 - J__

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


1
这段内容与编程有关。对话框是使用ShowModal还是Show显示的?你应该正确设置你的对话框的PopupMode属性,pmAuto可能是最好的选择。另外,请查看是否需要设置PopupParent属性。

0
首先,我不完全确定我理解了您的意思,您可能需要提供一些额外的细节来帮助我们理解正在发生的事情和问题所在。我想我不确定我确切地理解您试图完成什么以及问题是什么。
其次,您不应该需要设置对话框的父级,因为这本质上就是通过调用Create(传递父级)发生的。老实说,您描述的对话框似乎需要进行一些“重新考虑”。这个对话框是输入图像属性的源窗口的子窗口,还是所见即所得的窗口的子窗口?

0

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

  1. 这种行为在不同版本的Delphi之间会发生变化。我认为这是由于他们在Delphi 2007中支持Windows Vista所跳过的步骤造成的。
  2. 如果您正在使用Delphi 2007,请尝试从项目源文件中删除设置Application.MainFormOnTaskBar布尔变量的行。
  3. 删除后,您应该能够使用各种窗体的BringToFront / SendToBack方法来实现所需的Z顺序。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接