IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Comment fermer son application ?


Sujet :

Delphi

  1. #1
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut Comment fermer son application ?
    Bonjour,

    Voici le problème. Je veux que mon programme ne soit instancier qu'une fois et ça marche (voir le code de la faq). Ensuite j'ai voulu ajouter un système d'aide. J'ai donc ajouté la panoplie D6OnHelpFix.pas, hh.pas et hh_funcs.pas et c'est là que ça par en sucette.

    Quand je tente d'instancier mon appli une 2° fois, elle plante...Après avoir passer le "Exit", le debuggueur passe sur le dernier end du programme, et j'ai une exception. Quand je supprime D6OnHelpFix.pas, ça fonctionne parfaitement.

    J'ai pensé que ça venait de la fonction Exit qui n'était pas approprié, donc j'ai fait quelques tests et recherche mais sans succès.

    Peut être en aurez vous plus que moi ?

  2. #2
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    C'est peut être dans la section (si elle existe)

    de l'unité qu'il y a un truc qui ne vas pas ?

  3. #3
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    J'ai tenté un débuggage pas à pas, ça plante après avoir passé toutes les méthodes de libération des objets, sur un "end;", comme pour la plupart des problèmes de ce type là.

  4. #4
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Normalement on fait le controle du mutex avant le Application.initialize . Si je place un Exit juste avant le Application.Run, ça ne plante pas. Si je le place juste après le Application.initialize, ça plante.

    Niveau mémoire, c'est propre si je fait un exit juste avant le Application.Run ?

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    Pour ma part je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      if not FirstInstanceExists(True) then
      begin
        Application.Initialize;
        Application.CreateForm(TfMain, fMain);
        Application.Run;
      end;

  6. #6
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    bonjour
    @Linkin

    je viens d'essayer ton bout de code dans mon fichier.dpr, j'ai inséré 'windows' dans le Uses, à la compil le système me retourne
    [Erreur] fichier.dpr(33): Identificateur non déclaré : 'FirstInstanceExists'
    faut il insérer autre chose dans le uses?

    [D6/XP]
    merci

  7. #7
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    Excuse moi j'ai repris le code de la FAQ que j'ai modifié (vu que je l'utilise dans une unité commune.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    procedure ActivePreviousInstance;
    var ClassName: array[0..255] of char;
        Title: string;
        HandleTemp : HWND;
    begin
      Title := Application.Title;
      Application.Title := ''; { On change le titre, car on trouverait toujours une application lancée, (la notre). }
      try
        GetClassName(Application.Handle, ClassName, 255); { Met dans ClassName le nom de la classe de l'application. }
        HandleTemp := FindWindow(ClassName, PChar(Title)); { Renvoie le Handle de la 1ère fenêtre de Class (Type) ClassName, et le titre de l'application. }
      finally
        Application.Title := Title; { Restauration du vrai titre. }
      end;
      { Restaurer l'application si minimisée }
      ShowWindow(HandleTemp, SW_RESTORE);
      { Mettre la première instance en premier plan : }
      SetForegroundWindow(HandleTemp);
      { Fin de la deuxième instance }
    end;
     
    function FirstInstanceExists( ActivatePrevious : boolean) : boolean;
    begin
      SetLastError(NO_ERROR);
      CreateMutex (nil, False, PChar(Application.Title));
      if GetLastError = ERROR_ALREADY_EXISTS then
      begin
        if ActivatePrevious then
          ActivePreviousInstance;
     
        Result := True;
      end
      else
        Result := False;
    end;

  8. #8
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    rebonjour!

    j'ai repris le code de la FAQ et cette fois à la compil le système me retourne au niveau de la variable:
    [Erreur] fichier.dpr(32): Identificateur non déclaré : 'HANDLE'
    pourtant 'windows' est bien déclaré (en première position) dans le uses !!

    rappel pour info du code de la FAQ:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    program Project1;
    uses
      Windows, Forms,
      Unit1 in 'Unit1.pas' {Form1};
     
    {$R *.RES}
    var
      H : HANDLE;
    begin
      SetLastError(NO_ERROR);
      H := CreateMutex (nil, False, 'Nom de l application');
      if GetLastError = ERROR_ALREADY_EXISTS then Exit;
     
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
      CloseHandle(H);
    end.
    je vais voir ce que tu as modifié et, je suppose que ton code se trouve dans le .dpr (?)

    à plus

  9. #9
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    pour moi c'est ok
    j'ai remplacé 'HANDLE' par 'HWND' dans l'exemple de la FAQ et c'est correct
    (je ne maitrise pas encore les Handle)

    à plus!

  10. #10
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    Tu peux la déclarer en cardinal.

    Apparemment quand on a retransposé le code de la FAQ, la libération du handle a été retirée, je vais voir ça.

  11. #11
    Membre actif Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Points : 251
    Points
    251
    Par défaut
    Bonjour,

    C'est bien sympa messieur de partager vos astuces dans ce thread mais ça ne répond pas à ma question

    Personne pour m'aiguiller ?

Discussions similaires

  1. comment deployer son application avec install shield
    Par diden138 dans le forum Bases de données
    Réponses: 19
    Dernier message: 18/01/2007, 09h18
  2. Réponses: 3
    Dernier message: 20/10/2006, 17h43
  3. [VB.Net]Comment "partager" son application?
    Par eultartuffe dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/05/2006, 11h27
  4. [JAR] Comment déployer son application en incluant un jar ?
    Par david06600 dans le forum Général Java
    Réponses: 6
    Dernier message: 20/02/2006, 10h40
  5. Comment fermer l'application en même temps que Windows ?
    Par semaj_james dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2004, 22h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo