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

Windows Forms Discussion :

[VB.NET]Procédure qui s'éxécute plusieurs fois


Sujet :

Windows Forms

  1. #1
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut [VB.NET]Procédure qui s'éxécute plusieurs fois
    Bonjour à tous,

    J'ai un problème que je n'arrive pas à résoudre:

    J'ai créé une procédure "doubleclick" sur une picturebox, dont le but est de changer l'image (on passe d'un pion blanc à un pion noir, et inversemement).

    Or, quand je doucle-clique sur cette picturebox, il arrive (pas à chaque fois!!) qu'il éxécute plusieurs fois les commandes (il change le pion noir en blanc, puis en noir, puis en blanc, etc.)

    Après avoir essayé de débuger, il est clair que parfois la procédure est appelée plusieurs fois. Comment est-ce possible que sur un seul double-click la procédure soit appelée plus d'une fois? Y a t'il un moyen d'éviter ça?

    Merci d'avance!

    Un programmeur en déprime..

  2. #2
    Membre éclairé
    Avatar de Asdorve
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 336
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 336
    Points : 718
    Points
    718
    Par défaut
    salut, on peut voir ton code?

  3. #3
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut Code (jeu programmé = Othello)
    Voilà ma procédure "double-click": tout marche (calcul des pions à convertir, changement de couleur, etc.)
    A la fin de la procédure, la procédure de changement de joueur est appelée, qui marche elle aussi.

    Sauf qu'après avoir changé les pions de couleurs (boucle While) et changé de joueur (procédure change_joueur()), parfois il rerentre ds PictureBox_DoubleClick(), et comme il a changé de joueur auparavant, il rechange la couleur des pions, et ce 2, 3, 4 fois ou plus. Du coup, un seul double-click peut ne pas changer la couleur au final.

    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
    69
    70
    71
    72
    73
    74
    75
        Private Sub PictureBox_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs)
            Dim element As Object
            Dim elementbis, elementter As Control
            Dim dif, pas, saut, ecart, toto As Integer
            Dim compteur As Integer = 0
            Dim fin As Boolean = False
     
            'On calcule la différence d'index entre le pion choisi et la case où il est laché
            dif = sender.tabindex - depart
     
            'On calcule le pas (valeur absolue)
            If dif < 8 And dif > -8 Then
                pas = 1
            ElseIf dif Mod 9 = 0 Then
                pas = 9
            ElseIf dif Mod 10 = 0 Then
                pas = 10
            Else
                pas = 11
            End If
            'On remet le pas en valeur réelle
            If dif < 0 Then
                pas = 0 - pas
            End If
            'On calcule le nombre de pions sautés
            saut = (dif / pas) - 1
            'On convertit les pions sautés et le pion de destination de la couleur de celui qui a joué
            ecart = pas
     
    	'Boucle qui change les pions de couleur
            While compteur <= saut
                For Each element In Controls
                    If element.TabIndex = depart + ecart Then
                        'on change le statut de la case
                        If tour = "n" Then
                            element.image = Image.FromFile("pionnoir.gif")
                            element.tag = "n"
                        ElseIf tour = "b" Then
                            element.image = Image.FromFile("pionblanc.gif")
                            element.tag = "b"
                        End If
                    End If
                Next element
                compteur = compteur + 1
                ecart = ecart + pas
            End While
     
    		'On change de joueur
            change_joueur()
     
        End Sub
     
     
    	'PROCEDURE DE CHANGEMENT DE JOUEUR
        Private Sub change_joueur()
            Dim elementter As Control
     
            'On change de joueur
            If tour = "n" Then
                tour = "b"
                Label37.Text = " Player : " & player2
            ElseIf tour = "b" Then
                tour = "n"
                Label37.Text = " Player : " & player1
            End If
     
            'On branche les pions du joueur qui doit jouer sur la procédure qui autorise le click
            For Each elementter In Controls
                If elementter.Tag = tour Then
                    AddHandler elementter.Click, AddressOf PictureBox_Click
                Else
                    RemoveHandler elementter.Click, AddressOf PictureBox_Click
                End If
            Next elementter
        End Sub
    Merci beaucoup!

  4. #4
    Membre actif Avatar de Jihnn
    Inscrit en
    Décembre 2005
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 330
    Points : 273
    Points
    273
    Par défaut
    (End While, ça marche ? Ça devrait être Wend normalement ^^)

  5. #5
    Nouveau membre du Club
    Inscrit en
    Décembre 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 33
    Points : 34
    Points
    34
    Par défaut
    Est-ce que tu t'es assuré que c'est bien dans l'évenement double click que tu as ton code et non dans l'évenement click ?

  6. #6
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut While
    Si ça fonctionne en vb.net, j'ai oublié de préciser...

  7. #7
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Oui, le code est bien dans la procédure double click, c'est ça qui est etonnant, je ne comprends pas du tout. Normalement quand on double clicque, la procédure ne se lance qu'une fois, et là c'est pas le cas..

  8. #8
    Membre expert
    Avatar de khany
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 073
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 073
    Points : 3 890
    Points
    3 890
    Par défaut
    Es-tu certain de ne pas appeller le double clic d'un autre endroit de ton programme surtout à partir d'un form_activate, repaint, ou autres de ce style qui s'exécutent plusieurs fois sans que l'on s'en doute

    Tu es bien en VB6 car je vois que tu parles de VB.NET ?

  9. #9
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    1) Quels sont (tu ne nous en parles pas !) les autres événements de ta picturebox que tu utilises éventuellement ?... et si tel est le cas, quelles instructions y figurent ?

    2) VB.Net et VB sont des choses différentes...

  10. #10
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    D'abord, merci de vos réponses.

    Je me suis trompé, effectivement je développe en VB.Net..

    Je n'appelle pas le double click à un autre endroit, la seule fois ou je le cite dans le code est au moment ou je dois brancher cette procédure à certaines cases de l'echiquier.

    Il n'y a qu'une autre procédure attachée aux picturebox de l'echiquier que j'utilise, c'est le "click".

    Pour résumer, quand je clique sur un pion noir (si c'est aux noirs de jouer), il teste les cases jouables, et les branche sur la procédure "double-click". Ensuite, on ne peut appeler le double-click que sur ces cases jouables.

    Voici la procédure du click:

    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
        Private Sub PictureBox_Click(ByVal sender As Object, ByVal e As System.EventArgs)
     
    		'On teste que la case qui a été choisie correspond à celui qui doit jouer
            If sender.tag = tour Then
     
                Dim elementbis As Control
                For Each elementbis In Controls
                    'On remet toutes les cases de l'othellier de la même couleur
                    If elementbis.Tag <> "" Then
                        elementbis.BackColor = Color.BlanchedAlmond
                    End If
                Next elementbis
     
                'Tableau des cases à vérifier quand un pion est joué
                Dim tab(7) As Integer
                ' Tableau des cases ou il y a des pions adverses autour du pion joué
                Dim autour(0) As Integer
     
                'On réinitialise jouable()
                Erase jouable
     
                Dim element As Control
                Dim cpt As Integer = 0
                Dim i, pas As Integer
                Dim pionAdv, pionAdv2 As Boolean
                Dim fin As Boolean = False
                Dim diff As Integer = 0
                'On affecte le tableau des cases à vérifier ( mouvements relatifs par rapport à la case jouée)
                tab(0) = -11
                tab(1) = -10
                tab(2) = -9
                tab(3) = -1
                tab(4) = 1
                tab(5) = 9
                tab(6) = 10
                tab(7) = 11
     
                'affectation de la valeur de l'index du pion moussé
                depart = sender.tabindex
     
                'On boucle pour savoir quelles cases autour du pion choisi sont occupées par un pion adverse
                For Each element In Controls
                    'On teste les cases autour (positions relatives)
                    For i = 0 To 7
                        If element.TabIndex = depart + tab(i) Then
                            'Test s'il y a un pion adverse dans la case
                            pionAdv = element.Tag <> "v" And element.Tag <> "h" And element.Tag <> tour
                            If pionAdv = True Then
                                'On stocke dans un tableau l'index de la case, si elle contient un pion adverse
                                ReDim Preserve autour(cpt)
                                autour(cpt) = element.TabIndex
                                cpt = cpt + 1
                            End If
                        End If
                    Next i
                Next element
     
                'On réinitialise la variable cpt
                cpt = 0
     
                'On boucle pour savoir quelles cases de l'othellier sont jouables pour le pion choisi
                For Each element In Controls
                    'Test sur les pions adverses adjacents, dont les index sont stockés dans le tableau "autour()"
                    For i = 0 To UBound(autour)
                        If element.TabIndex = autour(i) Then
                            'On stocke le pas entre la case choisie et la case adverse
                            pas = element.TabIndex - sender.tabindex
                            pionamod = pas
                            diff = pas
                            'On boucle pour savoir combien de pions adverses sont en ligne par rapport à la case jouée
                            fin = False
                            While fin <> True
                                'on boucle pour tester l'index: si la case correspond à celle d'après dans la ligne directionnelle de pions
                                For Each elementbis In Controls
                                    If elementbis.TabIndex = element.TabIndex + diff Then
                                        pionAdv2 = elementbis.Tag <> "v" And elementbis.Tag <> "h" And elementbis.Tag <> tour
                                        'S'il y a un pion adverse, on augmente le pas pour continuer le test
                                        If pionAdv2 = True Then
                                            diff = diff + pas
                                            'Si la case est vide, cela signifie que la case est jouable: on stocke dans le tableau "jouable()", puis on sort de la boucle
                                        ElseIf elementbis.Tag = "v" Then
                                            ReDim Preserve jouable(cpt)
                                            jouable(cpt) = elementbis.TabIndex
                                            elementbis.BackColor = Color.PaleGoldenrod
     
                                            AddHandler elementbis.DoubleClick, AddressOf PictureBox_DoubleClick
     
                                            cpt = cpt + 1
     
                                            'Sinon, on sort de la boucle
                                            fin = True
                                        Else
                                            fin = True
                                        End If
                                    End If
                                Next elementbis
                            End While
                        End If
                    Next i
                Next element
            End If
     
        End Sub

  11. #11
    Inactif  
    Avatar de jmfmarques
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    3 784
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 3 784
    Points : 4 674
    Points
    4 674
    Par défaut
    Il n'y a qu'une autre procédure attachée aux picturebox de l'echiquier que j'utilise, c'est le "click".
    Rien que çà !!!

    Bon, je crois de toutes façons qu'il serait préférable que tu "postes" ce sujet sur le forum dédié à VB.Net. Profites-en pour apporter d'entrée de jeu ces importantes précisions.
    Bonne chance à toi, Ami.

  12. #12
    Candidat au Club
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    D'accord je vais essayer, merci beaucoup!

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Discussion déplacée.

  14. #14
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Pour le pb de double click :
    Si tu as VS.Net :
    * tu colles un breakpoint (point d'arrêt) au début de ta procedure de double-click.
    * tu lances le programme en débug.
    * tu double click UNE SEULE FOIS.
    * et là tu vois :
    - combien de fois l'évènement est effectivement appelé.
    - par qui il est appelé, dans la fenêtre "CallStack" (pile d'appel)

    Si c'est par du code non-utilisateur, ce que je pressens, alors ton erreur vient très très certainement du fais que tu associes ta procédure à l'évènement DoubleClick plusieurs fois. Vérifie ta boucle d'initialization....

Discussions similaires

  1. [XL-2007] Procédure qui s'éxécute une seconde fois à partir de la moitié
    Par stepel dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 24/08/2014, 23h26
  2. Réponses: 8
    Dernier message: 17/05/2009, 23h30
  3. Formulaire qui se submit plusieurs fois
    Par otterley dans le forum Struts 1
    Réponses: 12
    Dernier message: 08/02/2008, 17h49
  4. Réponses: 2
    Dernier message: 23/07/2007, 07h14
  5. code qui s'execute plusieurs fois
    Par khelif dans le forum JBuilder
    Réponses: 1
    Dernier message: 10/03/2005, 22h56

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