はじめに
フォーム (TForm) のイベントの発生順序についての記事です。
確認は Delphi 13 Florence で行っています。
フォーム (TForm) イベントの発生順序
単純に作成して破棄した時のイベントの発生順序を調べてみます。キーボードやマウスなどのイベントを除いたイベントハンドラに OutputDebugString() を仕込んで調べてみます。
procedure TForm1.FormActivate(Sender: TObject);
begin
OutputDebugString('OnActivate');
end;
procedure TForm1.FormAfterMonitorDpiChanged(Sender: TObject; OldDPI,
NewDPI: Integer);
begin
OutputDebugString('OnAfterMonitorDpiChanged');
end;
function TForm1.FormAlignInsertBefore(Sender: TWinControl; C1,
C2: TControl): Boolean;
begin
OutputDebugString('OnAlignInsertBefore');
end;
procedure TForm1.FormAlignPosition(Sender: TWinControl; Control: TControl;
var NewLeft, NewTop, NewWidth, NewHeight: Integer; var AlignRect: TRect;
AlignInfo: TAlignInfo);
begin
OutputDebugString('OnAlignPosition');
end;
procedure TForm1.FormBeforeMonitorDpiChanged(Sender: TObject; OldDPI,
NewDPI: Integer);
begin
OutputDebugString('OnBeforeMonitorDpiChanged');
end;
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
OutputDebugString('OnBeforeMonitorDpiChanged');
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
OutputDebugString('OnClose');
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
OutputDebugString('OnCloseQuery');
end;
procedure TForm1.FormConstrainedResize(Sender: TObject; var MinWidth, MinHeight,
MaxWidth, MaxHeight: Integer);
begin
OutputDebugString('OnConstrainedResize');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
OutputDebugString('OnCreate');
end;
procedure TForm1.FormDeactivate(Sender: TObject);
begin
OutputDebugString('OnDeactivate');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
OutputDebugString('OnDestroy');
end;
procedure TForm1.FormHide(Sender: TObject);
begin
OutputDebugString('OnHide');
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
OutputDebugString('OnPaint');
end;
procedure TForm1.FormResize(Sender: TObject);
begin
OutputDebugString('OnResize');
end;
procedure TForm1.FormShow(Sender: TObject);
begin
OutputDebugString('OnShow');
end;
実行して、[イベント] ウィンドウで確認します。
イベントの発生順序はイベントログを デバッグ出力 で絞り込めば、簡単に調べる事が出来ます。
作成時
フォーム作成時のイベントの発生順序は次の通りです。
| 順序 | イベント | 説明 |
|---|---|---|
| 1 | OnConstrainedResize | フォームのサイズ変更制約を調整します。 |
| 2 | OnCreate | フォームを作成したときに発生します。 |
| 3 | OnShow | フォームが表示されたとき(フォームの Visible プロパティが True に設定されている場合)に発生します。 |
| 4 | OnActivate | フォームがアクティブになったときに発生します。 |
| 5 | OnResize | フォームがサイズ変更された直後に発生します。 |
| 6 | OnPaint | フォームが再描画されたときに発生します。 |
破棄時
フォーム破棄時のイベントの発生順序は次の通りです。
| 順序 | イベント | 説明 |
|---|---|---|
| 1 | OnCloseQuery | フォームクローズの問い合わせを終了しようとしたときに発生します。 |
| 2 | OnClose | フォームを閉じたときに発生します。 |
| 3 | OnHide | フォームが非表示(Visible プロパティが False に設定された)際に、発生します。 |
| 4 | OnDestroy | フォームが破棄されたときに発生します。 |
おわりに
Delphi を使い始めた頃は、フォームのイベントがどの順番で発生するのかで悩んだことがあります。こうやって実際に調べてみればすぐに判る事なんですけどね。
参考: 月刊『C MAGAZINE』1999 年 3 月号「コンパイラ Q&A 直送便」P.188
See also:
