Timer

Résolu
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


End Class


voici le cours https://openclassrooms.com/courses/apprenez-a-programmer-en-vb-net/les-timers-1

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 :)

4 réponses

Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
29 juin 2017 à 18:12
Bonjour

Est-ce que tu as exécuté ce code en pas à pas?
Je ne pense pas, car si tu l'avais fait tu ne devrais pas avoir l'analyse que tu as.

0
Utilisateur anonyme
29 juin 2017 à 18:57
oui j'ai exécuter le code pas à pas et quand ça sort de la boucle l'événement recommence la variable Bouton n'atteint jamais 9 , en tout cas pour moi
0
cs_ShayW
Messages postés
3258
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
3 décembre 2019
56
29 juin 2017 à 21:05
Salut

la variable Bouton n'atteint jamais 9

explique pourquoi ? ou comment on sort de la boucle ?
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
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.
0
Utilisateur anonyme > Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022

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
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
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.
0
Utilisateur anonyme > Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022

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
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596 > 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.
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
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


Un peu plus simple non?
0
Utilisateur anonyme
Modifié le 7 juil. 2017 à 20:25
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
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
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
0
Utilisateur anonyme
8 juil. 2017 à 18:25
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 ?
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596 > 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
0
Utilisateur anonyme > Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022

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
0
Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596 > 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
0
Utilisateur anonyme > Whismeril
Messages postés
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022

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
0