C++Builder のアプリ起動、終了、最小化、元に戻したときのイベントの発生順序を記載します。
C++Builder のアプリを起動すると Form の OnCreate や OnShow イベントなどが呼ばれます。それらのイベントがどのような順番で呼ばれるかを調べたものです。アプリ起動だけではなく、併せて アプリ終了、最小化、元に戻す の操作をしたときも調べています。
調査環境
- Windows 11 23H2
- C++ Builder 12 Community Edition
イベントの発生順
アプリの起動
exe を実行してアプリを起動したときに発生するイベントの順序です。
TForm1()
Form::OnCreate() // フォームを作成したときに発生します。
Form::OnShow() // フォームが表示されたときに発生します。(Visible=true時)
Form::OnConstrainedResize() // サイズ変更の制約を調整します。
Form::OnPaint() // フォームが再描画されたときに発生します。
Form::OnActivate() // フォームがアクティブになったときに発生します。
Form::OnResize() // コントロールがサイズ変更された直後に発生します。
ApplicationEvents::OnActivate() // アプリケーションがアクティブになった際に発生します。
Form::OnPaint() // フォームが再描画されたときに発生します。
ApplicationEvents::OnIdle() // アプリケーションがアイドル状態になったときに発生します。
起動時の詳細なログ
11/16(Sat).22:40:08 INFO TForm1()
11/16(Sat).22:40:08 INFO FormCreate()
11/16(Sat).22:40:08 INFO FormShow()
11/16(Sat).22:40:08 INFO FormConstrainedResize()
11/16(Sat).22:40:08 INFO FormPaint()
11/16(Sat).22:40:08 INFO FormActivate()
11/16(Sat).22:40:08 INFO FormResize()
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x000c1648, message:0x0000031f(WM_DWMNCRENDERINGCHANGED))
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x006810aa, message:0x0000031f(WM_DWMNCRENDERINGCHANGED))
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x000c1648, message:0x0000b000)
11/16(Sat).22:40:08 INFO ApplicationEvents1Activate()
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x006810aa, message:0x0000c0e0)
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x003a0e0e, message:0x00000060)
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x003a0e0e, message:0x00000060)
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x003a0e0e, message:0x00000060)
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x006810aa, message:0x0000000f(WM_PAINT))
11/16(Sat).22:40:08 INFO FormPaint()
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x003a0e0e, message:0x00000060)
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x00000000, message:0x00000113(WM_TIMER))
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x00290b24, message:0x00000282(WM_IME_NOTIFY))
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x00000000, message:0x00000113(WM_TIMER))
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x000e169e, message:0x00000113(WM_TIMER))
11/16(Sat).22:40:08 INFO ApplicationEvents1Message(hWnd:0x00000000, message:0x0000c0a2)
11/16(Sat).22:40:08 INFO ApplicationEvents1Idle()
Form::OnShow() はフォームが表示される直前に発生する
公式の説明では以下のように記載されています。
Vcl.Forms.TCustomForm.OnShow – RAD Studio API Documentation
フォームが表示されたとき(フォームの Visible プロパティが true に設定されている場合)に発生します。
「表示されたときに発生します」という記述から、発生時点でフォームが表示されていると考えてしまうのですが、実際は「表示される直前に発生する」ようです。
ブレークポイントを張って1行づつ実行してみると、OnShow() が呼ばれた時点ではフォームが表示されず、OnShow()を抜けて次のメソッドでフォームが表示されます。このことから「フォームが表示された」ときではなく、「フォームが *表示されようとしているとき* に発生する」イベントと言えます。
Form::OnShow() では、フォームが表示された後にしたい処理ではなく、フォームを表示する直前にしたい処理を書くのが良いでしょう。
アプリの終了
フォームのタイトルバーにある「×」ボタンをクリックしてアプリを終了したときに発生するイベントの順序です。
Form::OnCloseQuery()
Form::OnClose()
Form::OnHide()
Form::OnDestroy()
終了時の詳細なログ
11/16(Sat).22:40:10 INFO FormCloseQuery()
11/16(Sat).22:40:10 INFO FormClose()
11/16(Sat).22:40:10 INFO ApplicationEvents1Message(hWnd:0x006810aa, message:0x000002a2(WM_NCMOUSELEAVE))
11/16(Sat).22:40:10 INFO FormHide()
11/16(Sat).22:40:10 INFO FormDestroy()
マウスでフォームの×を押したため WM_NCMOUSELEAVE が出ていますが、ApplicationEvents で他のイベントは捉えていません。終了するときはフォームのイベントだけ処理すれば良さそうです。
最小化
フォームのタイトルバーにある「ー」ボタンをクリックしてアプリを最初化したときに発生するイベントの順序です。
Form::OnCanResize()
Form::OnConstrainedResize()
Form::OnConstrainedResize()
Form::OnResize()
ApplicationEvents::OnMinimize()
ApplicationEvents::OnActivate()
ApplicationEvents::OnDeactivate()
ApplicationEvents::OnIdle()
最小化時の詳細なログ
11/16(Sat).22:42:09 INFO FormMouseActivate()
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x00211512, message:0x000000a1(WM_NCLBUTTONDOWN))
11/16(Sat).22:42:09 INFO FormCanResize()
11/16(Sat).22:42:09 INFO FormConstrainedResize()
11/16(Sat).22:42:09 INFO FormConstrainedResize()
11/16(Sat).22:42:09 INFO FormResize()
11/16(Sat).22:42:09 INFO ApplicationEvents1Minimize()
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x002a12de, message:0x0000b000)
11/16(Sat).22:42:09 INFO ApplicationEvents1Activate()
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x005d1110, message:0x00000060)
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x00211512, message:0x000002a2(WM_NCMOUSELEAVE))
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x005d1110, message:0x00000060)
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x002a12de, message:0x0000b001)
11/16(Sat).22:42:09 INFO ApplicationEvents1Deactivate()
11/16(Sat).22:42:09 INFO ApplicationEvents1Idle()
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x005d1110, message:0x00000060)
11/16(Sat).22:42:09 INFO ApplicationEvents1Idle()
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x00000000, message:0x00000113(WM_TIMER))
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x004d15ac, message:0x00000113(WM_TIMER))
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x001c157c, message:0x00000282(WM_IME_NOTIFY))
11/16(Sat).22:42:09 INFO ApplicationEvents1Idle()
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x00000000, message:0x00000113(WM_TIMER))
11/16(Sat).22:42:09 INFO ApplicationEvents1Idle()
11/16(Sat).22:42:09 INFO ApplicationEvents1Message(hWnd:0x0010163e, message:0x00000113(WM_TIMER))
11/16(Sat).22:42:09 INFO ApplicationEvents1Idle()
元に戻す
Windows タスクバーにあるアプリのアイコンクリックしてアプリを最初化から元に戻したときに発生するイベントの順序です。
ApplicationEvents::OnActivate()
ApplicationEvents::OnIdle()
Form::OnCanResize()
Form::OnConstrainedResize()
Form::OnConstrainedResize()
Form::OnResize()
ApplicationEvents::OnRestore()
Form::OnPaint()
ApplicationEvents::OnIdle()
元に戻す時の詳細なログ
11/16(Sat).22:44:35 INFO ApplicationEvents1Message(hWnd:0x00130f7e, message:0x0000b000)
11/16(Sat).22:44:35 INFO ApplicationEvents1Activate()
11/16(Sat).22:44:35 INFO ApplicationEvents1Idle()
11/16(Sat).22:44:35 INFO ApplicationEvents1Idle()
11/16(Sat).22:44:35 INFO ApplicationEvents1Message(hWnd:0x002d0a1e, message:0x00000112(WM_SYSCOMMAND))
11/16(Sat).22:44:35 INFO FormCanResize()
11/16(Sat).22:44:35 INFO FormConstrainedResize()
11/16(Sat).22:44:35 INFO FormConstrainedResize()
11/16(Sat).22:44:35 INFO FormResize()
11/16(Sat).22:44:35 INFO ApplicationEvents1Restore()
11/16(Sat).22:44:35 INFO ApplicationEvents1Message(hWnd:0x00130f7e, message:0x0000b01a)
11/16(Sat).22:44:35 INFO ApplicationEvents1Message(hWnd:0x002d0a1e, message:0x0000000f(WM_PAINT))
11/16(Sat).22:44:35 INFO FormPaint()
11/16(Sat).22:44:35 INFO ApplicationEvents1Idle()
もし最小化状態から元に戻したときに何か処理をしたい場合は、ApplicationEvents1Activate() で処理するのが良さそうです。FormActivate() や FormShow() は呼ばれませんでした。
コメント