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

C++/CLI Discussion :

Interrompre la fermeture du programme


Sujet :

C++/CLI

  1. #1
    Membre confirmé Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Par défaut Interrompre la fermeture du programme
    Bonjour,
    J'avais besoin d'un évènement qui se déclenchait quand on quitte le programme en appuyant sur le X en haut à droite. Je l'ai trouvé. J'utilise cet évènement pour afficher une boite de dialogue 'Toutes les données non enregistrées seront perdues. Continuer la fermeture ?' si il y a eu des modifications du document après enregistrement. Si l'utilisateur répond oui, pas de problèmes, le programme se coupe. Mais si il répond non, alors le programme ne se coupe pas, et fait comme si on n'avait pas appuyé sur le X.
    Et là ça coince : le programme se coupe coût que coûte.
    Y aurait-il une méthode/fonction qui permet d'annuler la fermeture du programme ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu dois t'être gouré d'événement.
    C'est WM_CLOSE (voire mieux, WM_SYSCOMMAND(SC_CLOSE)) qu'il faut intercepter, pas WM_DESTROY...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Par défaut
    OK, mais le hic, c'est que je ne peux pas utiliser les fonctions afx : je n'ai que la version Express de VC++. Donc je ne peux pas utiliser AfxGetMainWnd()->PostMessage (WM_SYSCOMMAND,SC_CLOSE, 0 ), ni tout ce qui commence par afx...

    Voici mon code actuel, c'est un évènement type "FormClosing".

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    private: System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
                 if (this->TriggersRedactionSpace->Text != "")
                 {
                     if (LastSavedTempFilePath != "")
                     {
                         System::IO::StreamReader ^sr = gcnew System::IO::StreamReader(LastSavedTempFilePath);
                         if (this->TriggersRedactionSpace->Text == sr->ReadToEnd())
                         {
                            sr->Close();
                            Application::Exit();
                         }
                         else
                         {
                             sr->Close();
                             BOOL MessageBeep(MB_ICONEXCLAMATION); 
                             if (MessageBox::Show("Les dernières modifications du document n'ont pas été enregistrées. Toutes les données non enregistrées seront perdues. Voulez-vous enregistrer votre document avant de quitter le programme ?", "Quitter sans sauvegarder", MessageBoxButtons::YesNo, MessageBoxIcon::Information) == System::Windows::Forms::DialogResult::Yes) 
                             {
                                 if (this->TriggersRedactionSpace->Text == sr->ReadToEnd())
                                 {
                                     System::IO::Stream ^s = this->EnregProjetActuel->OpenFile();
                                      System::IO::StreamWriter ^sw = gcnew System::IO::StreamWriter(s);
                                     sw->Write(this->TriggersRedactionSpace->Text);
                                     sw->Close();
                                 }
                                 else
                                 {
                                     SaveFileDialog^ EnregProjetActuel = gcnew SaveFileDialog;
     
                                     this->EnregProjetActuel->DefaultExt = L"h5t";
                                     this->EnregProjetActuel->Filter = L"Fichiers Heroes V Triggers (*.h5t)|*.h5t|Fichiers texte (*.txt)|*.txt|Tous les fichiers (*.*)|*.*";
                                     this->EnregProjetActuel->RestoreDirectory = true;
                                     this->EnregProjetActuel->Title = L"Enregistrer une liste de déclencheurs";
     
                                     if (this->EnregProjetActuel->ShowDialog() == System::Windows::Forms::DialogResult::OK)
                                     {
                                         System::IO::Stream ^s = this->EnregProjetActuel->OpenFile();
                                          System::IO::StreamWriter ^sw = gcnew System::IO::StreamWriter(s);
                                         sw->Write(this->TriggersRedactionSpace->Text);
                                         sw->Close();
                                         //Add in menu strip Recent Files
                                         LastSavedTempFilePath = this->EnregProjetActuel->FileName->ToString();
                                         if (this->videToolStripMenuItem->Text == "<vide>") 
                                             this->videToolStripMenuItem->Text = LastSavedTempFilePath;
                                         else
                                             if (this->videToolStripMenuItem1->Text == "<vide>") 
                                                 this->videToolStripMenuItem1->Text = LastSavedTempFilePath;
                                             else
                                                 if (this->videToolStripMenuItem2->Text == "<vide>") 
                                                     this->videToolStripMenuItem2->Text = LastSavedTempFilePath;
                                                 else
                                                     if (this->videToolStripMenuItem3->Text == "<vide>") 
                                                         this->videToolStripMenuItem3->Text = LastSavedTempFilePath;
                                                     else
                                                         if (this->videToolStripMenuItem4->Text == "<vide>") 
                                                             this->videToolStripMenuItem4->Text = LastSavedTempFilePath;
                                                         else
                                                             this->videToolStripMenuItem->Text = LastSavedTempFilePath;
     
                                          LastSavedTempFilePath->Replace("\\", "\\\\"); //So it can be used by the application
                                     }
                                 }
                         }
                         else
                            Application::Exit();
                     }
                 }
             }
         }
    Quand je l'utilise tel quel, je n'ai pas le temps d'enregistrer le document si l'utilisateur appuie sur Oui : VC++ m'indique comme erreur (ce qui est compréhensible) :

    Une exception non gérée du type 'System.ObjectDisposedException' s'est produite dans mscorlib.dll

    Informations supplémentaires : Impossible de lire à partir d'un TextReader fermé.

    C'est normal, la suite d'instruction n'a pas le temps de s'exécuter avant que le programme ne se ferme... d'où cette erreur, d'où mon besoin d'une fonction annulant la fermeture.
    Merci d'avance ^^

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je ne pensais pas à MFC, mais à Win32 tout court.

    La prochaîne fois, préviens que tu es en WinForms...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour empêcher la fermeture en Windows Forms, tu dois régler la propriété Cancel du FormClosingEventArgs à true.

    Et tu ne dois pas appeler Application::Exit(), le Form s'en charge.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre confirmé Avatar de Hemophilius
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 105
    Par défaut
    Merci beaucoup !

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/11/2006, 23h39
  2. Fermeture de programme
    Par janego dans le forum C++Builder
    Réponses: 2
    Dernier message: 31/07/2006, 19h06
  3. Fermeture du programme
    Par oasis_5 dans le forum Général Python
    Réponses: 11
    Dernier message: 08/03/2006, 11h28
  4. [c++] Plantage à la fermeture du programme
    Par Asmodean dans le forum C++
    Réponses: 5
    Dernier message: 21/02/2006, 13h20
  5. Réponses: 7
    Dernier message: 24/01/2005, 11h36

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