ども、Norimakiです。
今回はDelphiのプロジェクトファイルについてです。
Delphiの流儀としてはフォームにコンポーネントを置いて、
そのコンポーネントのイベントハンドラにコードを書く。
という形になっているので、プロジェクトファイルに
コードを書く人はあまりいないのではないかと。
そう思ったりします。
僕も以前はそのような形でコードを書いていたんですが、
あるレポートでプロジェクトファイルにコードを記述して処理する。
という方法が紹介されていました。
たしか「フォーム依存の開発からの脱却」というレポートだったはず。
2005年のレポートです。僕の開発スタイルを大きく変えた衝撃的なレポートでした。
そのレポートの中に、プロジェクトファイルを書き換えてみよう。
的な部分があったんですが、
プロジェクトファイルにコードなんて書けるのかよ。
なんて思ったもんです。
でも今では、そのレポートのおかげでプロジェクトファイルの中に
アプリケーション初期化時・終了時に必要な処理を書いています。
具体的にはこんな感じ。
//-----------------------
// メモリリーク報告処理
//-----------------------
{$WARN SYMBOL_PLATFORM OFF}
ReportMemoryLeaksOnShutdown:=DebugHook<>0;
{$WARN SYMBOL_PLATFORM ON}
//-----------------------
// 初期設定
//-----------------------
Application.Initialize;
Application.MainFormOnTaskbar := False;
//--------------------------------------
//(スタートアップチェック)
// GP_SetApplicationSetting;
// NP_ApplicationInit;
//--------------------------------------
if GP_StartUpCheck then begin
//----------------------------
// フォームを生成
//----------------------------
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TfrmAbout, frmAbout);
Application.CreateForm(TfrmChangeUser, frmChangeUser);
//--------------------------------------
//(アプリケーション開始処理)
// ・BeforeRunnning
// ・スプラッシュフォーム表示
// ・イベントマネージャからのイベント呼出
// ・etAppInit
// ・etAppInitLoad
// ・etAppInitLoaded
// ・スプラッシュフォーム非表示
//--------------------------------------
GP_Init;
//----------------------------
// アプリケーション実行
//----------------------------
Application.Run;
//--------------------------------------
//(アプリケーション終了処理)
// ・イベントマネージャからのイベント呼出
// ・etAppFinPreSave
// ・etAppFinSave
// ・etAppFin
// ・AfterRunnning
//--------------------------------------
GP_Fin;
end else NP_DisplaySystemError;
//-------------------------------------
//(アプリケーション終了処理2)
// GP_ApplicationFin
// NP_ApplicationFin
//-------------------------------------
GP_Finalize;
ちょいと説明すると、ここ(プロジェクトファイル)で呼ばれている関数は以下の通りです。
・GP_StartUpCheck
・GP_Init
・GP_Fin
・GP_Finalize
これらの関数はプロジェクトファイルに別途記述することになります。
詳細は改めて書きたいと思います。
GP_StartUpCheckはスタートアップチェックです。
試用期間があるなら試用期間が経過しているかどうかのチェックなどをします。
ここで、アプリケーションを起動して良いかどうかの判断をします。
GP_Initはアプリケーション起動が許可されれば最初に呼ばれる部分です。
フォーム生成後に呼ばれていますので、この関数内では全てのフォームに
アクセスできます。
必要なファイルの読み込みなどもこの部分で行うことになると思います。
GP_Finはアプリケーション終了時に呼ばれる部分です。
アプリケーションで使用したデータなどを保存する処理などを記述したりします。
GP_Finalizeはアプリケーションが起動したかどうかにかかわらず、
すべての最終処理を行います。
GP_StartUpCheckで起動チェックを行いますが、
その際に、アプリケーションが起動が許可されればGP_InitとGP_Finが
呼ばれることになります。
仮に、GP_InitとGP_Finが呼ばれなかったとしても、
GP_Finalizeは必ず呼ばれるので、最終処理に必ず必要な処理は
GP_Finalizeに書くことになると思います。
という感じで、プロジェクトファイルにコードを記述しておきます。
スタートアップチェックで起動が許可されなかった場場合は
システムエラー表示処理を呼んであげると親切かと(NP_DisplaySystemError)。
で、後は、これをリポジトリに登録しておいて、
アプリケーションを新規に作成する際は、これを呼び出すと。
そういうことで、アプリケーション作成開始時の定型処理は
リポジトリに登録して効率化できますよと。
そういう話でした。
ではでは。
Norimakiでした。
こちらの記事もどうぞ。
>> Delphiのプロジェクトファイルをいじる その2
>> プロジェクトをリポジトリに追加する場合に注意すること