我有一个调用 TOpenDialog 的表单。当窗口出现时,我右键单击显示的文件之一,然后单击属性。关闭 Windows 属性窗口后,打开的对话框窗口会落到调用窗体和主应用程序后面的 Z 顺序底部。使用 alt+tab (正如我在此处阅读的类似文章一样)会将打开的对话框窗口带到前面,但我想要一个更好的解决方案。我所做的大部分研究似乎仅适用于 TForm 类。有没有办法更好地控制TOpenDialog的Z-Order?我正在使用 Delphi 2006。我在 Delphi 2007 应用程序中有类似的代码,并且不会出现此问题(如果有帮助的话)。提前致谢。
最佳答案
在 Delphi 2006 及更高版本中,TOpenDialog.Execute()
有一个可选的ParentWnd
范围。未指定时,Execute()
进行一些搜索来决定使用哪个父窗口来实现 z 顺序:
如果
Application.ModalPopupMode
不是pmNone
,Application.ActiveFormHandle
已使用。如果
Application.ModalPopupMode
是pmNone
,或Application.ActiveFormHandle
是 0,Application.Handle
被用来代替。在Delphi 2007及更高版本中,引入了TApplication.MainFormOnTaskbar
属性(property),如果MainFormOnTaskbar
是真的并且Application.MainForm
已分配,Application.MainFormHandle
使用而不是Application.Handle
。Application.MainFormHandle
触发TApplication.OnGetMainFormHandle
事件(如果已分配)。如果未分配,或者返回 0,Application.MainForm.Handle
已使用。
在 2006 年及之前的 Delphi 版本中,TOpenDialog
始终使用旧版 Win32 API GetOpenFileName()
功能。在 Delphi 2007 及更高版本中,TOpenDialog
使用较新的IFileOpenDialog
如果满足以下所有条件,则为 API,否则返回 GetOpenFileName()
:
应用程序在 Vista 或更高版本上运行。
Dialogs.UseLatestCommonDialogs
全局变量为 true。TOpenDialog.Template
属性(property)为零。否
OnIncludeItem
,OnClose
,或OnShow
事件处理程序被分配给TOpenDialog
.
何时 TOpenDialog
使用IFileOpenDialog
, Execute()
尊重指定的父窗口。
何时 TOpenDialog
使用GetOpenFileName()
, Execute()
忽略指定的父窗口如果 Application.ModalPopupMode
是 pmNone
并使用Application.MainFormHandle
/Application.Handle
相反!
因此,要解决 2006 年以来所有 Delphi 版本中的问题,请传递表单的 Handle
到ParentWnd
参数,并设置Application.ModalPopupMode
为 pmNone
以外的值,那么该对话框将使用表单的窗口作为其父窗口,因此永远不会出现在其后面。不要让 VCL 决定使用哪个父窗口。
顺便说一句,我所说的一切都适用于 TSaveDialog
也是如此。
关于delphi - 当我关闭 Windows 属性窗口时,TOpenDialog 移动到调用窗体后面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24661806/