确定特定单元是否打开模态对话框 - Delphi

时间:2013-08-27 06:59:38

标签: delphi delphi-7

我在Delphi 7中有一个应用程序,它会弹出多个条件的模态对话框。我正在尝试确定来自特定单元的对话框是否从另一个单元打开并关闭它。到目前为止,我已尝试使用以下代码:

Wnd := GetLastActivePopup(Application.Handle);
if (Wnd <> 0) and (Wnd <> Application.Handle) then
   PostMessage(Wnd, wm_close,0,0);

但是,它会关闭所有打开的对话框。当我尝试指定特定表单时,例如:

if (Wnd <> 0) and (Wnd <> FormTest.Handle) then

它会引发访问冲突错误。

如何确定是否正在弹出特定单位的对话框?

4 个答案:

答案 0 :(得分:4)

尝试循环浏览Screen.Forms列表,查找所需的模态表单,如果找到则关闭它:

var
  I: Integer;
  Frm: TForm;
begin
  for I := 0 to Screen.FormCount-1 do
  begin
    Frm := Screen.Forms[I];
    if fsModal in Frm.FormState then
    begin
      if Frm is TDesiredFormClass then
      // or: if Frm.ClassName = 'TDesiredFormClass' then
      // or: GetTypeData(PTypeInfo(Frm.ClassInfo))^.UnitName = 'DesiredUnitName' then
      // or: if (whatever other criteria you need) then
      begin
        Frm.Close; // sets ModalResult to mrCancel
        Break;
      end;
    end;
  end;
end;

答案 1 :(得分:2)

if (Wnd <> 0) and (Wnd <> FormTest.Handle) then

如果FormTest不是有效的实例引用,则会导致访问冲突。之一:

  1. FormTest为零或
  2. FormTest不是-nil,而是指已经被破坏的对象。

答案 2 :(得分:1)

您可以使用GetClassName功能

检查窗口的类名

答案 3 :(得分:0)

有一个简单的解决方案可行。

您可以使用:

procedure TForm1.Button2Click(Sender: TObject);
var
  h: hwnd;
begin
  h := FindWindow(PChar('TForm1'), PChar('Form1'));
  if h <> 0 then  
    PostMessage(h, WM_CLOSE, 0,0);
end;

它可以很好地识别TForm1窗口是否有句柄。这里显而易见的是FindWindow将在整个OS系统中寻找窗口。现在,如果你想要更快的东西,你可以使用@Remy解决方案,它只会寻找应用程序的表单。

来自MSDN:

  

FindWindow功能:

     

检索顶级窗口的句柄,该窗口的类名和窗口   name匹配指定的字符串。此功能不搜索孩子   视窗。此功能不执行区分大小写的搜索。

要搜索子窗口,请使用以下函数:

  

FindWindowEx功能:

     

检索类名和窗口名匹配的窗口的句柄   指定的字符串。该函数从子窗口开始搜索   使用指定子窗口后面的那个。这个功能呢   不执行区分大小写的搜索。

分别是这两个函数的链接:FindWindowFindWindowEx