web-dev-qa-db-ja.com

デルファイアプリケーションを終了する適切な方法はどれですか?

私は他のコード行を実行せずにDelphiアプリケーションを終了したいのですが、これを行う適切な方法はどれなのか疑問に思っています。さらに、私が現在実際にやっていることに何か問題があるかどうかを知りたいです。基本的に、私のコードは次のようになります。

//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;

これはDelphiアプリケーションを停止する正しい方法ですか、それとも別の方法で行う必要がありますか?

18
Hwau

Application.Terminate()は、TApplication.Run()およびTForm.ShowModal()のメッセージループを中断し、メインスレッドを正常に終了させ、必要なクリーンアップなどを実行します。

Vcl.Forms.TApplication.Terminate

アプリケーションの実行を終了します。

プログラムでアプリケーションを終了するには、Terminateを呼び出します。アプリケーションオブジェクトを解放するのではなくTerminateを呼び出すことにより、アプリケーションが正常にシャットダウンすることを許可します

Terminateは、Windows API PostQuitMessage関数を呼び出して、アプリケーションの正常なシャットダウンを実行します。 Terminateは即時ではありません。Terminateは、WM_QUITメッセージおよびメインフォームが閉じられたときに自動的に呼び出されます。

一方、Halt()は即時の異常終了です。基本的に、プロセスをメモリからリッピングします。他のオプションが利用できない極端な状況でのみ使用してください。

System.Halt

プログラムの異常終了を開始します。

Haltはプログラムの異常終了を実行し、オペレーティングシステムに戻ります。

Delphiアプリケーションの正常終了を実行するには、グローバルTerminateオブジェクトでApplicationメソッドを呼び出します。アプリケーションがApplicationオブジェクトを提供するユニットを使用しない場合、メインProgramブロックからExitプロシージャを呼び出します。

31
Remy Lebeau

他のコードを実行せずにDelphiアプリケーションを終了したいと思います。

_Application.Terminate nor Haltはそれを達成します。前者は正常に終了します。多くのコードが実行されます。 Haltを呼び出すことはより期待できます。それは異常終了です。ただし、ユニットのファイナライズコードは実行されます。

できるだけ早く終了し、途中で最小限のコードを実行する場合は、 ExitProcess を呼び出します。これがHaltの最終ステップであり、ExitProcessを直接呼び出すことにより、Haltを呼び出す前にExitProcessが実行するすべてのステップを回避できます。

7
David Heffernan

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が実行する条件をチェックし、それらが満たされていないこと(ファイルが見つからないなど)、失礼なもの(そのため申し訳ありません)、私が欲しい/必要だという理由だけです。

1
Anonymous