OpenDialog在alt + tab上落后于模态窗口

时间:2013-07-24 10:34:37

标签: delphi delphi-7

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

如何防止Dialog隐藏在我的Modal表单后面?有什么建议吗?

我使用的是delphi7,不能使用更高版本的

1 个答案:

答案 0 :(得分: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选项进行一些调整)将会对其进行排序。