У меня есть форма (TBigForm в примере ниже), которая позволяет манипулировать некоторыми сложными данными и нуждается в дополнительной информации для отображения. Я поместил эту информацию в форму fsStayOnTop (в примере OnTopForm), чтобы она всегда была видимой, но при необходимости ее можно было убрать с дороги. Теперь, когда какое-то действие пользователя в TBigForm показывает модальную форму, это часто скрывается за OnTopForm, что заставляет приложение выглядеть замороженным. Как я могу избежать этого? (Поиск дает много-много хитов, но я не смог найти решение из них.)
В моем реальном приложении есть много мест, где отображаются модальные формы, поэтому я бы не хотел изменять все эти вызовы.
Пример : создайте новое приложение VCL, перетащите TButton на форму Form1, дважды щелкните кнопку и замените созданную заглушку реализации 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.)