私は他のコード行を実行せずにDelphiアプリケーションを終了したいのですが、これを行う適切な方法はどれなのか疑問に思っています。さらに、私が現在実際にやっていることに何か問題があるかどうかを知りたいです。基本的に、私のコードは次のようになります。
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
これはDelphiアプリケーションを停止する正しい方法ですか、それとも別の方法で行う必要がありますか?
Application.Terminate()
は、TApplication.Run()
およびTForm.ShowModal()
のメッセージループを中断し、メインスレッドを正常に終了させ、必要なクリーンアップなどを実行します。
Vcl.Forms.TApplication.Terminate
アプリケーションの実行を終了します。
プログラムでアプリケーションを終了するには、
Terminate
を呼び出します。アプリケーションオブジェクトを解放するのではなくTerminate
を呼び出すことにより、アプリケーションが正常にシャットダウンすることを許可します。
Terminate
は、Windows APIPostQuitMessage
関数を呼び出して、アプリケーションの正常なシャットダウンを実行します。Terminate
は即時ではありません。Terminate
は、WM_QUITメッセージおよびメインフォームが閉じられたときに自動的に呼び出されます。
一方、Halt()
は即時の異常終了です。基本的に、プロセスをメモリからリッピングします。他のオプションが利用できない極端な状況でのみ使用してください。
プログラムの異常終了を開始します。
Haltはプログラムの異常終了を実行し、オペレーティングシステムに戻ります。
Delphiアプリケーションの正常終了を実行するには、グローバル
Terminate
オブジェクトでApplication
メソッドを呼び出します。アプリケーションがApplication
オブジェクトを提供するユニットを使用しない場合、メインProgramブロックからExit
プロシージャを呼び出します。
他のコードを実行せずにDelphiアプリケーションを終了したいと思います。
_Application.Terminate
nor Halt
はそれを達成します。前者は正常に終了します。多くのコードが実行されます。 Halt
を呼び出すことはより期待できます。それは異常終了です。ただし、ユニットのファイナライズコードは実行されます。
できるだけ早く終了し、途中で最小限のコードを実行する場合は、 ExitProcess
を呼び出します。これがHalt
の最終ステップであり、ExitProcess
を直接呼び出すことにより、Halt
を呼び出す前にExitProcess
が実行するすべてのステップを回避できます。
OnCreateのメインフォーム上にコードが必要な場合に、余分な問題についてポイントを残すためです。
メインフォームのOnCreateイベントでこのようなコードを試してください。期待どおりに動作せず、メインフォームが表示され、アプリケーションが終了します。
表示するには、別のフォームを追加し、その作成に長いループを追加します。
すべてのApplication.CreateForm
メインプロジェクトソースで実行されます。
サンプルコード:
procedure TMyMainForm.FormCreate(Sender: TObject);
begin
ShowMessage('[1] This must allways be shown');
if mrOK=MessageDlg('Exit?',mtConfirmation,[mbOK,mbCancel],0)
then begin
Application.Terminate;
Exit;
end;
ShowMessage('[2] This must not allways be shown');
end;
procedure TMyOtherForm.FormCreate(Sender: TObject);
begin
ShowMessage('[3] This must not allways be shown');
end;
そのコードでは、[1]と[3]が常に表示されます。
[3]を表示しない唯一の方法は、Haltを呼び出すことです。
注:MainForm OnCreateでこのようなコードを使用する理由は何ですか?単純な答えは、exeが実行する条件をチェックし、それらが満たされていないこと(ファイルが見つからないなど)、失礼なもの(そのため申し訳ありません)、私が欲しい/必要だという理由だけです。