3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Delphi】フォームのイベント発生順序

3
Last updated at Posted at 2026-06-22

はじめに

フォーム (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;

実行して、[イベント] ウィンドウで確認します。

image.png

イベントの発生順序はイベントログを デバッグ出力 で絞り込めば、簡単に調べる事が出来ます。

作成時

フォーム作成時のイベントの発生順序は次の通りです。

順序 イベント 説明
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:

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?