Procédure pas à pas : gestion des événements (Visual Basic)

Il s’agit de la deuxième des deux rubriques qui montrent comment utiliser des événements. La première rubrique, Procédure pas à pas : Déclaration et déclenchement d’événements, montre comment déclarer et déclencher des événements. Cette section utilise le formulaire et la classe de cette procédure pas à pas pour montrer comment gérer les événements lorsqu’ils ont lieu.

L’exemple Widget de classe utilise des instructions traditionnelles de gestion des événements. Visual Basic fournit d’autres techniques pour travailler avec des événements. En tant qu’exercice, vous pouvez modifier cet exemple pour utiliser les instructions et Handles les AddHandler instructions.

Pour gérer l’événement PercentDone de la classe Widget

  1. Placez le code suivant dans Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    Le WithEvents mot clé spécifie que la variable mWidget est utilisée pour gérer les événements d’un objet. Vous spécifiez le type d’objet en fournissant le nom de la classe à partir de laquelle l’objet sera créé.

    La variable mWidget est déclarée car Form1WithEvents les variables doivent être au niveau de la classe. Cela est vrai quel que soit le type de classe dans lequel vous les placez.

    La variable mblnCancel est utilisée pour annuler la LongTask méthode.

Écriture de code pour gérer un événement

Dès que vous déclarez une variable à l’aide WithEventsde , le nom de la variable apparaît dans la liste déroulante de gauche de l’éditeur de code de la classe. Lorsque vous sélectionnez mWidget, les événements de la Widget classe apparaissent dans la liste déroulante de droite. La sélection d’un événement affiche la procédure événementielle correspondante, avec le préfixe mWidget et un trait de soulignement. Toutes les procédures événementielles associées à une WithEvents variable reçoivent le nom de la variable comme préfixe.

Pour gérer un événement

  1. Sélectionnez mWidget dans la liste déroulante de gauche dans l’Éditeur de code.

  2. Sélectionnez l’événement PercentDone dans la liste déroulante de droite. L’Éditeur de code ouvre la mWidget_PercentDone procédure événementielle.

    Notes

    L’Éditeur de code est utile, mais pas obligatoire, pour insérer de nouveaux gestionnaires d’événements. Dans cette procédure pas à pas, il est plus direct de copier simplement les gestionnaires d’événements directement dans votre code.

  3. Ajoutez le code suivant au gestionnaire d'événements mWidget_PercentDone :

    Private Sub mWidget_PercentDone(
        ByVal Percent As Single,
        ByRef Cancel As Boolean
    ) Handles mWidget.PercentDone
        lblPercentDone.Text = CInt(100 * Percent) & "%"
        My.Application.DoEvents()
        If mblnCancel Then Cancel = True
    End Sub
    

    Chaque fois que l’événement PercentDone est déclenché, la procédure événementielle affiche le pourcentage complet dans un Label contrôle. La DoEvents méthode permet à l’étiquette de repeint et donne également à l’utilisateur la possibilité de cliquer sur le bouton Annuler .

  4. Ajoutez le code suivant pour le gestionnaire d’événements Button2_Click :

    Private Sub Button2_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button2.Click
        mblnCancel = True
    End Sub
    

Si l’utilisateur clique sur le bouton Annuler pendant LongTask l’exécution, l’événement Button2_Click est exécuté dès que l’instruction autorise le DoEvents traitement des événements. La variable mblnCancel de niveau classe est définie Truesur , et l’événement le mWidget_PercentDone teste et définit l’argument Truesur ByRef Cancel .

Connexion d’une variable WithEvents à un objet

Form1 est maintenant configuré pour gérer les événements d’un Widget objet. Tout ce qui reste est de trouver un Widget endroit.

Lorsque vous déclarez une variable WithEvents au moment du design, aucun objet n’est associé. Une WithEvents variable est tout comme n’importe quelle autre variable objet. Vous devez créer un objet et lui attribuer une référence avec la WithEvents variable.

Pour créer un objet et lui attribuer une référence

  1. Sélectionnez (Événements Form1) dans la liste déroulante de gauche dans l’Éditeur de code.

  2. Sélectionnez l’événement Load dans la liste déroulante de droite. L’Éditeur de code ouvre la Form1_Load procédure événementielle.

  3. Ajoutez le code suivant pour la Form1_Load procédure événementielle pour créer :Widget

    Private Sub Form1_Load(
        ByVal sender As System.Object,
        ByVal e As System.EventArgs
    ) Handles MyBase.Load
        mWidget = New Widget
    End Sub
    

Lorsque ce code s’exécute, Visual Basic crée un Widget objet et connecte ses événements aux procédures événementielles associéesmWidget. À partir de là, chaque fois que l’événement Widget déclenche son PercentDone événement, la mWidget_PercentDone procédure événementielle est exécutée.

Pour appeler la méthode LongTask

  • Ajoutez le code suivant au gestionnaire d'événements Button1_Click :

    Private Sub Button1_Click(
        ByVal sender As Object,
        ByVal e As System.EventArgs
    ) Handles Button1.Click
        mblnCancel = False
        lblPercentDone.Text = "0%"
        lblPercentDone.Refresh()
        mWidget.LongTask(12.2, 0.33)
        If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%"
    End Sub
    

Avant l’appel de la LongTask méthode, l’étiquette qui affiche le pourcentage terminé doit être initialisée, et l’indicateur de niveau Boolean classe pour l’annulation de la méthode doit être défini Falsesur .

LongTask est appelé avec une durée de tâche de 12,2 secondes. L’événement PercentDone est déclenché une fois tous les tiers d’une seconde. Chaque fois que l’événement est déclenché, la mWidget_PercentDone procédure événementielle est exécutée.

Lorsque LongTask vous avez terminé, mblnCancel il est testé pour voir s’il LongTask s’est terminé normalement, ou s’il s’est arrêté parce qu’il mblnCancel a été défini Truesur . Le pourcentage terminé est mis à jour uniquement dans l’ancien cas.

Pour exécuter le programme

  1. Appuyez sur F5 pour placer le projet en mode Exécution.

  2. Cliquez sur le bouton Démarrer la tâche . Chaque fois que l’événement PercentDone est déclenché, l’étiquette est mise à jour avec le pourcentage de la tâche terminée.

  3. Cliquez sur le bouton Annuler pour arrêter la tâche. Notez que l’apparence du bouton Annuler ne change pas immédiatement lorsque vous cliquez dessus. L’événement Click ne peut pas se produire tant que l’instruction n’autorise pas le My.Application.DoEvents traitement des événements.

    Notes

    La My.Application.DoEvents méthode ne traite pas exactement les événements de la même façon que le formulaire. Par exemple, dans cette procédure pas à pas, vous devez cliquer deux fois sur le bouton Annuler . Pour permettre au formulaire de gérer directement les événements, vous pouvez utiliser le multithreading. Pour plus d’informations, consultez Managed Threading.

Vous pouvez trouver qu’il est instructif d’exécuter le programme avec F11 et de parcourir le code une ligne à la fois. Vous pouvez clairement voir comment l’exécution entre LongTask, puis réinscrire Form1 brièvement chaque fois que l’événement PercentDone est déclenché.

Que se passerait-il si, alors que l’exécution était de retour dans le code de Form1, la LongTask méthode a été appelée à nouveau ? Au pire, un dépassement de capacité de pile peut se produire s’il LongTask a été appelé chaque fois que l’événement a été déclenché.

Vous pouvez faire en sorte que la variable mWidget gère les événements d’un autre Widget objet en affectant une référence au nouveauWidget.mWidget En fait, vous pouvez effectuer ce code Button1_Click chaque fois que vous cliquez sur le bouton.

Pour gérer les événements d’un autre widget

  • Ajoutez la ligne de code suivante à la Button1_Click procédure, juste avant la ligne qui lit mWidget.LongTask(12.2, 0.33):

    mWidget = New Widget
    ' Create a new Widget object.
    

Le code ci-dessus crée un nouveau Widget chaque fois que le bouton est cliqué. Dès que la LongTask méthode se termine, la référence à celle-ci Widget est libérée et la Widget méthode est détruite.

Une WithEvents variable ne peut contenir qu’une seule référence d’objet à la fois. Par conséquent, si vous affectez un autre Widget objet mWidget, les événements de l’objet précédent Widget ne seront plus gérés. S’il mWidget s’agit de la seule variable objet contenant une référence à l’ancien Widget, l’objet est détruit. Si vous souhaitez gérer des événements à partir de plusieurs Widget objets, utilisez l’instruction AddHandler pour traiter les événements de chaque objet séparément.

Notes

Vous pouvez déclarer autant de WithEvents variables que nécessaire, mais les tableaux de WithEvents variables ne sont pas pris en charge.

Voir aussi