web-dev-qa-db-fra.com

Quel est le bon moyen de mettre fin à une application Delphi?

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? 

13
Hwau

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 appelant Terminate 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 API PostQuitMessage 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.

System.Halt

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 global Application. Si l'application n'utilise pas une unité fournissant un objet Application, appelez la procédure Exit à partir du bloc principal du programme.

26
Remy Lebeau

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

6
David Heffernan

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.

1
Anonymous