Aller au menu - Aller au contenu

Icône Les évènements

Avatar
Mise à jour : 13/12/2010
Difficulté : Facile Facile Creative Commons BY-NC-SA
23 410 visites depuis 7 jours, dont 571 sur ce chapitre classé 14/786
Bon, attaquons maintenant réellement les évènements.

Je vous ai déjà expliqué un évènement, le form_load. Eh bien apprenons à les découvrir pour réagir a plein d'autres choses, un clic, une touche, une ouverture, une fermeture, que sais-je encore, les possibilités sont énormes.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Pourquoi ça encore !

Alors un événement s'écrit comme un sub : exemple l'évènement form load.
Code : VB.NET
1
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 a 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ées 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é.

Code : VB.NET
1
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 : car un événement attends 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 sur le clic du bouton ?

Eh bien allons-y ! Comme pour générer l'évènement form load, double cliquons sur notre bouton !

Automatiquement l'IDE me crée :
Code : VB.NET
1
2
3
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 les instructions voulues dedans, fainéant de nature, je déplace simplement celles que nous avions écrites dans le form_load :

Code : VB.NET
1
2
3
4
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 je dirais, pour un bouton : le clic, pour une textbox : le changement de texte etc...

Mais pourquoi se limiter à cela puisque 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 puisque un assistant le fait pour nous, enfin, fait la moitié du travail :p !

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 : ".", voilà la liste d'évènements de l'objet fenêtre s'ouvrir à nous :

Image utilisateur

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

Tout d'abord, petite dédicace à mon prof d'info, je le remercie pour ses efforts pour me supporter :-° .

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/100km)
  • le nombre de kilomètres
  • le prix de l'essence (en euros)


Que l'utilisateur entrera 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 peut marcher vos méninges, c'est aussi ça la programmation !

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

Bonne chance !

Correction


J'espère que vous avez trouvé tous seuls, je vous avais tout expliqués ! Bon je vous montre !

Tout d'abord les résultats :

Image utilisateur

Image utilisateur


Bon l'explication des objets : j'ai placé 3 textbox, une pour chaque valeur a 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'agirais pas dessus pendant le programme, alors autant laisser comme ils sont.

Ensuite je leur ai attribués 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'ai écrit le texte "calculer" dedans.

Il reste 2 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 !

Secret (cliquez pour afficher)
Code : VB.NET
 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
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>
    ''' Verifie les 3 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 nb 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 cout 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ée 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 3 textbox et j'écris le résultat sous la forme "Le cout du voyage sera de XX?".

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

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

Code : VB.NET
1
2
3
4
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 booleen à true au début, il vérifie si le texte entré is nothing donc est nul ou not isnumeric() donc si ce n'est pas un numérique.

Si l'une de ces 2 conditions est présente (autrement dit 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 puisque 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.

la ligne essentielle :
Code : VB.NET
1
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 prends 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é d'arriver au même résultat sans faire les mêmes choses.

Vous pourriez le faire évoluer ce programme par exemple
  • Gérer un message d'erreur pour chaque txtbox
  • Message d'erreur personnalisé (vide ou mauvaise valeur)
  • Un bouton "effacer" qui remet à 0 toutes les valeurs et cache les message d'erreurs


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éaction à une possible erreur. Vous avancez vite !

Q.C.M.

Que signifie "Handles" ?
Quel Handles va être appelé pour le chargement de notre fenêtre ?
Code : VB.NET
1
Handles MyBase.BackColorChanged


Se déclenchera quand ?

Statistiques de réponses au QCM

Chapitre précédent Sommaire Chapitre suivant

Partager

18 commentaires pour "Les évènements"
Note moyenne : 3.60 / 4 (543 votes)
Pseudo Commentaire
Hors ligne John-Bob # Posté le 10/02/2012 à 18:04:02

Avis : Bon

Tu n'es pas toujours très clair dans tes tutos mais bon, ils restent SUPER :) (j'en suis au timer :) d'ailleurs je te remercie pour tes tutos)
Bref, j'ai une petite question :

Est-il possible de créer un événement qui "s'active" quand une valeur est égal à une autre ?
Hors ligne bricomachin # Posté le 21/02/2012 à 22:38:17
Avatar

Ville : Ropraz
Pays : Suisse

Bonjour,

Je trouve ce tuto super mais j'ai un petit problème au niveau du TP du voyage. En effet je n'ai pas la même correction et la mienne a un petit "bug" : si j'entre des nombres à "point" (pas de virgule mais des points) cela de marche que si il n'y a qu'un seul des trois nombre qui est un nombre à "point" (n'importe lequel).

Exemple 1 Exemple 2 Exemple 3
3.2 3.2 3.2
5 5.2 5.0
2 2 2
OK PAS OK OK

En plus je voudrais qu'il me marque Ça va couter $$$ Sfr.(francs suisses) mais ça me marque Ça va couter $$$ et c'est tout. Et même pas de $$$ si PAS OK.

Mon code :
Secret (cliquez pour afficher)
Code : VB.NET
 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
Public Class Form1

    Private Sub BT_CALCULER_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BT_CALCULER.Click
        If IsNumeric(TXT_CONSOMMATION.Text) And IsNumeric(TXT_KILOMETRES.Text) And IsNumeric(TXT_PRIX_ESSENCE.Text) Then

            Me.LBL_ERREUR.Hide()
            Me.LBL_PRIX_TOTAL.Show()

            Me.LBL_PRIX_TOTAL.Text = "Le voyage coutera " & Calcul(TXT_CONSOMMATION.Text, TXT_KILOMETRES.Text, TXT_PRIX_ESSENCE.Text) & " Sfr."

        Else
            Me.LBL_PRIX_TOTAL.Hide()
            Me.LBL_ERREUR.Show()
        End If
    End Sub
    ''' <summary>
    ''' Calcule le prix d'un voyage en fonction de la consommation, du prix de l'essence, et du nb 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 cout 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


Alors je me demandais si vous aviez une solution...

Merci d'avance,

Bricomachin

Citation : Albert Einstein
Il n'y a que deux chose infinies : l'univers et la bêtise humaine. Mais pour l'univers je n'ai pas de certitude absolue.


 
Hors ligne buea # Posté le 26/02/2012 à 22:43:09

tres bon tuto et merci
Hors ligne buea # Posté le 27/02/2012 à 21:24:45

salut kevinn77
peux tu me passer ton code STP
je ne comprends pas bien le code des autres
merci
Hors ligne djmcg # Posté le 26/04/2012 à 05:22:15
Pour avancer, il faut savoir a

Avis : Très bon

Ville : Grâce-berleur
Pays : Belgique

Merci pour ce tuto, pas trop de matière à la voix, cela me va bien.
Bien que j'en 'ai pas le même code que la correction, mon petit programme voyage fonctionne.
Merci pour votre aide.
 

Voir tous les commentaires