应用程序最小化时隐藏表单

时间:2011-06-09 15:26:34

标签: windows delphi delphi-xe

我有一个主表单和状态表单,我在我的应用程序中进行工作时显示。如果工作完成,我只需在状态表单上调用Hide,状态表就会消失。

当我在等待表单可见时最小化主表单时,会出现问题。然后隐藏这两种形式,这就是我想要的。但是,如果工作在主窗体最小化时完成,那么当我恢复它时,状态窗体也会恢复,即使在最小化时已调用Hide

当应用程序最小化时,

Visible似乎是False状态表单,因此调用Hide似乎没有任何效果(帮助说它只是设置VisibleFalse)。

观察结果是否正确?当应用程序再次获得焦点时,表单可见性如何恢复?如何在应用程序最小化时隐藏我的表单?

3 个答案:

答案 0 :(得分:4)

显示形式的

Visible确实是假的,并且在应用程序最小化时调用Hide什么都不做,因为应用程序将其作为最小化机制的一部分隐藏。

代码调用ShowOwnedPopups,在应用程序最小化时将第一个'False'作为'bShow',然后在应用程序恢复时将'True'作为'bShow'。由于该功能显示前一次调用隐藏的所有窗口,因此更改了表单的可见性 介于两者之间没有效果。

现在,请参阅该函数文档的备注部分中的引用,

  

如果使用隐藏弹出窗口   随后是ShowWindow函数   用fShow调用ShowOwnedPopups   参数设置为TRUE不会导致   要显示的窗口

因此,一个解决方案可以是在应用程序隐藏它之前隐藏表单,因此在恢复时不会显示它。但是我们必须知道在恢复时是否实际隐藏或显示了显示形式。这可以通过在显示表单上放置属性或者使用全局变量来实现。在下面,'ShouldBeVisible'是一个假设属性,如果我们要显示信息,它将返回true:

type
  TForm1 = class(TForm)
  ..
  private
    procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
  ...

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
  if (Msg.CmdType = SC_MINIMIZE) and Assigned(Form2) and Form2.Visible then
    Form2.Hide;
  inherited;
  if (Msg.CmdType = SC_RESTORE) and Assigned(Form2) and Form2.ShouldBeVisible then
    Form2.Show;
end;

答案 1 :(得分:2)

警告:我不能100%确定以下方法是安全的。

如果您不需要在应用程序生命周期内(您很可能不会)使用相同的表单对象,那么您可以尝试禁用自动创建弹出窗体(项目/选项)然后通过

创建并显示它
Application.CreateForm(TForm2, Form2);
Form2.Show;

然后通过

释放它
Form2.Release;

这样,表单不可能与主表单一起恢复。

答案 2 :(得分:2)

我现在使用以下适合我的解决方案:

  1. Application.OnRestore恢复事件处理程序中,我调用StatusForm.NotifyRestored。如果状态表单不可见,则显式隐藏状态表单。
  2. 在我的状态表单中,我会跟踪布尔字段FShouldDisplay中的可见性。这是在方法ShowStatusFormHideStatusForm中设置的。

  3. procedure TMainForm.OnApplicationRestore(Sender : TObject);
    begin
    StatusForm.NotifyRestored;
    end;
    
    procedure TStatusForm.NotifyRestored;
    begin
    if not FShouldDisplay then
      ShowWindow(Handle, SW_HIDE);
    end;
    
    procedure TStatusForm.ShowStatusForm;
    begin
    FShouldDisplay := True;
    Show;
    end;
    
    procedure TStatusForm.HideStatusForm;
    begin
    FShouldDisplay := False;
    Hide;
    end;