如何激活/聚焦模态表格

时间:2013-08-08 17:56:36

标签: delphi vcl delphi-xe4

我有一个带有TTrayIcon组件的应用程序,用于“隐藏”和“恢复”我的MainForm。这是我用来“隐藏”(OnTrayClick)

procedure TMainWindow.TrayIcon1Click(Sender: TObject);
var
  I : Integer;
begin
  if Application.MainForm.Visible then begin
    { Hide }
    Application.MainForm.Visible := FALSE;
  end else begin
    { Restore }
    Application.MainForm.Visible := TRUE;
    WindowState := wsNormal;
    Application.BringToFront();
    { Workaround for ModalForms }
    for I := 0 to Screen.FormCount-1 do begin
      if (fsModal in Screen.Forms[I].FormState) then begin
        Screen.Forms[I].BringToFront;
        Screen.Forms[I].SetFocus;
        break; // Stop looking for more ModalForms
      end;
    end;
  end;
end;

如果没有其他(模态)表单打开,此示例可以正常工作。 但是如果有一个ModalForm打开并恢复我的MainForm,ModalForm似乎是在MainForm后面,我无法达到它。在恢复MainForm之后,如何激活/聚焦ModalForm并将其放在MainForm前面?我的Application.MainFormOnTaskbar设置为False

编辑: 如果ModalForm已打开并且我恢复了我的MainForm,则两个表单都根本不会聚焦。

1 个答案:

答案 0 :(得分:3)

MainFormOnTaskbar的设置似乎导致了问题。你真的需要保持这个设置为真。

如果有模态窗口,您可以选择不隐藏任何表单。在那种情况下检查Application.ModalLevel>隐藏代码中为0。您甚至可以显示一个气球提示,指出在消息关闭之前无法最小化应用程序。

否则,如果你真的想最小化所有窗口,下面的代码对我来说效果很好。隐藏打开窗口的全部,包括模态窗口。这将导致主任务栏图标消失,一切都在屏幕外。您需要做的一件事就是跟踪哪些窗口刚刚打开。我在下面通过在隐藏的表单上设置Tag值来做到这一点。然后在恢复代码中,您可以将这些窗口的可见性设置为true。

唯一没有处理的情况是隐藏主窗口但是让模态窗口可见。我不确定你为什么要这样做,而且我个人觉得这会让用户感到困惑。

procedure TForm1.TrayIcon1Click(Sender: TObject);
var
  I : Integer;
begin

  if Application.MainForm.Visible then
  begin
    //  Hide
    for I := 0 to Screen.FormCount-1 do
    begin
      if Screen.Forms[i].Visible = true then
      begin
        Screen.Forms[i].Visible := false;
        Screen.Forms[i].Tag := 1;
      end;
    end;

  end
  else
  begin
    // Restore
    for I := 0 to Screen.FormCount-1 do
    begin
      if Screen.Forms[i].Tag = 1 then
      begin
        Screen.Forms[i].Visible := true;
        Screen.Forms[i].Tag := 0;
      end;
    end;

    Application.BringToFront();

  end;
end;

您可能需要将Modal Form上的PopupParent属性设置为主窗体。对于新表单,这设置为pmAuto,但如果这是一个旧项目,则可能是pmNone。

以下是Allen在PopupMode and PopupParent上发布的博客文章的链接,这是另一个解决主题问题的Stackoverflow问题Newly created modal window loses focus and become inacessible in Windows Vista

我通常使用这样的东西:

MyPopupForm := TMyForm.Create(Owner);
MyPopupForm.PopupMode := pmAuto;
MyPopupForm.PopupParent := Owner;
MyPopupForm.ShowModal;