我有一个表单(在下面的示例中为TBigForm),它允许操作一些复杂数据并需要显示其他信息。我将此信息放在fsStayOnTop表单中(在示例中为OnTopForm),以确保它始终可见,但如果需要,可以将其移到一边。现在,当TBigForm中的某些用户操作显示模态表单时,它经常会隐藏在OnTopForm后面,这使应用程序看起来冻结了。我该如何避免这种情况?(搜索得到了很多结果,但我无法从中提炼出解决方案。)
在我的实际应用程序中,有很多地方显示模态表单,因此我希望避免更改所有这些调用。
示例:创建一个新的VCL应用程序,在Form1上放置一个TButton,双击按钮并将生成的Button1Click实现存根替换为以下内容:
在我的实际应用程序中,有很多地方显示模态表单,因此我希望避免更改所有这些调用。
示例:创建一个新的VCL应用程序,在Form1上放置一个TButton,双击按钮并将生成的Button1Click实现存根替换为以下内容:
type
TBigForm = class(TForm)
strict private
OnTopForm: TForm;
Button1: TButton;
procedure Button1Click(Sender: TObject);
protected
procedure DoHide; override;
procedure DoShow; override;
public
constructor Create(AOwner: TComponent); override;
end;
{ TBigForm }
procedure TBigForm.Button1Click(Sender: TObject);
begin
ShowMessage('Test');
end;
constructor TBigForm.Create(AOwner: TComponent);
begin
inherited CreateNew(AOwner);
Caption := 'Big form';
WindowState := wsMaximized;
Button1 := TButton.Create(Self);
Button1.Parent := Self;
Button1.Caption := 'Freeze!';
Button1.SetBounds(10, 10, 100, 100);
Button1.OnClick := Button1Click;
end;
procedure TBigForm.DoHide;
begin
OnTopForm.Free;
inherited DoHide;
end;
procedure TBigForm.DoShow;
begin
inherited DoShow;
OnTopForm := TForm.Create(Self);
OnTopForm.Caption := 'Important information';
OnTopForm.BorderStyle := bsToolWindow;
OnTopForm.FormStyle := fsStayOnTop;
OnTopForm.Position := poScreenCenter;
OnTopForm.Show;
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
f: TBigForm;
begin
f := TBigForm.Create(nil);
try
f.ShowModal;
finally
f.Free;
end;
end;
启动应用程序,单击“Button1”,然后单击“Freeze!”。
(顺便说一句:我们使用的是D2007。)