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

VB.NET Discussion :

Probleme procedure fermeture form [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut Probleme procedure fermeture form
    Bonjour, comme le titre l'indique j'ai décidé de faire un fonction pour fermer mes forms mais je galere un peu.

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        'Message personnalisé de chaque form
        Public Sub Fermeture(ByVal fr As Form, ByVal e As System.Windows.Forms.FormClosingEventArgs)
            If MessageBox.Show("Voulez-vous quitter " & fr.Name, ".:: DEMANDE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
                fr.Close()
            Else
                e.Cancel = True
            End If
        End Sub

    Quand je clic sur "non" de mon messagebox le form se ferme et sur "oui" sa boucle

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2011
    Messages : 33
    Par défaut
    Citation Envoyé par thomasaurelien Voir le message
    Quand je clic sur "non" de mon messagebox le form se ferme et sur "oui" sa boucle
    Quand tu dis que ça boucle tu veux dire que quand tu clique sur oui, ça n'arrête pas de d'afficher le message box?

  3. #3
    Membre éprouvé Avatar de thierry007
    Homme Profil pro
    Autodidacte
    Inscrit en
    Août 2006
    Messages
    876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2006
    Messages : 876
    Par défaut
    Bonjour

    Tu devrais traiter cela dans le Form_Closing

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      If MsgBox("Quitter sans enregistrer le modifications?...", MsgBoxStyle.YesNo) = MsgBoxResult.No Then e.Cancel = 1

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut probleme fonction fermeture
    oui je sais qu'il faut le placer dans form.closing mais je voudrais faire une fonction qui est appelé dans l'événement form.closing de chaque formulaire

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    Par défaut
    Enlève juste ton fr.close (ou remplace-le si tu veux par e.Cancel=False) et ça marchera.

    En fermeture de form, FormClosing est invoqué.
    Si e.Cancel=True, la fermeture est annulée et la form reste ouverte
    Si e.Cancel=False (et c'est le cas par défaut), la fermeture de la form s'effectue.

    Dans ton code, fr.Close a pour conséquence de rappeler à nouveau l'évènement FormClosing et donc... ben tu ne peux jamais fermer ta fenêtre.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vosges (Lorraine)

    Informations forums :
    Inscription : Août 2011
    Messages : 103
    Par défaut resolution fonction fermeture
    je viens de faire cela sa marche mais je sais pas si c'est le plus court :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Private Sub connection_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            If Fermeture(Me) Then
                e.Cancel = True
            End If
        End Sub
    et la fonction fermeture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       Public Function Fermeture(ByVal fr As Form)
            If MessageBox.Show("Voulez-vous quitter " & fr.Name, ".:: DEMANDE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
                Return False
            Else
                Return True
            End If
        End Function

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 104
    Par défaut
    Ca marche et c'est propre.

    Maintenant si la procédure Fermeture ne sert que pour l'évènement FormClosing, pourquoi ne pas mettre tout le code dans FormClosing ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Private Sub connection_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If MessageBox.Show("Voulez-vous quitter " & fr.Name, ".:: DEMANDE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
                e.Cancel = False 'Inutile mais bon ...
        Else
                e.Cancel = True
         End If
     End Sub

  8. #8
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Par défaut
    Bonjour,
    Citation Envoyé par thomasaurelien Voir le message
    je viens de faire cela sa marche mais je sais pas si c'est le plus court :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       Private Sub connection_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            If Fermeture(Me) Then
                e.Cancel = True
            End If
        End Sub
    et la fonction fermeture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       Public Function Fermeture(ByVal fr As Form)
            If MessageBox.Show("Voulez-vous quitter " & fr.Name, ".:: DEMANDE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
                Return False
            Else
                Return True
            End If
        End Function
    Tu peux effectivement simplifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Function Fermeture(ByVal fr As Form) As Boolean
            Return Not (MessageBox.Show("Voulez-vous quitter " & fr.Name, ".:: DEMANDE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes)
        End Function
     
       Private Sub connection_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
            e.Cancel = Fermeture(Me)
        End Sub
    A+, Hervé.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  9. #9
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thomasaurelien Voir le message
    oui je sais qu'il faut le placer dans form.closing mais je voudrais faire une fonction qui est appelé dans l'événement form.closing de chaque formulaire
    Pourquoi ne pas surcharger à ce moment ?

    Du crée une class "FormAMoi" qui hérite de "Form".
    => Tu override "OnClosing" pour poser la question.

    Et dans l'ensemble de ton projet, au lieu de créer des "Form", tu crées de "FormAMoi" et le tour est joué, bien plus proprement !

  10. #10
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Voici un exemple avec de l'héritage : (désolé, c'est du C#, j'aime pas le VB, c'est comme ça )

    La Form "MyForm" de laquel héritent toutes les Forms du projet :
    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
     
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
     
    namespace TestHeritageForm
    {
        public partial class MyForm : Form
        {
            /// <summary>
            /// Indique si la form possède des éléments à sauver lors de sa fermeture.
            /// </summary>
            protected bool TrucsASauver = false;
     
            public MyForm()
            {
                InitializeComponent();
            }
     
            protected override void OnClosing(CancelEventArgs e)
            {
                if (TrucsASauver)
                {
                    switch (MessageBox.Show("Voulez-vous sauvegarder avant de quitter ?", "Enregistrer", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1))
                    {
                        case System.Windows.Forms.DialogResult.Yes:
                            this.Save();
                            break;
                        case System.Windows.Forms.DialogResult.Cancel:
                            e.Cancel = true;
                            break;
                    }
                }
                else if (MessageBox.Show("Voulez-vous quitter ?", "Quitter", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == System.Windows.Forms.DialogResult.No)
                {
                    e.Cancel = true;
                }
                base.OnClosing(e);
            }
     
            /// <summary>
            /// Il n'y a pas de corps ici. Chaque classe fille devra implémenter sa propre méthode pour sauvegarder les données.
            /// </summary>
            protected virtual void Save()
            {
                // On pourrait faire ici des choses génériques, telles que la libération de ressources, etc.
                MessageBox.Show("Méthode Save de base. Nettoyage des ressources.");
            }
        }
    }
    Et la Form1, qui hérite de MyForm (mettre un TextBox dedans pour l'exemple) :
    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
     
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
     
    namespace TestHeritageForm
    {
        public partial class Form1 : MyForm
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
                if ((sender as TextBox).Text.Length > 0)
                {
                    base.TrucsASauver = true;
                }
                else
                {
                    base.TrucsASauver = false;
                }
            }
     
            protected override void Save()
            {
                MessageBox.Show(string.Format("Bon ben on fait une sauvegarde du texte \"{0}\" contenu dans la TextBox.", textBox1.Text));
                base.Save();
            }
        }
    }
    A noter aussi qu'une personne à écrit à un moment :
    A NE JAMAIS FAIRE !

    En effet, en VB, 1 = true. Sauf que dans tous les langages ANSI (c'est à dire pour ainsi dire tout sauf VB) 0 = true et n'importe quelle autre valeur = false.

    Ca s'appelle un nombre magique, et ça perturbe les développeurs qui repassent derrière.

    e.Cancel est un type bool, donc on utilise une variable bool et pas un int : true ou false.

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

Discussions similaires

  1. [Session]Problème de fermeture de session
    Par july dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 16/06/2005, 12h25
  2. [TP] Problème de fermeture Turbo Pascal
    Par Aezar dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 22/05/2005, 10h24
  3. [interbase6]probleme procedure stockee
    Par macadam314 dans le forum InterBase
    Réponses: 6
    Dernier message: 13/02/2005, 12h31
  4. probleme de connexion forms-oracle
    Par bargou dans le forum Oracle
    Réponses: 2
    Dernier message: 11/11/2004, 11h27
  5. [Linux] Probleme de fermeture de Sockets
    Par diefo dans le forum Réseau
    Réponses: 6
    Dernier message: 30/12/2003, 13h10

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