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 :

Comment transformer le click sur la croix de fermeture d'une form


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut Comment transformer le click sur la croix de fermeture d'une form
    Bonjour

    Lorsque l'utilisateur de mon appli clique sur sur la croix de fermeture d'une form, j'utilise le code suivant pour capturer l'évènement, effectuer quelques modification de la form puis la masquer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Sub Form_Cancel(ByVal sender As System.Object, _
    ByVal e As System.ComponentModel.CancelEventArgs) _
    Handles MyBase.FormClosing
     
     e.Cancel = True
    '
    'Quelques modifications de la form
    '
    Me.Hide
     
    End Sub
    Le problème est que je dois aussi masquer cette form avec un bouton Ok : Me.Hide

    Je constate que la Sub Form_Cancel se déclenche aussi lors du click sur OK.

    Comment faire autrement ?

    Merci.

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Le bouton OK n'aurai pas un DialogResult différent de None (cf propriétés) ?

    Sinon, vu que je suis pas sur de ton message, si tu interceptes la fermeture tu peut appeler dans OK la fonction this.Close(); ...

    Enfin, si c'est ni l'un ni l'autre, j'ai pas compris ce que tu veux

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut
    Non, pas de problèmes avec le dialogresult du bouton OK.

    En fait, je ne comprends pas pourquoi un hide sur la form déclenche aussi la Sub Form_cancel précédemment citée (qui intercepte la fermeture par un click sur la croix).

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Ah ...

    Bah là il y a un problème, chez moi ça ne le fais pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void button1_Click(object sender, EventArgs e)
            {
                Hide();
            }
     
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
            {
                e.Cancel = true;
            }
    FormClosing n'est pas appelé via le button ...
    Par contre, pour tu as un CancelEventArgs pour FormClosing ? ça devrais être un FormClosingEventArgs ... regarde ici :
    http://msdn.microsoft.com/fr-fr/libr...rmclosing.aspx

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut
    Merci pour la proposition.

    Nouveau test avec le code proposé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Form_Cancel(ByVal sender As System.Object, _
    ByVal e As FormClosingEventArgs) _
    Handles Me.FormClosing
            e.Cancel = True
    End Sub
    Résultat : Pareil.
    Un Hide sur la form déclenche de nouveau la sub (plusieurs essais).

    Je pige pas.

    Autre proposition ?

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    J'arrive pas à reproduire ...
    Tu as quelle version du .NET ? Tu programmes avec quel version ds VS ?
    Est-ce que tu as modifié certaines propriétés de ta form ? rajouté des styles ?
    Qu'est-ce que tu fais de spécial sur ta form ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut
    Je travaille avec le framework 2.
    J'utilise visual studio 2008 SP1.
    J'ai fait le test sans aucune modification des propriétés de la form.
    Aucun nouveau style. Un projet tout neuf.

    Pour savoir si la sub Form_Cancel se déclenche après un click sur le bouton OK (me.hide), je modifie juste le texte d'un label sur la form.
    Ca donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class Form2
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Me.Hide()
        End Sub
     
        Private Sub Form_Cancel(ByVal sender As System.Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
            e.Cancel = True
            Label1.Text = Label1.Text & "Sub Form_cancel déclenchée"
        End Sub
     
    End Class
    A chaque click sur OK, le label rajoute un "Sub Form_Cancel déclenchée" : le hide déclenche donc bien le sub.

    (J'utilise une première form1 de base avec un bouton affiche form2 pour réafficher la fenêtre concernée).

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    J'arrive enfin à reproduire.
    Je pense que ça vient du fait que Form2 doit être affiché avec ShowDialog (dans ce cas le comportement que tu décris est vérifié) mais lorsque j'utilise Show ou que je met le code dans Form1 alors le comportement que tu décris n'est pas reproduit.

    Bien que je ne puisse pas justifier le comportement observé, lorsque l'on quitte Form2 avec Me.Hide, dans FormCancel e.CloseReason vaut CloseReason.None, alors que quand on clique sur la croix, e.CloseReason vaut CloseReason.UserClosing. Tu pourrai donc t'en servir pour différencier les deux scénario.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut
    Merci beaucoup Smyley

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      Private Sub Form_Cancel(ByVal sender As System.Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
     
            If e.CloseReason = CloseReason.None Then
                Exit Sub
            ElseIf e.CloseReason = CloseReason.UserClosing Then
                e.Cancel = True
                Label3.Text = Label3.Text & "déclenché"
            End If
     
        End Sub
    Voilà, seulement, le comportement est alors assez étrange :

    Si on clique sur OK (me.hide) ca fonctionne bien.
    Si on clique sur OK après avoir cliqué sur la croix, ça reproduit le comportement décrit précédemment.

    Quand ça veut pas, ça veut pas.

    Il ne me reste plus qu'à virer le controlbox. Je vois pas autre chose car il faut absolument que ma fenêtre reste ouverte : je fais communiquer mes formulaires.

  10. #10
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    ...................

    Essayes ça :
    Code vb : 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
    Public Class Form2
        Private buttonClosing As Boolean = False
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            buttonClosing = True
            Me.Hide()
        End Sub
     
        Private Sub Form_Cancel(ByVal sender As System.Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
            If buttonClosing Then
                Exit Sub
            Else
                e.Cancel = True
                Label3.Text = Label3.Text & "déclenché"
            End If
        End Sub
    End Class

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut
    Oui, ca je l'ai déjà testé. Ca fonctionne bien à condition de replacer la variable à False après.

    Le soucis est qu'à la fin de mon sub form_cancel je veux aussi placer un hide. Voir mon premier post.

    Donc, même si je réussi à intercepter un hide venant du bouton Ok, je ne parviens toujours pas à intercepter celui qui provient de la sub elle-même.

    Avec un second bollean bien placé ca devrait marcher. C'est tout de même un peu le bazard tout ça.

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Code vb : 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
     
    Public Class Form2
        Private buttonClosing As Boolean = False
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            buttonClosing = True
            Close()
        End Sub
     
        Private Sub Form_Cancel(ByVal sender As System.Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
     
            e.Cancel = True
     
            If Not buttonClosing Then
                Label3.Text = Label3.Text & "déclenché"
     
                buttonClosing = False
            End If
     
            Visible = False
        End Sub
    End Class
    ?

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut
    Je mettrai plutot le buttonclosing=false à l'extérieur sinon ca ne reinitialise pas après un click sur OK.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        Private Sub Form_Cancel(ByVal sender As System.Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
     
            e.Cancel = True
     
            If Not buttonClosing Then
                Label1.Text = Label1.Text & "déclenché"
            End If
            buttonClosing = False
     
            Visible = False
        End Sub
    Mais ca ne fonctionne pas non plus.

    Cette fichue sub se déclenche aussi avec le changement de la propriété visible ! Un clic initial sur la croix=>déclenché déclenché

    Click sur Ok -> buttonclosing=false->visible=false->la sub se déclenche de nouveau avec buttonclosing=false->"déclenché".

  14. #14
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Code vb : 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
     
    Public Class Form2
        Private buttonClosing As Boolean = False
     
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            buttonClosing = True
            Close()
        End Sub
     
        Private Sub Form_Cancel(ByVal sender As System.Object, ByVal e As FormClosingEventArgs) Handles Me.FormClosing
     
            e.Cancel = True
     
            If Visible Then
                If Not buttonClosing Then
                    Label3.Text = Label3.Text & "déclenché"
                End If
                buttonClosing = False
     
                Visible = False
            End If
        End Sub
    End Class
    ?

    ça commence à me ...

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut
    Moi aussi. Je continue demain.

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 77
    Points : 60
    Points
    60
    Par défaut
    Ca y est, ça marche.

    But du code obtenu : Masquer une form si click sur bouton OK ou sur cancel (croix) et permettre un traitement différent des deux actions.

    Difficulté : Capturer uniquement l'action sur la croix.

    Merci beaucoup à Smyley.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/05/2010, 15h52
  2. Supprimer la croix de fermeture dans une Form
    Par lio33 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 03/07/2008, 16h04
  3. Réponses: 19
    Dernier message: 15/05/2006, 16h50
  4. Réponses: 4
    Dernier message: 25/07/2005, 14h24

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