Apprenez à programmer en VB .NET
Last updated on Monday, June 24, 2013
  • 4 semaines
  • Facile

Ce cours est visible gratuitement en ligne.

Paperback available in this course

Ce cours existe en eBook.

Got it!

Les timers

Un timer nous sera très utile pour effectuer des actions temporelles et réagir à des événements temporels. Reprenons l'horloge réalisée dans la première partie : avec un timer, on pourrait prendre la date actuelle et ajouter une seconde toutes les secondes. Même effet, mais pas de la même façon.

Le timer est un contrôle comme n'importe quel bouton ou textbox, mais au lieu de pouvoir le placer ou l'on veut dans la fenêtre il se met « en dehors » de cette fenêtre puisqu'il n'est pas visible à l'exécution. Apprenons dès maintenant à l'utiliser.

Créer son premier timer

Créons notre premier timer : double-cliquons donc sur son contrôle pour le voir se placer en bas de notre fenêtre design. Essayez de construire le reste de l'application comme à la figure suivante.

Notre premier timer
Notre premier timer

Donc, nous avons deux boutons : un « Démarrer » nommé BT_DEMAR, un « RAZ » nommé… BT_RAZ. Une progressbar : PGB_TIM, et un timer (non visible à l'image) nommé TIM_TIM.

J'explique ce que notre programme va faire : lors de l'appui sur le bouton « Démarrer », la progressbar va progresser jusqu'au bout de manière linéaire et à une certaine vitesse. À l'appui sur RAZ, elle va retourner à 0.

Le timer contient deux propriétés essentielles : enabled, comme pour tous les autres contrôles, détermine s'il est activé ou non, et la propriété interval (ce n'est pas une marque de cigarettes, non) détermine l'intervalle entre deux actions du timer(exprimée en ms).

Mettons donc pour ce TP 20 ms d'intervalle.

À chaque fois que ce temps sera écoulé, l'événement du timer, nommé tick, se déclenchera. Pour créer cet événement sur l'assistant, double-cliquez sur le timer, en bas. Faites de même pour les événements des deux boutons.

Nous avons donc créé trois événements dans notre code : le timer et les deux boutons.

Je pense que vous êtes capables de faire cet exercice seuls, avec tout ce que vous savez, mais je vais quand même vous le corriger.

Public Class Form1
    Private Sub BT_DEMAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_DEMAR.Click
        'Si le bouton « Démarrer » est enfoncé, on active le timer, on désactive ce bouton et on active RAZ
        Me.TIM_TIM.Enabled = True
        Me.BT_DEMAR.Enabled = False
        Me.BT_RAZ.Enabled = True
    End Sub

    Private Sub TIM_TIM_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TIM_TIM.Tick
        'Si la progressbar est arrivée au bout, on désactive le timer, on réactive le bouton « Démarrer »
        If Me.PGB_TIM.Value = 100 Then
            Me.TIM_TIM.Enabled = False
            Me.BT_DEMAR.Enabled = True
        Else
            'Augmente de 1 la progressbar
            Me.PGB_TIM.Value = Me.PGB_TIM.Value + 1
        End If
    End Sub

    Private Sub BT_RAZ_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_RAZ.Click
        'Si le bouton « RAZ » est enfoncé, on remet la progressbar à 0, on désactive le timer, 
        'on active le bouton « Démarrer » et on désactive le bouton « RAZ »
        Me.PGB_TIM.Value = 0
        Me.TIM_TIM.Enabled = False
        Me.BT_DEMAR.Enabled = True
        Me.BT_RAZ.Enabled = False
    End Sub
End Class

J'ai fait l'effort de commenter le code pour une fois. :p

Bon, je pense que ce n'était pas si dur que cela, vous voyez que je me sers de l'événement du timer, donc déclenché toutes les 20 ms dans notre cas pour ajouter 1 à la value de la progressbar. Si la value arrive à 100, on l'arrête.

Je pense que vous avez compris que si je diminue l'intervalle la progressbar avancera plus vite.

TP : la banderole lumineuse

Petit TP : la banderole lumineuse ! Je sais, le nom n'est pas très imaginatif…

Le but de ce TP va être d'allumer différents boutons radio (une dizaine) au rythme du timer, les faire défiler en gros. J'ai pris des boutons radio et pas des checkbox, parce que les boutons radio n'ont pas besoin d'être décochés, ils le sont automatiquement lorsqu'un autre est coché.

Donc un bouton « Démarrer la banderole » et « Arrêter la banderole » seront nécessaires.

Et petit plus pour les rapides : une barre pour faire varier la vitesse de ce défilement.

Attention, ce TP n'est pas aussi facile qu'il en a l'air !
Essayez de trouver une méthode pour pouvoir gérer aussi bien 10 boutons que 50.

Petite astuce : il va falloir faire un tableau… mais de quoi ? That's the question.

À vos claviers !

Solution

Mon programme ressemble à la figure suivante.

Le rendu final
Le rendu final

Il y a bien les 10 boutons radio.

Maintenant le 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

    Private Sub BT_PLAY_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_PLAY.Click
        Me.TIM_TIM.Enabled = True
        Me.TIM_TIM.Interval = 501 - Me.TKB_VIT.Value * 50
    End Sub

    Private Sub BT_STOP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_STOP.Click
        Me.TIM_TIM.Enabled = False
    End Sub

    Private Sub TKB_VIT_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TKB_VIT.Scroll
        Me.TIM_TIM.Interval = 501 - Me.TKB_VIT.Value * 50
    End Sub
End Class

Alors je vais expliquer le principal :

Vous voyez que dans l'événement tick du timer j'ai créé un tableau, mais ce n'est pas un tableau de string ou de integer, non c'est un tableau de… boutons radio (Dim RB(9) As RadioButton) !

Eh, oh ! je savais pas moi !

C'est pour ça que j'ai dit que ce TP était difficile, en cherchant un peu vous auriez pu avoir l'idée, ensuite la mettre en pratique aurait été faisable…

Bon, ce n'est pas grave, vous le saurez maintenant. Donc ce tableau de boutons radio, je le remplis avec mes boutons !

Et donc si vous avez compris, la boucle en dessous est un petit algorithme qui parcourt ces boutons et qui retourne au premier une fois arrivé au dernier.

Passons maintenant au changement de vitesse : Me.TIM_TIM.Interval = 501 - Me.TKB_VIT.Value * 50. Mais pourquoi ? Tout d'abord ma progressbar a un Minimum de 1 et un Maximum de 10.
Donc, à 1 : 501 - 1 * 50 = 451 et à 10 : 501 - 10 * 50 = 1.

La vitesse change donc bien en fonction de cette barre.

Et pourquoi 501 et pas 500 ?

Parce que 500 - 10 * 50 = 0, et l'interval d'un timer ne doit jamais être égal à 0 !

Pour finir ce chapitre, je tiens à dire que l'amélioration de ce TP peut être effectuée en de multiples points. 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.
Et profitez-en pour factoriser ce petit algorithme qui fait défiler les boutons radio. ;)

  • Les timers nous permettent de déclencher des événements en fonction du temps.

  • L’événement appelé à chaque fois que le timer est écoulé est Tick.

  • Le temps entre chaque Tick est défini avec la propriété Interval.

Example of certificate of achievement
Example of certificate of achievement