多种形式的Delphi应用程序和对话框

多种形式的Delphi应用程序和对话框

Multiple form Delphi applications and dialogs

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

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

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

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

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

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

注意:如果您使用的是Delphi 7,并且正在寻找解决此问题的方法,请在页面的下方查看我的答案,以查看最终要执行的操作。


我将使用此代码...(基本上是拉斯所说的话)

1
2
3
4
dialog := TDialogForm.Create( parentForm );
dialog.PopupParent := parentForm;
dialog.PopupMode   := pmExplicit;
dialog.ShowModal();

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

1
2
3
4
5
6
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 \\'答案相当。


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


我不确定我是否很了解你的意思,但是我可以建议您尝试一下...

  • 此行为在不同版本的Delphi之间更改。我建议这是由于他们跳了起来以支持Delphi 2007中的Windows Vista而产生的麻烦。
  • 如果使用的是Delphi 2007,请尝试从项目源文件中删除设置Application.MainFormOnTaskBar布尔变量的行。
  • 删除此选项后,您应该能够使用各种Form的BringToFront / SendToBack方法来实现您所追求的Z顺序。
  • 我怀疑您发现的内容已在此链接上讨论过
    当然,我可能只是完全错过了你的观点,所以提前致歉!


    首先,我不确定我是否完全遵循,您可能需要提供一些其他详细信息,以帮助我们了解正在发生的事情和问题所在。我想我不确定我是否完全了解您要完成的任务以及问题所在。

    第二,您不需要设置对话框的父级,因为从本质上讲,这是调用Create(传递父级)时发生的事情。老实说,您正在描述的对话框听起来可能会使用一些"重新思考"。该对话框是输入图像属性的对话框,是源窗口还是"所见即所得"窗口的子窗口?


    推荐阅读