24

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

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

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

4

4 に答える 4

38

Application.Terminate()と のメッセージ ループを中断し、メイン スレッドが正常に終了しTApplication.Run()たりTForm.ShowModal()、必要なクリーンアップを実行したりできるようにします。

Vcl.Forms.TApplication.Terminate

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

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

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

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

System.Halt

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

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

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

于 2015-05-23T17:36:33.300 に答える
1

コードがメイン フォームの 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が実行される条件をチェックし、それらが満たされていないこと(ファイルの欠落など)、失礼なこと(申し訳ありません)を確認することです。

于 2016-04-28T07:18:38.087 に答える