我的应用程序有几个MDI表单,其中一个表单有子模式表单,详细信息。因此,当我从MDI表单中打开此模态表单时,单击“浏览”按钮并创建OpenFileDialog。一切正常,除非我ALT + TAB。 当我ALT + TAB然后ALT + TAB回到我的应用程序时,我看到OpenFileDialog(也是消息框)是在我的模态窗口之后,但是在MDI窗口的前面。 没有StayOnTop或类似的东西。 只有将OpenDialog带回所有窗口的方法是在我的应用程序中制作第二个ALT + TAB。这会导致Dialog弹出所有其他窗口。
如何防止Dialog隐藏在我的Modal表单后面?有什么建议吗?
我使用的是delphi7,不能使用更高版本的
答案 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
选项进行一些调整)将会对其进行排序。