[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..
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:
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!