Je souhaite terminer une application Delphi sans exécuter aucune autre ligne de code et je me demande quelle est la meilleure façon de procéder. De plus, j'aimerais savoir s'il y a quelque chose qui ne va pas dans ce que je suis en train de faire… .. En gros, mon code ressemble à ceci:
//Freeing all objects (Obj1.Free, etc..)
Application.Terminate;
Halt;
Est-ce la bonne façon d'arrêter une application Delphi ou cela devrait-il être fait d'une autre manière?
Application.Terminate()
interrompt les boucles de message dans TApplication.Run()
et TForm.ShowModal()
, permettant ainsi au thread principal de se terminer normalement, d'effectuer les nettoyages nécessaires, etc.
Vcl.Forms.TApplication.Terminate
Termine l'exécution de l'application.
Appelez
Terminate
pour mettre fin à l'application par programme. En appelantTerminate
au lieu de libérer l'objet d'application, vous permettez à l'application de fermer de manière ordonnée.
Terminate
appelle la fonction Windows APIPostQuitMessage
pour exécuter un arrêt ordonné de l'application.Terminate
n'est pas immédiat.Terminate
est appelée automatiquement sur un message WM_QUIT et à la fermeture du formulaire principal.
Halt()
, en revanche, est une terminaison immédiate et anormale. Fondamentalement, extraire le processus de la mémoire. Utilisez-le uniquement dans des situations extrêmes où aucune autre option n'est disponible.
Initie la terminaison anormale d'un programme.
Halt effectue une terminaison anormale d'un programme et retourne au système d'exploitation.
Pour effectuer une terminaison normale d'une application Delphi, appelez la méthode
Terminate
sur l'objet globalApplication
. Si l'application n'utilise pas une unité fournissant un objetApplication
, appelez la procédureExit
à partir du bloc principal du programme.
Je souhaite terminer une application Delphi sans exécuter aucun autre code.
Ni Application.Terminate
ni Halt
n'y parviendront. Le premier effectue une terminaison ordonnée. Beaucoup de code s'exécutera. Appeler Halt
est plus prometteur. C'est une fin anormale. Mais le code de finalisation de l'unité est exécuté.
Si vous souhaitez quitter le plus rapidement possible, en exécutant un minimum de code, appelez ExitProcess
. C'est l'étape finale de Halt
et en appelant ExitProcess
directement, vous évitez toutes les étapes que Halt
prend avant d'appeler ExitProcess
.
Juste pour laisser un point sur un problème supplémentaire si le code doit être sur la forme principale OnCreate.
Essayez ce code sur l'événement Main Form OnCreate. Cela ne fonctionne pas comme prévu, le formulaire principal est affiché, puis l'application est terminée.
Pour pouvoir le voir, ajoutez un autre formulaire et mettez une longue boucle sur sa création.
Il semble que tous les Application.CreateForm
sur la source de projet principale sont exécutés.
Exemple de code:
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;
Avec ce code, les messages [1] et [3] sont toujours affichés.
La seule façon de ne pas montrer [3] est d'appeler Halt.
Remarque: Pourquoi un tel code sur MainForm OnCreate? La réponse simple pourrait être, les conditions de vérification exe à exécuter et à voir qu'elles ne sont pas remplies (fichiers manquants, etc.), impolies (désolé pour cela), juste parce que je veux/dois.