掲示板などの質問を見ていると、初期化処理を行うイベントに不適切なイベントを使用して、はまっているのを見かけます。
そこで、アプリケーションを起動したときのイベントを整理してみます。
メンバ関数が呼ばれる順番
アプリケーションが起動したときに、メインフォームのメンバ関数が呼ばれる順番は次のようになります。
(C++Builder 2010で確認しました。)
コンストラクタ -> OnCreate -> OnShow -> OnActivate -> OnResize -> OnPaint -> …
コンストラクタ
一番最初に呼ばれるのはコンストラクタです。
フォーム上のコンポーネントにもアクセスできます。
基本的な初期化処理はここで行います。
OnCreate
C++Builderでは、OnCreateイベントの使用は推奨されていません。
代わりにコンストラクタを使用します。
- Forms.TCustomForm.OnCreate – RAD Studio VCL Documentation (Japanese)
- Forms.TCustomForm.OldCreateOrder – RAD Studio VCL Documentation (Japanese)
OnShow
フォームが表示されるときに呼ばれます。
アプリケーション起動時の他に、フォームのVisibleプロパティがtrueになったときやShowメソッドが呼ばれます。
起動時に一度だけ行う処理を記述するには、不適です。
OnActivate
OnActiveイベントは、フォームがフォーカスを受け取ったときに呼ばれます。
OnPaint
OnPaintイベントは、フォームが再描画されたときに呼ばれます。
OnResize
OnResizeは、コントロールのサイズが変更された直後に発生します。
起動後もフォームのサイズが変更されるたびに呼ばれます。
TApplicationEvents::OnIdle
TApplicationEvents::OnIdleイベントは、アプリケーションがアイドル状態になったときに呼ばれます。
アプリケーションの起動時では、アプリケーションの起動時の処理を一通り終えて、フォームが表示された後に呼ばれます。
コンストラクタ -> OnCreate -> OnShow -> OnActivate -> OnResize -> TApplicationEvents::OnIdle
このイベントを上手に活用することで、フォームの初期化処理が楽になります。
まとめ
起動時の初期化処理を行う場所はは、メインフォームのコンストラクタとTApplicationEvents::OnIdleイベントを使い分けるといいでしょう。