Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi OpenDialog位于alt+;标签_Delphi_Delphi 7 - Fatal编程技术网

Delphi OpenDialog位于alt+;标签

Delphi OpenDialog位于alt+;标签,delphi,delphi-7,Delphi,Delphi 7,我的应用程序有几个MDI表单,其中一个表单有包含详细信息的子模式表单。因此,当我从MDI表单打开此模式表单时,我单击“浏览”按钮并创建OpenFileDialog。除了我按住ALT+TAB键外,一切正常。 当我ALT+TAB然后ALT+TAB返回到我的应用程序时,我看到OpenFileDialog(MessageBox也是)在我的模式窗口后面,但在MDI窗口的前面。 没有StayOnTop之类的东西。 在所有窗口前恢复OpenDialog的唯一方法是在我的应用程序中创建第二个ALT+TAB。这会

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

如何防止对话框隐藏在模态窗体后面?有什么建议吗


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

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

有很多方法可以解决此问题,但最简单的方法可能是将
TOpenDialog
子类化,并覆盖其
taskmodaldiallog
,如下所示:

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
选项进行一些调整)会解决这个问题。

哪个版本的Delphi?您如何显示该对话框?旧版本的Delphi有时无法设置对话框的窗口所有者。没有StayOnTop表单,我忘了提到我使用delphi7,不能使用更高版本。Delphi 7将对话框的窗口所有者设置为
应用程序。Handle
。不确定问题的机制,但您确实希望窗口所有者是调用对话框的窗体。如果我是你,我会直接调用
GetOpenFileName
,避免使用
TOpenDialog
。或者找到一种方法来修补VCL代码,以便正确设置窗口所有者。因此,您可以子类化
TOpenDialog
,重写,
TaskModalDialog
,并在传递的
OPENFILENAME
结构中修复窗口所有者。好的,机制可能如下所示。当您使用ALT+TAB时,无论出于何种原因,您的主窗体都会显示在前面,但隐藏的应用程序窗口不会显示在前面。因此,没有什么可以让你的对话走到最前面。但是,如果对话框的窗口所有者链指向主窗体,那么对话框将出现在最前面,因为窗口始终位于其所有者的顶部。您能否通过我下面的修改更正您的答案,因此我选择它为正确答案?@Darthman Done。我想你现在可以删除你的答案了。顺便说一句,你可以对我的答案做一个建议性的修改,我会接受的。下次我会考虑的。对于现代的Delphi版本(我在D10.2.3东京),您可以在调用
TOpenDialog.Execute(ParentWnd:HWND):Boolean时设置父句柄方法