Delphiでアプリケーション起動時に、モーダルダイアログを表示するには

アプリケーションを起動した時に、メインフォームの上にモーダルダイアログを表示したい。

メインフォームの表示が終わった後に何か処理をしたい時の方法。

■失敗例: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;

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください