我有一个主表单和状态表单,我在我的应用程序中进行工作时显示。如果工作完成,我只需在状态表单上调用Hide
,状态表就会消失。
当我在等待表单可见时最小化主表单时,会出现问题。然后隐藏这两种形式,这就是我想要的。但是,如果工作在主窗体最小化时完成,那么当我恢复它时,状态窗体也会恢复,即使在最小化时已调用Hide
。
Visible
似乎是False
状态表单,因此调用Hide
似乎没有任何效果(帮助说它只是设置Visible
到False
)。
观察结果是否正确?当应用程序再次获得焦点时,表单可见性如何恢复?如何在应用程序最小化时隐藏我的表单?
答案 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)
我现在使用以下适合我的解决方案:
Application.OnRestore
恢复事件处理程序中,我调用StatusForm.NotifyRestored
。如果状态表单不可见,则显式隐藏状态表单。FShouldDisplay
中的可见性。这是在方法ShowStatusForm
和HideStatusForm
中设置的。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;