多くのフォームを持つマルチスレッド アプリケーションを使用していますが、フォームを作成する前にいくつかのクラスをインスタンス化し、いくつかの初期化を呼び出す必要があります。もちろん、対応するファイナライズ コードを実行する必要があります。
.dpr ファイルの簡単な例を次に示します。
begin // .dpr project file
LoadDlls;
try
Config := TConfig.Create;
try
Application.Initialize;
Application.Title := 'Foo';
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TOtherForm, OtherForm);
//...other forms...
Application.Run;
finally
Config.Free;
end;
finally
UnloadDlls;
end;
end;
ここでの問題は、ブロック内のコードがフォームの/のfinally
前に実行されることです。unitのセクションを見ると、これは明らかです。OnDestroy
destructor
finalization
Form
finalization
if Application <> nil then DoneApplication;
そして、所有しているすべてのフォームを効果的に解放するDoneApplication
呼び出し。Application.DestroyComponents
Application
したがって、で作成されたフォームは、メインブロックApplication.CreateForm
内のコードの後で破棄されます。begin..end
私が望むのは、Application.Run
すべてのフォームが破棄された後、それらのOnDestroy
イベント ハンドラーがConfig
、DLL で定義されたオブジェクトと外部関数を認識できるようにすることです。例外が発生した場合も同様です。しかし、標準のアプリケーションの例外処理 ifConfig.Free
またはUnlodDlls
raise も必要です (アプリケーションはまだ存在している必要があります)。
ご了承ください:
- コードをより明確にしてデバッグ可能に保つために、ブロックを使用しない
finalization
ことをお勧めします (.dpr で可能でしょうか?)。 - 今のところ、あまり多くのコードを変更したくない (例: 動的にフォームを作成する)
Application.DestroyComponents
最も簡単な解決策は、 afterを明示的に呼び出すことだと思いますApplication.Run
。デメリットはあると思いますか?よりエレガントなソリューションはありますか?
ありがとうございました