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 397
    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 397
    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 397
    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 397
    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 397
    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 397
    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