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 :

Click et Double click sur un bouton


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut Click et Double click sur un bouton
    Bonjour,

    J'ai un formulaire principal qui a des boutons qui lancent des formulaires secondaires.

    Ce que je voudrais, c'est que lorsqu'on "s'énerve" sur un bouton (certains formulaires secondaires mettent un peu de temps pour s'afficher) cela ne lance pas X affichages du formulaire secondaire associé.

    J'ai essayé de mettre mon bouton "enable= false" sur un click et de ne le remettre enable que lorsque le formulaire secondaire associé est affiché, mais ça ne marche pas (y compris quand je teste le enable dans le click évènement), c'est comme si vb.net mémorisait les X clicks et les réactivaient après lorsque le enable re-devient vrai.

    J'ai aussi essayé de tester le e.clicks=1 dans l'événement mouse-up: marche pas, ça me lance X formulaires secondaires.

    Le pire, c'est que quand je mets du code dans l'événement Double-click du bouton et que je colle un point d'arrêt dessus pour voir quand j'y passe, je n'ai pas l'air de passer dedans???

    Quelqu'un a une idée?

  2. #2
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    A priori, l'approche enable=false est bonne. Peux-tu nous donner un peu de code histoire de voir s'il n'y a pas quelque chose qui cloche ?

  3. #3
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Bonjour dorinf,

    j'ai ça dans la programmation de l'écran principal
    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
     
        Private Sub ButtonVariables_Click(sender As Object, e As EventArgs) Handles ButtonVariables.Click
     
            If Me.ButtonVariables.Enabled Then
     
                Me.ButtonVariables.Enabled = False
     
                ' Afficher l'écran des Variables
                Dim Vari As New EcranVariables
     
                Vari.Show()
     
            End If
     
        End Sub
    et ça dans l'écran secondaire des variables:
    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
       Private Sub EcranVariables_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            ' Mise à jour des données sur chargement du formulaire
            Historique.Add(New ClassHistorique(Historique.Count + 1, True, "Ouverture Formulaire Variables "))
            Me.Text = "Variables " & NomAppli
            RechercheFormsActifs()
     
            ' Passage de la gestion graphique du DataGridViewVariables en doublebuffer, cela évite les pb de clignotement
            SetDoubleBuffered(Me.DataGridViewVariables)
     
            ' Pour forcer en regular la police par défaut, sinon je ne sais pas pourquoi, le paramètre passe en Bold quand je passe par l'interface graphique des propriétés
            Me.DataGridViewVariables.DefaultCellStyle.Font = New Font(Me.DataGridViewVariables.DefaultCellStyle.Font.Name, Me.DataGridViewVariables.DefaultCellStyle.Font.Size, FontStyle.Regular)
     
            Demarrage = True
            Me.ToolStripComboBoxValeur.SelectedIndex = 0
     
            ' Mise à jour des données du DGV
            Me.BindingSourceVariables.DataSource = MesDonnees
            MaJDonneesDGV()
            MaJTailleForm()
            Demarrage = False
     
            EcranPrincipal.ButtonVariables.Enabled = True
     
        End Sub
    Quand je clique sur le bouton, je vois bien ce dernier passer en inactif tant que le formulaire secondaire n'est pas fini d'afficher (c'est MAJDonneesDGV() qui prend du temps mais j'ai besoin de le laisser là).

    Par contre si je double click (ou genre megas clicks sur le bouton) pendant qu'il n'est pas enable, dès qu'il redevient enable, l'ensemble des click ont l'air d'être mémorisés et X formulaires s'ouvrent.

    Moi ce que je cherche à avoir, c'est bien de pouvoir ouvrir X fois mon formulaire secondaire, mais d'inhiber les doubkes click pour que l'ouverture de plusieurs instances soit une action voulue et non pas un problème de bête réflexe du double click.

    A la base mon idée était de gérer un e.cancel dans le double click, mais ça n'a pas l'air d'exister pour l'événement double click (ni click d'ailleur)...

  4. #4
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    D'accord, merci. Je pense maintenant avoir cerné le problème.

    Une interface graphique comme Winform est gérée via une boucle d'événements. Dès qu'il se passe quelque chose (la souris bouge, un clic, un appui clavier), l'événement correspondant est mise en file d'attente. Cette file d'attente est ensuite traité par la boucle d'événements, élément par élément.

    Ce qui se passe ici, c'est :
    1. Lorsque tu cliques une première fois, un événement est mis en liste d'attente. Il est traité par la boucle d'événement qui va appeler le callback associé à ton bouton, à savoir ButtonVariables_Click
    2. Tu désactives ton bouton (enable = false)
    3. Tu affiches ton formulaire (Vari.Show())
    4. Comme c'est long, tu recliques
    5. Une fois affiché, tu réactives le bouton
    6. Tes clics sont traités


    Le point important ici est le point 3. Lorsque tu affiches ton formulaire, tu es toujours dans la boucle d'événement du premier clic de ton bouton. Aussi, à l'étape 4, lorsque tu cliques sur ton bouton, les événements ne peuvent pas être traités (il y a déjà un événement dans la boucle d'événements puisque tu es dedans !). Ils sont donc mis dans la file d'attente. Comme à la fin de ton traitement, tu réactives le bouton, lorsque le traitement sera terminé, la liste d'attente des événements va être traitée. D'où les clics supplémentaires.

    Lorsque tu as un traitement long, il est recommandé de ne pas le faire dans la boucle d'événement, car tu bloques ainsi ton interface graphique pendant tout le temps du traitement.

    Pour résoudre le problème, tu peux essayer d'utiliser un BackgroundWorker pour ouvrir ton formulaire (car apparemment, tu ne peux pas déplacer l'appel MaJDonneesDGV() ailleurs). Tu risques de rencontrer des soucis (Cross-thread operation non valide). Dans ce cas, il faudra que tu utilises des Invoke pour afficher ton formulaire. Ou si tu utilises des versions récentes de .Net (au mini 4.5), tu peux utiliser les Async/Await (méthode à préférer si cela t'est possible).

  5. #5
    Membre confirmé Avatar de sibama
    Profil pro
    Inscrit en
    Août 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 150
    Par défaut
    Ah ouais, super l'explication, dit comme ça c'est limpide (et le pire logique).

    J'avais déjà eu un problème de temps d'exécution super long sur une autre appli où je voulais faire apparaître une animation d'avancement du traitement, du coup j'ai déjà utilisé ce principe de Background Worker, mais bon, vu de mon niveau d'informatique, ça revient à sortir l'artillerie lourde (je me suis remis le truc en tête via le tuto http://webman.developpez.com/article...ckroundworker/).

    Par contre ça oblige à revoir la manière de gérer le Load de mon formulaire secondaire et son affichage, l'avantage de gérer le MAJDonneesDGV() "séquentiellement" c'est que mes données sont dispo quand l'affichage arrive...

    Bon va falloir que je réfléchisse à ça.

    Par contre il y a quand même un petit truc qui me turlupine, c'est pourquoi le double click n'est pas pris en compte?

    Je pensais que si on triple click rapidement sur le bouton, on ne devrait avoir que 2 fenêtres qui s'ouvrent (une via le double click et une via le click qui reste), or moi j'en ai 3 qui s'ouvrent (c'est ce que je mettais dans mon premier post quand je parlais du point d'arrêt qui ne déclenche pas dans l’événement Double click). Pour moi l’événement Double click est prioritaire sur le Click simple?

    Et puis ils sont pas sympa d'avoir pas mis le e.cancel, c'est pas mal pratique ce truc.

    Sinon j'ai regardé Async/Await chez Microsoft, je crois presque que je comprend, mais le problème c'est que mon appli doit pouvoir tourner sur des systèmes un peu anciens et que je me limite au Framework 3.5...

    En tout cas merci pour les explications et le temps passé, c'est sympa.

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Le plus simple moyen d'ignorer le DoubleClick c'est d'hériter de Button et de desactiver DoubleClick!!!

    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
     
     
    Public Class CustomButton
     
        Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
            MyBase.OnPaint(e)
     
            'Ajoutez ici votre code de dessin personnalisé
        End Sub
     
        Public Sub New()
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
            SetStyle(ControlStyles.StandardClick, True)
            SetStyle(ControlStyles.StandardDoubleClick, False)
        End Sub
    End Class
    bon code....

  7. #7
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par sibama Voir le message
    Par contre il y a quand même un petit truc qui me turlupine, c'est pourquoi le double click n'est pas pris en compte?
    La réponse est simple et se trouve dans la documentation officielle : https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx
    Citation Envoyé par MSDN
    By default, the ControlStyles.StandardClick and ControlStyles.StandardDoubleClick style bits are set to false for the Button control, and the DoubleClick event is not raised.
    Donc, si tu veux disposer de l'événement DoubleClick, tu dois préciser ces deux styles sur ton boutton (ControlStyles.StandardDoubleClick nécessite ControlStyles.StandardClick pour fonctionner).

    Et ainsi, contrairement à ce que dit MABROUKI, le plus simple pour ignorer le double clic, c'est de ne rien faire !

    A noter également que l'événement DoubleClick ne vient pas remplacer le simple clic. Les deux événements sont générés : simple clic d'abord, puis le double.

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

Discussions similaires

  1. [WD19] Webbrowser >>click ne fonctionne plus (sur certains boutons)
    Par ToxiK dans le forum WinDev
    Réponses: 6
    Dernier message: 25/08/2015, 11h31
  2. Réponses: 3
    Dernier message: 07/08/2012, 12h27
  3. Réponses: 4
    Dernier message: 13/10/2009, 09h42
  4. Utiliser double-click evenenement en matlab sur un button
    Par mihaispr dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 21/04/2009, 16h02
  5. click or double click sur gtk.CList
    Par awalter1 dans le forum GTK+ avec Python
    Réponses: 0
    Dernier message: 25/02/2009, 11h49

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