Ce cours est visible gratuitement en ligne.

Paperback available in this course

Ce cours existe en eBook.

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

Les événements

Bon, attaquons maintenant réellement les événements.

Je vous ai déjà expliqué un événement, le form_load. Eh bien découvrons les autres afin de réagir à plein d'autres choses : un clic, une touche, une ouverture, une fermeture, que sais-je encore, les possibilités sont nombreuses !

Pourquoi ça encore !

Alors, un événement s'écrit comme un Sub ; par exemple, l'évènement form_load :

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Observez bien sa définition : nous avons tout d'abord le Private Sub (sachez que le private ne nous intéresse pas pour le moment, je l'expliquerai plus tard en annexes). Nous avons donc cette définition que nous connaissons bien, puis le nom du Sub, appelé ici form1_load.

Pourquoi ce nom ?

Tout simplement parce que la fenêtre s'appelle form1, et l'événement, load. ;)

Je peux donc l'appeler autrement ?

Bien sûr, mais je vous conseille de vous habituer à ces noms, ils sont plus pratiques, ce sont ceux que l'assistant (assistant que nous avons utilisé en double-cliquant sur la fenêtre) qui les crée automatiquement.

Continuons, nous avons entre parenthèses les arguments de ce Sub, ces arguments sont indispensables ! Vous ne pouvez pas les supprimer ! Ce sont des arguments que la fenêtre passera automatiquement à ce Sub lorsqu'il sera appelé, ils nous seront inutiles pour le moment, mais plus tard vous en verrez l'utilité.

Handles MyBase.Load

Voilà notre salut ! Cette fin d'instruction avec ce mot-clé : Handles. Ce mot-clé peut se traduire par « écoute », suivi de l'événement écouté. Ici il écoute le chargement de la fenêtre.

Donc si vous avez bien compris, je résume : ce Sub sera pénétré lors du chargement de la fenêtre, et maintenant nous savons pourquoi : un événement attend que le chargement de la fenêtre s'effectue !

Créer nos événements

Eh bien, attelons-nous de suite à la tâche !

Vous voulez peut-être réagir à d'autres occasions qu'au chargement de cette fenêtre, pourquoi ne pas réagir au clic du bouton ?

Allons-y ! Comme pour générer l'événement form_load, double-cliquons sur notre bouton !

Automatiquement l'IDE me crée :

Private Sub BT_ENVOI_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_ENVOI.Click

End Sub

Comme pour le form_load, plaçons-y les instructions voulues ; fainéant de nature, je déplace simplement celles que nous avions écrites dans le form_load :

Private Sub BT_ENVOI_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_ENVOI.Click
        Me.TXT_RECOIT.Text = "Salut"
        Me.TXT_RECOIT.TextAlign = HorizontalAlignment.Center
End Sub

Testons voir : avant, rien, après le clic, le message s'affiche. Nous avons réussi !

Vous l'aurez compris, le double-clic sur un objet côté design crée son événement le plus courant ; pour un bouton : le clic, pour une textbox : le changement de texte, etc.

Mais pourquoi se limiter à cela puisqu'il existe des dizaines d'événements différents pour chaque objet ?
Allons réagir manuellement à tous ces événements !

Les mains dans le cambouis !

Créons donc nos événements !

Enfin modifions-les, plutôt ! Eh oui, je vous l'ai dit, je suis fainéant, pourquoi les créer puisqu'un assistant le fait pour nous ? Enfin, puisqu'il fait la moitié du travail.

Double-cliquons donc sur la fenêtre, l'événement form_load se crée (s'il n'y était pas). Intéressons-nous au Handles, supprimons le .load de la fin, plaçons-nous sur la fin du mot MyBase et écrivons un point (« . »). Voici la liste d'événements de l'objet fenêtre qui s'ouvre, comme à la figure suivante.

La liste d'événements de l'objet fenêtre s'ouvre
La liste d'événements de l'objet fenêtre s'ouvre

Eh bien, choisissons l'événement MouseClick, qui (je pense que vous l'avez compris) se déclenche lors du clic de la souris sur la fenêtre.

Et renommons ce Sub. Eh oui, c'est bien beau d'avoir un nouvel événement, mais il est toujours appelé en tant que form_load, si vous ne changez pas ce nom vous allez très vite ne plus penser qu'il réagit au clic de la souris, prenez donc l'habitude dès maintenant de le renommer. Personnellement pour moi ce sera : form1_MouseClick.

Replaçons maintenant le code que nous avons mis dans l'événement du clic sur le bouton dans ce nouvel événement. Essayons, effectivement lors du clic de la souris sur la fenêtre (pas le bouton) le texte s'affiche ! Encore réussi !

Amusez-vous avec ces événements, essayez-en, soyez amis avec. :p

Mini-TP : calcul voyage

Nous passons à un mini-TP pour utiliser les événements et ce que nous avons vu précédemment.

Cahier des charges

Bon, voici mes consignes : je voudrais que vous créiez un programme qui va calculer le coût de revient d'un voyage en voiture.

Il prendra en compte :

  • La consommation de la voiture (l/100 km) ;

  • Le nombre de kilomètres ;

  • Le prix de l'essence (en euros).

L'utilisateur entrera ces informations dans des textbox, et l'appui sur un bouton affichera le résultat.

Je ne sais pas quoi vous dire de plus !
Non, n'insistez pas, vous n'aurez pas la fonction qui calcule ce coût, c'est à vous de faire un peu marcher vos méninges, c'est aussi ça la programmation !

Et je veux que ce programme réagisse aussi aux utilisateurs qui s'amusent à entrer n'importe quoi.

Bonne chance !

Correction

J'espère que vous avez trouvé par vous-mêmes, je vous avais tout expliqué ! Bon, je vous montre !

Avant toute chose, regardez la figure suivante. Elle vous montre mon résultat final. À gauche le programme initial, à droite une fois le calcul effectué.

Voici à quoi ressemble mon programme
Voici à quoi ressemble mon programme

Bon, l'explication des objets : j'ai placé trois textbox, une pour chaque valeur à entrer.
Leurs noms sont respectivement TXT_CONSOMMATION, TXT_NBKM, TXT_PRIXESS.

Puis des labels pour expliquer à quoi elles correspondent. Je n'ai pas donné de noms particuliers aux labels, puisque je n'agirai pas dessus pendant le programme, alors autant laisser comme ils sont.

Ensuite je leur ai attribué une propriété text, pour afficher le texte que vous voyez. Idem pour le titre, sauf que j'ai modifié sa propriété font.size pour le grossir.

Côté bouton, son nom est BT_CALCUL, j'y ai écrit le texte « Calculer ».

Il reste deux labels : un écrit en rouge, qui est là pour les erreurs : j'ai caché ce label en utilisant la propriété visible = false, je ne le ferai apparaître que lors des erreurs.

Le dernier est celui qui contiendra le résultat, j'ai nommé… LBL_COUT.

Voilà pour ce qui est du design, passons au VB !

Public Class Form1

    Private Sub BT_CALCUL_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_CALCUL.Click
        If Verification() Then
            Me.LBL_COUT.Text = "Le cout du voyage sera de " & Calcul(Me.TXT_CONSOMMATION.Text, Me.TXT_NBKM.Text, Me.TXT_PRIXESS.Text) & "?"
        Else
            Me.LBL_ERR.Visible = True
        End If
    End Sub

    ''' <summary>
    ''' Vérifie les trois textbox de la page, regarde si elles sont remplies et si des nombres ont été entrés
    ''' </summary>
    ''' <returns>Vrai si pas d'erreur, faux si une erreur</returns>
    ''' <remarks></remarks>
    Function Verification() As Boolean
        Dim Bon As Boolean = True
        If Me.TXT_CONSOMMATION.Text Is Nothing Or Not IsNumeric(Me.TXT_CONSOMMATION.Text) Then
            Bon = False
        End If
        If Me.TXT_NBKM.Text Is Nothing Or Not IsNumeric(Me.TXT_NBKM.Text) Then
            Bon = False
        End If
        If Me.TXT_PRIXESS.Text Is Nothing Or Not IsNumeric(Me.TXT_PRIXESS.Text) Then
            Bon = False
        End If
        Return Bon
    End Function

    ''' <summary>
    ''' Calcule le prix d'un voyage en fonction de la consommation, du prix de l'essence, et du nombre de kilomètres
    ''' </summary>
    ''' <param name="Consommation">Consommation</param>
    ''' <param name="NbKm">Distance parcourue</param>
    ''' <param name="PrixEss">Prix du kérosène</param>
    ''' <returns>Le coût en double</returns>
    ''' <remarks></remarks>
    Function Calcul(ByVal Consommation As Double, ByVal NbKm As Double, ByVal PrixEss As Double) As Double
        Dim Cout As Double

        Cout = ((NbKm / 100) * Consommation) * PrixEss

        Return Cout
    End Function

End Class

Examinons notre événement : l'appui sur le bouton. Événement que j'ai créé grâce à l'assistant, en double-cliquant dessus.

Dans cet événement, j'utilise ma fonction Verification() ; si le résultat est vrai, j'utilise ma fonction calcul() en lui passant comme arguments les valeurs des trois textbox, et j'écris le résultat sous la forme « Le coût du voyage sera de XXX ».

Si la fonction Verification() renvoie faux, j'affiche le message d'erreur.

Passons donc aux fonctions.
La fonction Verification() : cette fonction est spécifique à ce programme, je ne pourrai pas l'utiliser ailleurs, pourquoi ? Tout simplement parce que j'accède à des objets qui sont sur cette feuille uniquement :

Dim Bon As Boolean = True
If Me.TXT_CONSOMMATION.Text Is Nothing Or Not IsNumeric(Me.TXT_CONSOMMATION.Text) Then
     Bon = False
End If

Ce code crée un booléen à true au début, il vérifie si le texte entré is nothing, donc est nul, ou not isnumeric(), donc n'est pas un numérique.

Si l'une de ces deux conditions est vérfiée (autrement dit crée une erreur lors de l'entrée des caractères), le booléen passe à false. Ce booléen est finalement retourné.

Passons à la fonction calcul(), fonction qui effectue uniquement le calcul nécessaire, cette fonction pourra être réutilisée puisqu'elle a une forme universelle. Je m'explique : on lui passe les valeurs nécessaire et elle effectue le calcul, ce n'est pas elle qui va chercher les valeurs dans les textbox, donc on peut l'utiliser pour lui donner d'autres valeurs.

Voici la ligne essentielle :

Cout = ((NbKm / 100) * Consommation) * PrixEss

Pourquoi toutes les valeurs numériques que tu utilises sont en double ?

Eh bien, parce que le type integer ne prend pas en compte les virgules et donc dans un programme comme celui-ci le double est nécessaire.

Voilà, j'espère que ce TP n'était pas trop dur !

Si vous n'avez pas le même code que moi, pas de panique ! Il y a une infinité de possibilités pour arriver au même résultat sans faire les mêmes choses.

Vous pourriez faire évoluer ce programme, par exemple :

  • Gérer un message d'erreur pour chaque textbox ;

  • Personnaliser le message d'erreur (vide ou mauvaise valeur) ;

  • Créer un bouton « Effacer » qui remet à 0 toutes les valeurs et cache les messages d'erreur.

Dites-vous que ce programme est déjà très bien, il vous apprend à interagir avec les contrôles, utiliser les fonctions, arguments, retours et réactions à une possible erreur. Vous avancez vite !

  • Le mot-clé Handles permet d'écouter les événements.

  • Les événements peuvent être écoutés sur des objets différents : fenêtre principale, composant graphique, pointeur de souris, etc.

  • Chaque événement écouté appelle une fonction.

Example of certificate of achievement
Example of certificate of achievement