アプリケーションを起動した時に、メインフォームの上にモーダルダイアログを表示したい。
メインフォームの表示が終わった後に何か処理をしたい時の方法。
■失敗例:OnCreateイベントでダイアログを表示する
メインフォームのOnCreateイベントでモーダルダイアログを表示すると、メインフォームが表示される前にダイアログが表示され、ダイアログを閉じるまでメインフォームは表示されない。
procedure TForm1.FormCreate(Sender: TObject);
var
Form: TForm2;
begin
Form := TForm2.Create(Self);
Form.ShowModal;
Form.Free;
end;
■失敗例:OnActiveイベントでダイアログを表示する
OnActiveイベントでは、フォームの表示が完了する前にダイアログが表示される。
たとえばWindowStateをwsMaximizedにすると、最大化の描画処理の前にダイアログが表示される。
procedure TForm1.FormActivate(Sender: TObject);
var
Form: TForm2;
begin
Form := TForm2.Create(Self);
Form.ShowModal;
Form.Free;
end;
最大化されたウィンドウの描画前にダイアログが表示されてしまう。
■成功例:Application.OnIdleイベントでダイアログを表示する
TApplication.OnIdleはアプリケーションがアイドル状態になった時に発生する。
起動時では、メインウィンドウの準備ができた後に発生する。
TApplicationEventsコンポーネントのOnIdleイベントも同じ。
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure OnMyIdle(Sender: TObject; var Done: Boolean);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle := OnMyIdle;
end;
procedure TForm1.OnMyIdle(Sender: TObject; var Done: Boolean);
var
Form: TForm2;
begin
Application.OnIdle := Nil;
Form := TForm2.Create(Self);
Form.ShowModal;
Form.Free;
end;
■成功例:OnCraeteイベントでメッセージをポストする
OnCraeteイベントの中で、ダイアログを表示するためのメッセージをポストする。
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure OnMyMessage(var Message: TMessage); message WM_USER + 1;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PostMessage(Handle, WM_USER + 1, 0, 0);
end;
procedure TForm1.OnMyMessage(var Message: TMessage);
var
Form: TForm2;
begin
Form := TForm2.Create(Self);
Form.ShowModal;
Form.Free;
end;