Procédure pas à pas : déclaration et déclenchement des événements (Visual Basic)

Cette procédure pas à pas montre comment déclarer et déclencher des événements pour une classe nommée Widget. Une fois les étapes terminées, vous pouvez lire la rubrique complémentaire Procédure pas à pas : gestion des événements, qui montre comment utiliser des événements d’objets Widget pour fournir des informations status dans une application.

La classe Widget

Supposons pour le moment que vous ayez une classe Widget. Votre classe Widget a une méthode qui peut prendre beaucoup de temps à s’exécuter, et vous souhaitez que votre application puisse mettre en place un type d’indicateur d’achèvement.

Bien sûr, vous pouvez faire en sorte que l’objet Widget affiche une boîte de dialogue de pourcentage complet, mais vous seriez alors bloqué avec cette boîte de dialogue dans chaque projet dans lequel vous avez utilisé la classe Widget. Un bon principe de conception d’objet consiste à laisser l’application qui utilise un objet gérer l’interface utilisateur, sauf si l’objet entier de l’objet est de gérer un formulaire ou une boîte de dialogue.

L’objectif de Widget étant d’effectuer d’autres tâches, il est préférable d’ajouter un événement PercentDone et de laisser la procédure qui appelle les méthodes de Widget gérer cet événement et afficher les mises à jour de statut. L’événement PercentDone peut également fournir un mécanisme d’annulation de la tâche.

Pour générer l’exemple de code pour cette rubrique

  1. Ouvrez un nouveau projet d'application Windows Visual Basic et créez un formulaire nommé Form1.

  2. Ajoutez deux boutons et une étiquette à Form1.

  3. Nommez les objets de la façon indiquée dans le tableau suivant.

    Object Propriété Paramètre
    Button1 Text Tâche de démarrage
    Button2 Text Annuler
    Label (Name), Text lblPercentDone, 0
  4. Dans le menu Projet, sélectionnez Ajouter une classe pour ajouter une classe Widget.vb au projet.

Pour déclarer un événement pour la classe Widget

  • Utilisez le mot clé Event pour déclarer un événement dans la classe Widget. Notez qu’un événement peut avoir des arguments ByVal et ByRef, comme l’événement de Widgetle montre PercentDone :

    Public Event PercentDone(ByVal Percent As Single,
                             ByRef Cancel As Boolean)
    

Lorsque l’objet appelant reçoit un événement PercentDone, l’argument Percent contient le pourcentage de la tâche terminée. L’argument Cancel peut être défini sur True pour annuler la méthode qui a déclenché l’événement.

Notes

Vous pouvez déclarer des arguments d’événement de la même manière que des arguments de procédures, avec les exceptions suivantes : les événements ne peuvent pas avoir d’arguments nommés, d’arguments Optional ni d’arguments ParamArray.

L'événement PercentDone est déclenché par la méthode LongTask de la classe Widget. LongTask prend deux arguments : la durée pendant laquelle la méthode prétend effectuer un travail et l’intervalle de temps minimal avant que LongTask ne s’interrompt pour déclencher l’événement PercentDone .

Pour déclencher l'événement PercentDone

  1. Pour simplifier l’accès à la propriété Timer utilisée par cette classe, ajoutez une instruction Imports en haut de la section déclarations de votre module de classe, au-dessus de l’instruction Class Widget .

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. Ajoutez le code suivant à la classe Widget :

    Public Sub LongTask(ByVal Duration As Single,
                        ByVal MinimumInterval As Single)
        Dim Threshold As Single
        Dim Start As Single
        Dim blnCancel As Boolean
    
        ' The Timer property of the DateAndTime object returns the seconds
        ' and milliseconds that have passed since midnight.
        Start = CSng(Timer)
        Threshold = MinimumInterval
    
        Do While CSng(Timer) < (Start + Duration)
            ' In a real application, some unit of work would
            ' be done here each time through the loop.
            If CSng(Timer) > (Start + Threshold) Then
                RaiseEvent PercentDone(
                Threshold / Duration, blnCancel)
                ' Check to see if the operation was canceled.
                If blnCancel Then Exit Sub
                Threshold = Threshold + MinimumInterval
            End If
        Loop
    End Sub
    

Lorsque votre application appelle la méthodeLongTask, la classe Widget déclenche l’événement PercentDone toutes les MinimumInterval secondes. Lorsque l’événement est retourné, LongTask vérifie si l’argument Cancel a la valeur True.

Quelques exclusions de responsabilité sont nécessaires ici. Par souci de simplicité, la procédure LongTask suppose que vous savez à l’avance combien de temps la tâche prendra. Ce n’est presque jamais le cas. La division des tâches en blocs de taille égale peut être difficile, et souvent ce qui compte le plus pour les utilisateurs est simplement le temps qui passe avant qu’ils obtiennent une indication que quelque chose se passe.

Vous avez peut-être détecté un autre défaut dans cet exemple. La propriété Timer retourne le nombre de secondes qui se sont écoulées depuis minuit ; par conséquent, l’application est bloquée si elle est démarrée juste avant minuit. Une approche plus prudente de la mesure du temps tiendrait compte des conditions limites telles que celle-ci, ou les éviterait complètement, à l’aide de propriétés telles que Now.

Maintenant que la classe Widget peut déclencher des événements, vous pouvez passer à la procédure pas à pas suivante. Procédure pas à pas : gestion des événements montre comment utiliser WithEvents pour associer un gestionnaire d’événements à l’événement PercentDone .

Voir aussi