フォームが表示された直後に何かの処理を行う |
---|
フォームが表示される直前に何かしたいのならば、フォームの 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 ヘルプの参照項目: 「メッセージ:ユーザー定義の〜」 |