いくつかの複雑なデータを操作できるフォーム (以下の例では 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 を使用します。)