フォームが表示された直後に何かの処理を行う

フォームが表示される直前に何かしたいのならば、フォームの OnShow イベントハンドラを記述すれば良いのですが、フォームが表示された直後に何かしたい場合は少し面倒です。

まず、フォームの表示の際に送る独自のメッセージを定義します。これは、フォームのクラスの定義より先に行う必要があります。メッセージの値は、WM_USER(= $0400)以上 $7fff 以下の範囲にしてください。


interface
uses
  Windows, Messages, ...

const
  WM_SHOWED = WM_USER + 1;

type
  TMainForm = class(TForm)
    :

次に、上で定義したメッセージ WM_SHOWED が送られてきた時に呼び出すメソッド(メッセージハンドラ)を作ります。そしてフォームの OnShow イベントハンドラの中で、そのフォーム自身に対して WM_SHOWED を送るようにします。

WM_SHOWED メッセージを送るとき、フォームの Perform メソッドや SendMessage 関数ではなく、PostMessage 関数を使うのがポイントです。OnShow イベントが起きたときは、フォームは今まさに表示されようとしているところであり、いわば「忙しい」状態にあります。Perform や SendMessage を使ってメッセージを送ると、「忙しい」フォームに対してすぐにそのメッセージを処理するよう要求します。そのため、フォームが表示されないうちに WM_SHOWED が処理されてしまいます。しかし PostMessage を使うと、フォームは表示が済んで暇になってからメッセージを処理する、というわけです。


type
  TMainForm = class(TForm)
    :
  private
    procedure WMShowed(var Message: TMessage); message WM_SHOWED;
  end;

implementation

procedure TMainForm.WMShowed(var Message: TMessage);
begin
end;

procedure TMainForm.FormShow(Sender: TObject);
begin
  PostMessage(Handle, WM_SHOWED, 0, 0)
end;

これで準備は整いました。後は、目的の処理を WMShowed メソッドの中に書き込むだけです。試しに MessageDlg 関数を使ってダイアログボックスを出すコードを書いてみると、OnShow イベントハンドラの中に書いた場合と異なり、フォームが表示されてからダイアログボックスが現われます。

Delphi ヘルプの参照項目: 「メッセージ:ユーザー定義の〜」