当我关闭Windows属性窗口时,TOpenDialog在调用表单后面移动

时间:2014-07-09 19:03:18

标签: delphi delphi-2006

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

1 个答案:

答案 0 :(得分:10)

在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属性,如果MainFormOnTaskbar为真且分配了Application.MainForm,则使用Application.MainFormHandle而不是Application.Handle。如果已分配,Application.MainFormHandle会触发TApplication.OnGetMainFormHandle事件。如果未分配,或者返回0,则使用Application.MainForm.Handle

  3. 在2006年之前的Delphi版本中,TOpenDialog始终使用传统的Win32 API GetOpenFileName()函数。在Delphi 2007及更高版本中,如果满足以下所有条件,则TOpenDialog会使用较新的IFileOpenDialog API,否则会回退到GetOpenFileName()

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

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

    3. TOpenDialog.Template属性为零。

    4. 没有将OnIncludeItemOnCloseOnShow事件处理程序分配给TOpenDialog

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

      TOpenDialog使用GetOpenFileName()Execute() IGNORES 指定的父窗口Application.ModalPopupModepmNone并使用{{1}而代之以!/ Application.MainFormHandle

      因此,要在2006年以后的所有Delphi版本中解决您的问题,请将表单Application.Handle传递给Handle参数,并将ParentWnd设置为除Application.ModalPopupMode以外的值pmNone,然后对话框将使用您的表单窗口作为其父级,因此永远不会出现在它的后面。不要让VCL决定使用哪个父窗口。

      顺便说一下,我所说的一切也适用于TSaveDialog