delphi - 当我关闭 Windows 属性窗口时,TOpenDialog 移动到调用窗体后面

标签 delphi delphi-2006

我有一个调用 TOpenDialog 的表单。当窗口出现时,我右键单击显示的文件之一,然后单击属性。关闭 Windows 属性窗口后,打开的对话框窗口会落到调用窗体和主应用程序后面的 Z 顺序底部。使用 alt+tab (正如我在此处阅读的类似文章一样)会将打开的对话框窗口带到前面,但我想要一个更好的解决方案。我所做的大部分研究似乎仅适用于 TForm 类。有没有办法更好地控制TOpenDialog的Z-Order?我正在使用 Delphi 2006。我在 Delphi 2007 应用程序中有类似的代码,并且不会出现此问题(如果有帮助的话)。提前致谢。

最佳答案

在 Delphi 2006 及更高版本中,TOpenDialog.Execute()有一个可选的ParentWnd范围。未指定时,Execute()进行一些搜索来决定使用哪个父窗口来实现 z 顺序:

  1. 如果 Application.ModalPopupMode不是pmNone , Application.ActiveFormHandle已使用。

  2. 如果 Application.ModalPopupModepmNone ,或Application.ActiveFormHandle是 0,Application.Handle被用来代替。在Delphi 2007及更高版本中,引入了TApplication.MainFormOnTaskbar属性(property),如果 MainFormOnTaskbar是真的并且 Application.MainForm已分配,Application.MainFormHandle使用而不是 Application.HandleApplication.MainFormHandle触发TApplication.OnGetMainFormHandle事件(如果已分配)。如果未分配,或者返回 0,Application.MainForm.Handle已使用。

在 2006 年及之前的 Delphi 版本中,TOpenDialog始终使用旧版 Win32 API GetOpenFileName()功能。在 Delphi 2007 及更高版本中,TOpenDialog使用较新的IFileOpenDialog如果满足以下所有条件,则为 API,否则返回 GetOpenFileName() :

  1. 应用程序在 Vista 或更高版本上运行。

  2. Dialogs.UseLatestCommonDialogs全局变量为 true。

  3. TOpenDialog.Template属性(property)为零。

  4. OnIncludeItem , OnClose ,或OnShow事件处理程序被分配给 TOpenDialog .

何时 TOpenDialog使用IFileOpenDialog , Execute()尊重指定的父窗口。

何时 TOpenDialog使用GetOpenFileName() , Execute() 忽略指定的父窗口如果 Application.ModalPopupModepmNone并使用Application.MainFormHandle/Application.Handle相反!

因此,要解决 2006 年以来所有 Delphi 版本中的问题,请传递表单的 HandleParentWnd参数,并设置Application.ModalPopupModepmNone 以外的值,那么该对话框将使用表单的窗口作为其父窗口,因此永远不会出现在其后面。不要让 VCL 决定使用哪个父窗口。

顺便说一句,我所说的一切都适用于 TSaveDialog也是如此。

关于delphi - 当我关闭 Windows 属性窗口时,TOpenDialog 移动到调用窗体后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24661806/

相关文章:

delphi - 为什么 Delphi 决定不必要地重新编译某些文件

delphi - TOpenDialog 的尺寸数据存储在哪里以及如何重置?

delphi - 将Delphi .dcu反编译为.pas

delphi - 十六进制转二进制

function - Delphi 中可以对回调函数进行类型转换吗?

delphi - 使用 Delphi 2006 从包含 <Class ="submit".......> 的 Web 文档中查找 IHTMLelement?

ios - 德尔福 + iOS : How to declare simple ObjC-Class?

Delphi:高效快速的 Unicode 文本搜索

delphi - 如何使用 Delphi 6 修改 Indy 8 IdMessage.pas?

Delphi - 比较两个路径名,一个是 UNC,一个是指定驱动器号的路径名