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

Langage Delphi Discussion :

Problème lors de la fermeture du programme


Sujet :

Langage Delphi

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 780
    Points : 5 537
    Points
    5 537
    Par défaut Problème lors de la fermeture du programme
    Bonjour,

    Je suis en train de corriger certains bogues d'une vieille application MDI et notamment le fait que lorsque je quitte le programme en ayant une fenêtre ouverte j'ai une violation d'accès.

    Je voulais résoudre le problème en utilisant ma procédure de fermeture de fenêtre tant que j'ai une fenêtre ouverte mais le programme tourne en boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TFrmStart.FichierQuitterClick(Sender: TObject);
    begin
      while (FrmStart.MDIChildCount > 0) do
      begin
        FrmStart.ActiveMDIChild.Close;
      end;
      Application.Terminate;
    end;
    J'ai mis un point d'arret pour regarder ce qui se passe mais le count ne se décrémente pas, ce qui parait normal vu que la fenêtre ne se ferme pas.

    Le code suivant fonctionne sur toutes mes fenêtres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TFrmStart.FichierFermerClick(Sender: TObject);
    begin
      If ((FrmStart.MDIChildCount)>0) then
        FrmStart.ActiveMDIChild.Close;
     
    end;
    Je ne comprend pas pourquoi lorsque je remplace la condition par une itération cela ne fonctionne plus.

    La réponse est peut-être toute bête mais je ne la connais pas.
    Si vous pouvez éclairer ma lanterne...

    Merci

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    Tout dépend de la façon à laquel vous vous y prenez pour créer vos forme...

    Pour libérer correctement une fenêtre, rendez-vous dans l'évènement OnClose de la fenêtre à libéré.

    Ajoutez tout simplement ceci

    Quand vous allez fermer celle-ci, elle va être libéré entièrement.

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 780
    Points : 5 537
    Points
    5 537
    Par défaut
    Citation Envoyé par pepi22 Voir le message
    Tout dépend de la façon à laquel vous vous y prenez pour créer vos forme...

    Pour libérer correctement une fenêtre, rendez-vous dans l'évènement OnClose de la fenêtre à libéré.

    Ajoutez tout simplement ceci

    Quand vous allez fermer celle-ci, elle va être libéré entièrement.

    Ce n'est pas ça, toutes mes fenêtre contiennent un OnClose avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Action := caFree;
    MaForm := nil;

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 203
    Points : 146
    Points
    146
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FrmStart.ActiveMDIChild.Close;
    Je n'ai pas remarqué plus tôt mais si la fenêtre n'est pas active, elle ne sera jamais fermé

    Vous devriez utilisé plutôt utiliser

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FrmStart.MdiChildren[i].Close
    Avec un boucle for qui débute à 0 et qui fini à FrmStart.MdiChildCount - 1

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 815
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 815
    Points : 13 531
    Points
    13 531
    Par défaut
    Ce que dit Pepi me semble correct.

    Maintenant s'il y a une violation d'accès, c'est qu'il y a:
    1. soit une double tentative de destruction. Par exemple une fois par le Owner et une fois manuellement.
    2. Soit que la MDIForm à déjà été détruite.

    Par exemple, si tu as mis un TMDIChild.Create(Application), la MDIForm risque bien d'être détruite avant les MDIChildren. Cela devrait de toute façon être remplacé par TMDIChild.Create(MDIForm) et tu n'aurais ainsi même plus besoin de t'occuper de leur destruction.

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 780
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 780
    Points : 5 537
    Points
    5 537
    Par défaut
    Andnotor, en fait la violation d'accès n'est que le résultat du Ctrl+Alt+Suppr, j'aurais du le préciser, désolé.

    pepi22, je ne comprend pas pourquoi je n'y est pas pensé moi même. Je devais complétement dans les vaps ce jour là. En effet, cela me parait être une excellente solution. Je la teste dès ce soir.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème lors de la fermeture de Windows media player
    Par acacia dans le forum Windows XP
    Réponses: 4
    Dernier message: 01/07/2009, 15h27
  2. problème lors de l'exécution de programme
    Par annesophiedecar dans le forum Linux
    Réponses: 1
    Dernier message: 14/05/2009, 01h48
  3. Problème lors de la fermeture automatique d'excel
    Par tasse2the dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 02/04/2009, 07h22
  4. Problème lors de la fermeture de mon MsRdpClient
    Par seb.49 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 10/01/2008, 08h47
  5. Réponses: 6
    Dernier message: 12/12/2007, 19h32

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