他のコード行を実行せずに 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
オブジェクトでメソッドを呼び出します。アプリケーションがオブジェクトを提供するユニットを使用しない場合は、メインの Program ブロックからプロシージャをApplication
呼び出します。Exit
コードがメイン フォームの 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が実行される条件をチェックし、それらが満たされていないこと(ファイルの欠落など)、失礼なこと(申し訳ありません)を確認することです。