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

时间:2020-03-05 18:41:53  来源:igfitidea点击:

我有一个具有两个文档视图的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的答案。