Utilisateur anonyme
-
29 juin 2017 à 17:01
Utilisateur anonyme -
12 juil. 2017 à 15:22
Bonjour , je suis un-peux bloquer à un chapitre d'un cours dans ce cours il y ce code
Public Class Form1 Private Sub TIM_TIM_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TIM_TIM.Tick Dim Tourne As Boolean = True Dim Bouton As Integer = 0
'Rassemble tous les boutons radio dans un tableau Dim RB(9) As RadioButton RB(0) = Me.RB_1 RB(1) = Me.RB_2 RB(2) = Me.RB_3 RB(3) = Me.RB_4 RB(4) = Me.RB_5 RB(5) = Me.RB_6 RB(6) = Me.RB_7 RB(7) = Me.RB_8 RB(8) = Me.RB_9 RB(9) = Me.RB_10
While Tourne 'Si on est arrivé au bout du tableau, on sort de cette boucle If Bouton = 10 Then Tourne = False Else 'Si le bouton actuellement parcouru est activé If RB(Bouton).Checked Then 'Et si ce n'est pas le dernier If RB(Bouton) IsNot RB(9) Then 'on active celui d’après et on sort de la boucle RB(Bouton + 1).Checked = True Tourne = False Else 'Sinon on reprend au premier Me.RB_1.Checked = True End If End If 'On incrémente le compteur Bouton = Bouton + 1 End If End While End Sub
ce que j'arrive pas à comprendre c'est la variable Bouton comment peut-elle garder sa valeur puisque qu'à chaque nouveau passage dans l'événement la variable devient 0 et aussi je comprend pas le boolean Tourne je vois pas à quoi il sert puisque dans tout les cas il devient False
bref je voulais avoir un-peux plus d'éclaircissement sur ce code merci d'avance :)
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 29 juin 2017 à 21:05
Salut
la variable Bouton n'atteint jamais 9
explique pourquoi ? ou comment on sort de la boucle ?
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023629 29 juin 2017 à 22:07
Salut, c'est possible que Bouton n’atteigne pas 9, ça ne dépend que de ce que fait Hixale quand il lance son programme.
Ce qui serait bien c'est qu'il fasse le lien entre ses actions et la valeur de sortie de Bouton.
Utilisateur anonyme
>
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023 30 juin 2017 à 00:01
bah j'ai pas trop besoin d'expliquer puisque il y a le code ... mais comme vous voulez
If RB(Bouton) IsNot RB(9) Then
RB(Bouton + 1).Checked = True Tourne = False
Tourne devient False
donc le
Bouton = Bouton + 1
sert à rien puisque dans tout les cas Tourne sera False
et si Tourne est False bah on rentre plus dans la boucle et l'événement reprend à zéro
du coup je comprend pas trop comment ce code fonctionne
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023629 30 juin 2017 à 07:37
bah j'ai pas trop besoin d'expliquer puisque il y a le code ..
Sauf que ce que tu dis, n'est pas ce que fait le code. Tu en as donc une mauvaise lecture. Le fait de l' exécuter une fois en "normal" pour voir ce que fait le programme, puis en pas à pas pour comprendre comment il le fait, serait je pense une bonne façon pour toi de résoudre ton problème.
À chacune de tes questions, tu te focalises sur un truc que tu crois vrai et tu n'en démords pas, donc cette fois on ne va pas batailler 100 messages, tant que tu n'auras pas essayé ce code comme il faut.
Ce que tu peux faire aussi, est de mettre un point d'arrêt à cette ligne
RB(Bouton + 1).Checked = True
Pour constater si l'exécution y passe ou pas.
Utilisateur anonyme
>
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023 30 juin 2017 à 17:35
j'ai déjà fais tout ça ....
tout ce que je vois c'est que la Boucle While fais juste un passage et qu'en suite tout reprend à zéro
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023629
>
Utilisateur anonyme
30 juin 2017 à 17:45
As tu coché un radiobutton?
Ça n'est pas précisé dans le cours, mais c'est indispensable pour que le code marche.
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023629 6 juil. 2017 à 23:13
Sinon, regarde ça
Dim index As Integer = 0
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim RB() As RadioButton = {RadioButton1, RadioButton2, RadioButton3, RadioButton4, RadioButton5, RadioButton6, RadioButton7, RadioButton8, RadioButton9, RadioButton10}
RB(index).Checked = True
index += 1
If index = 10 Then
index = 0
End If
End Sub
comment tu fais pour que la variable index soit utilisable dans l'événement ?
dans le cours ils disent aussi qu'on aurai pu déclarer au Load ce que j'ai essayé bien avant de voir qu'il le dit mais perso je peux pas
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023629 Modifié le 7 juil. 2017 à 22:55
Il y a 2 choses à comprendre
la portée d'une variable
la différence entre déclaration et initialisation.
La portée
c'est la "zone" du code ou cette variable est vue.
Typiquement, dans un même fichier, la porté est bornée par un block
trucmuche
end trucmuche
Déclaration et initialisation
La déclaration est "la naissance" de la variable, une fois qu'elle est déclarée, elle existe, mais elle n'est pas utilisable.
Pour être utilisable, il faut lui donner une valeur de départ, c'est l'initialisation.
Dans, une méthode, une boucle, un bloc quelconque, les instructions sont exécutées dans l'ordre ou elles sont écrites, la variable "nait" donc, à sa déclaration, est utile à partir de son initialisation et "meure" à la fin de sa portée.
Dans une classe (un Form, c'est un type de classe), il n'y a pas d'ordre particulier entre les différentes méthode, une variable dont la portée s'étend à toute la classe peut être déclarée n'importe ou au niveau de la classe
Si j'écris
class Toto
Dim index as Integer
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
End Sub
Dim valeur as Double
end class
index et valeur seront toutes deux vues dans la méthode Timer1_Tick.
Cependant, si elle n'ont pas de valeur au moment ou tu veux les utiliser, ça va coincer. Et initialiser une variable dans un timer, revient à lui donner la même valeur tout le temps, c'est plus vraiment une variable.
On pourrait s'en démerder avec un if, mais c'est ce compliquer la vie pour rien.
Les 2 options, les plus simples sont soit d'initialiser directement la variable, comme je te m'ai montré, soit de les initialiser dans le Load ou le New qui seront effectivement exécutés avant le Tick du timer
class Toto
Public sub New()
index = 1'initialisation de la variable déclarée plus bas
end sub
Dim index as Integer
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
End Sub
Dim valeur as Double = 1.2'déclaration et intialisation
end class
Quand Timer1_Tick sera exécutée pour la première fois index vaudra 1 et valeur 1.2
Quand j'étais petit, la mer Morte n'était que malade.
George Burns
donc je peux pas utiliser une variable qui est dans un événement dans un autre ? je peux utiliser une variable qui est déclarer dans la classe dans plusieurs événement ?
dans le cours ils disent :
Tout d'abord, le code lors du Tick du timer est beaucoup trop lourd, il faut au contraire qu'il soit le plus petit possible pour ne pas demander trop de mémoire au processeur. Donc les déclarations sont à effectuer au Load.
quand il dit le Load il parle de la classe du coup ?
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023629
>
Utilisateur anonyme
8 juil. 2017 à 20:07
donc je peux pas utiliser une variable qui est dans un événement dans un autre ?
Tu ne peux pas utiliser une méthode déclarée dans une méthode (qu'elle soit abonnée à un événement ou non) dans une autre méthode.
Tout d'abord, le code lors du Tick du timer est beaucoup trop lourd
oui, mais c'est surtout parce qu'il fait un truc complément idiot : une boucle dans un timer....
Ce que je t'ai montré est nettement plus simple, et encore, il faudrait déclarer et initialiser le tableau en dehors, mais ça nécessitait une méthode de plus (j'y reviens juste après), donc moins pratique à montrer.
Donc les déclarations sont à effectuer au Load.
ben non encore une erreur de ce cours.
Ce que tu déclares dans la méthode abonnée à l'événement Load (d'une Form donc) n'a pas la portée pour être utilisable dans la méthode abonnée au Tick du Timer.
Il faut la déclarer au niveau de la Form et soit l'initialiser immédiatement, soit dans un événement qui sera forcement appelé avant le tick. De façon certaine, et dans l'ordre d'apparition le constructeur (méthode New), le Load et le Shown. Et d'autres selon ton code, par exemple si tu démarres le timer depuis un bouton, tu peux initialiser la variable dans ce bouton, juste avant de démarrer le timer.
Il y a des cas ou on ne peut pas initialiser une variable au niveau de la class, c'est le cas du tableau de radioBoutons.
La Form est une class particulière, elle a une interface graphique et elle est partagée entre 2 fichiers (on peut le faire pour n'importe quelle classe, mais ça a peu d'interêt). Puisqu'on peut poser les contrôles sur le formulaire en mode design, l'idée est que le développeur ne soit pas tenté de trifouiller dans le code généré par Visual Studio, donc ce code est écrit dans le 2eme fichier.
Tous les contrôles sont déclarés au niveau de la Form (sinon, on ne pourrait pas s'en servir), mais ils sont initialisés dans une méthode (InitializeComponent) qui est appelée par le constructeur. D'ou coup, si je fais ça
ça ne marche pas, j'ai beau avoir mis les 10 radioBouton, il y a Nothing dans le tableau.
Il faut donc l'initialiser dans le Load par exemple.
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
RB = {RadioButton1, RadioButton2, RadioButton3, RadioButton4, RadioButton5, RadioButton6, RadioButton7, RadioButton8, RadioButton9, RadioButton10}
End Sub
Dim RB() As RadioButton
Dim index As Integer = 0
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick, Timer3.Tick
RB(index).Checked = True
index += 1
If index = 10 Then
index = 0
End If
End Sub
Utilisateur anonyme
>
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023 8 juil. 2017 à 22:45
ok merci, c'est bien ce qui me semblait qu'on pouvait pas utiliser les variables d'un événement dans un autre j'avais beau essayer j'y arrivais par c était cette phrase qui m'avait mis le doute : donc les déclarations sont à effectuer au Load.
merci pour la précision sur les tableaux
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023629
>
Utilisateur anonyme
Modifié le 8 juil. 2017 à 23:39
Ca n'est pas dû au tableau en soit mais au fait que les boutons ne sont pas initialisés à l'initialisation du tableau
Utilisateur anonyme
>
Whismeril
Messages postés18636Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention30 septembre 2023 Modifié le 9 juil. 2017 à 21:14
oui je parlai des radiobouton , que nous ayons pas pu initialisé dans la class mais dans un événement car ce sont des objets
29 juin 2017 à 18:57