2

我的应用程序有几个 MDI 表单,其中一个表单有包含详细信息的子模式表单。因此,当我从 MDI 表单打开此模式表单时,我单击“浏览”按钮并创建 OpenFileDialog。一切正常,除了当我 ALT+TAB 时。当我 ALT+TAB 然后 ALT+TAB 返回我的应用程序时,我看到 OpenFileDialog(也是消息框)在我的模式窗口后面,但在 MDI 窗口的前面。没有 StayOnTop 或类似的东西。在所有窗口前面恢复 OpenDialog 的唯一方法是在我的应用程序中创建第二个 ALT+TAB。这会导致 Dialog 在所有其他窗口之前弹出。

我能做些什么来防止 Dialog 隐藏在我的 Modal 表单后面?有什么建议吗?

我用的是delphi7,不能用更大的版本

4

1 回答 1

6

我假设这个问题与窗口所有权有关。在 Delphi 7 中,文件对话框将隐藏的应用程序窗口作为其窗口所有者。但是窗口所有者确实需要是活动窗体的窗口。

有很多方法可以解决这个问题,但也许最简单的方法是子类化TOpenDialog并覆盖它TaskModalDialog,如下所示:

function TMyOpenDialog.TaskModalDialog(DialogFunc: Pointer;
  var DialogData): LongBool;
var
  hwndOwner: HWND;
begin
  hwndOwner := Screen.ActiveForm.Handle;
  if hwndOwner = 0 then
    hwndOwner := Application.MainForm.Handle;
  if hwndOwner = 0 then
    hwndOwner := Application.Handle;
  TOpenFilename(DialogData).hwndOwner := hwndOwner;
  Result := inherited TaskModalDialog(DialogFunc, DialogData);
end;

我手头没有 Delphi 7 来测试这个,但我有理由相信沿着这些思路的东西(也许对hwndOwner选择进行一些调整)会解决它。

于 2013-07-24T11:36:35.163 回答