我有一个调用TOpenDialog的表单。当窗口出现时,我右键单击其中一个显示的文件并单击属性。关闭Windows属性窗口后,打开的对话框窗口将显示在调用表单和主应用程序后面的Z-Order的底部。使用alt + tab(正如我在这里的类似帖子中所读到的)将打开对话框窗口到前面,但我想要一个更好的解决方案。我所做的大部分研究似乎只适用于TForm类。有没有办法更好地控制TOpenDialog的Z-Order?我正在使用Delphi 2006.我在Delphi 2007应用程序中有类似的代码,并且不会发生此问题(如果这有帮助)。提前谢谢。
答案 0 :(得分:10)
在Delphi 2006及更高版本中,TOpenDialog.Execute()
具有可选的ParentWnd
参数。如果未指定,Execute()
会进行一些搜索以决定将哪个父窗口用于z顺序目的:
如果Application.ModalPopupMode
不是pmNone
,则使用Application.ActiveFormHandle
。
如果Application.ModalPopupMode
为pmNone
,或Application.ActiveFormHandle
为0,则使用Application.Handle
。在Delphi 2007及更高版本中,通过引入TApplication.MainFormOnTaskbar
属性,如果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
属性为零。
没有将OnIncludeItem
,OnClose
或OnShow
事件处理程序分配给TOpenDialog
。
当TOpenDialog
使用IFileOpenDialog
时,Execute()
会尊重指定的父窗口。
TOpenDialog
使用GetOpenFileName()
,Execute()
IGNORES 指定的父窗口Application.ModalPopupMode
为pmNone
并使用{{1}而代之以!/ Application.MainFormHandle
!
因此,要在2006年以后的所有Delphi版本中解决您的问题,请将表单Application.Handle
传递给Handle
参数,并将ParentWnd
设置为除Application.ModalPopupMode
以外的值pmNone
,然后对话框将使用您的表单窗口作为其父级,因此永远不会出现在它的后面。不要让VCL决定使用哪个父窗口。
顺便说一下,我所说的一切也适用于TSaveDialog
。