为什么主窗体后面会显示一个对话框?

时间:2011-03-17 23:29:22

标签: delphi forms

今天早些时候,我在我写的Delphi应用程序中打开了一个文件。由于某种原因,与文件网络的连接已关闭 - 原因并不重要 - 而且Windows创建了一个对话框,提醒我该问题。但是,我的应用程序的主要表单位于新创建的对话框之上(即,我的应用程序有一个表单,“文件打开”对话框和警告对话框)。警告对话框是模态的,隐藏在主窗体后面。显然,我有一个问题。

知道发生了什么,或者我如何解决这个问题?主窗体的position属性设置为poDesigned,并且我在关闭/启动时保存/加载窗体的位置,我甚至不知道哪些信息可以帮助您诊断问题。但要明确的是,问题是文件打开对话框 - 显示在应该显示的位置 - 问题是警告对话框。

一如既往地谢谢 -

2 个答案:

答案 0 :(得分:2)

我不明白为什么Windows会在您的应用中创建对话框。哪个API调用导致了这种情况?普通文件操作不显示UI。

很可能您使用的API函数可以显示UI,可能来自shell API。任何可以显示模态对话框的函数都会请求所有者HWND

例如,考虑MessageBox(),您知道的功能会在您的应用中显示模式对话框。它的第一个参数叫做hWnd并记录在案

  

所有者窗口的句柄   要创建的消息框。如果这   参数为NULL,消息框有   没有所有者窗口。

Raymond Chen对模态的whole series of articles有一个解释为什么设置这个很重要。

我有一种预感,你正在调用一些显示模态UI的Win32 API函数,并且没有正确设置所有者HWND。当然,我可能完全错了,但没有更多的信息可以继续。

答案 1 :(得分:2)

您可以在尝试打开网络共享上的文件之前使用SetErrorMode来停止此操作:

var
  OldErrorMode: Integer;
begin
  OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
  try
    if OpenDialog1.Execute then
    begin
      // ....
    end;
  finally
    SetErrorMode(OldErrorMode);
  end;
end;

Delphi的后续版本(IIRC,D2007及更高版本)添加了一个TOpenDialog.Execute的重载版本,它接受一个窗口句柄作为参数;这将设置TOpenDialog的父级并阻止OpenDialog(及其生成的任何错误窗口)出现在主窗口后面。

注意:您可以使用Alt + Tab进入后台对话框(从Windows),直到您的应用程序恢复为止;这通常会在表单顶部隐藏对话框。