Procédure pas à pas : gestion des événements (Visual Basic)
Il s’agit de la deuxième des deux rubriques qui montrent comment utiliser les é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 de classe Widget
utilise des instructions traditionnelles de gestion des événements. Visual Basic fournit d’autres techniques d’utilisation des événements. En tant qu’exercice, vous pouvez modifier cet exemple pour utiliser les instructions AddHandler
et Handles
.
Pour gérer l’événement PercentDone de la classe Widget
Placez le code suivant dans
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Le mot clé
WithEvents
spécifie que la variablemWidget
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 dansForm1
car les variablesWithEvents
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 méthodeLongTask
.
Écriture de code pour gérer un événement
Dès que vous déclarez une variable à l’aide de WithEvents
, le nom de la variable apparaît dans la liste déroulante gauche de l’éditeur de code de la classe. Lorsque vous sélectionnez mWidget
, les événements de la classe Widget
s’affichent 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 variable WithEvents
reçoivent le nom de la variable comme préfixe.
Pour gérer un événement
Sélectionnez
mWidget
dans la liste déroulante de gauche dans l’éditeur de code.Sélectionnez l’événement
PercentDone
dans la liste déroulante de droite. L’éditeur de code ouvre la procédure d’événementmWidget_PercentDone
.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 simplement copier les gestionnaires d’événements directement dans votre code.
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 contrôleLabel
. LaDoEvents
méthode permet à l’étiquette de repeindre et donne également à l’utilisateur la possibilité de cliquer sur le bouton Annuler .Ajoutez le code suivant au 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 l’exécution de LongTask
, l’événement Button2_Click
est exécuté dès que l’instruction DoEvents
autorise le traitement de l’événement. La variable mblnCancel
de niveau classe est définie sur True
, et l’événement mWidget_PercentDone
la teste et définit l’argument ByRef Cancel
sur True
.
Connexion d’une variable WithEvents à un objet
Form1
est maintenant configuré pour gérer les événements d’un objet Widget
. Il ne reste plus qu’à trouver un Widget
quelque part.
Lorsque vous déclarez une variable WithEvents
au moment de la conception, aucun objet n’y est associé. Une WithEvents
variable est comme n’importe quelle autre variable d’objet. Vous devez créer un objet et lui attribuer une référence avec la variable WithEvents
.
Pour créer un objet et lui affecter une référence
Sélectionnez (Form1 Events) dans la liste déroulante de gauche dans l’éditeur de code.
Sélectionnez l’événement
Load
dans la liste déroulante de droite. L’éditeur de code ouvre la procédure d’événementForm1_Load
.Ajoutez le code suivant pour la procédure événementielle
Form1_Load
pour créer leWidget
: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 objet Widget
et connecte ses événements aux procédures événementielles associées à mWidget
. À partir de là, chaque fois que le Widget
déclenche son événement PercentDone
, la procédure événementielle mWidget_PercentDone
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 méthode LongTask
, l’étiquette qui affiche le pourcentage d’achèvement doit être initialisée et l’indicateur Boolean
de niveau classe pour l’annulation de la méthode doit être défini sur False
.
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 de seconde. Chaque fois que l’événement est déclenché, la procédure événementielle mWidget_PercentDone
est exécutée.
Quand LongTask
est terminé, mblnCancel
est testé pour voir si LongTask
s’est terminé normalement, ou s’il s’est arrêté parce que mblnCancel
a été défini sur True
. Le pourcentage terminé est mis à jour uniquement dans le cas précédent.
Pour exécuter le programme
Appuyez sur F5 pour placer le projet en mode d’exécution.
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.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’instructionMy.Application.DoEvents
n’autorise pas le traitement des événements.Notes
La méthode
My.Application.DoEvents
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 Modèles gérés.
Vous trouverez peut-être instructif d’exécuter le programme avec F11 et de parcourir le code une ligne à la fois. Vous pouvez voir clairement comment l’exécution entre dans LongTask
, puis rentre brièvement dans Form1
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 méthode LongTask
était appelée à nouveau ? Au pire, un dépassement de pile peut se produire si LongTask
était appelé chaque fois que l’événement a été déclenché.
Vous pouvez amener la variable mWidget
à gérer les événements d’un autre objet Widget
en affectant une référence au nouveau Widget
à mWidget
. En fait, vous pouvez faire en sorte que le code dans Button1_Click
le fasse 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 procédure
Button1_Click
, juste avant la ligne qui litmWidget.LongTask(12.2, 0.33)
:mWidget = New Widget ' Create a new Widget object.
Le code ci-dessus en crée un nouveau Widget
à chaque clic sur le bouton. Une fois la méthode LongTask
terminée, la référence à est Widget
libérée et le Widget
est détruit.
Une variable WithEvents
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. Si mWidget
est la seule variable d’objet contenant une référence à l’ancien Widget
, l’objet est détruit. Si vous souhaitez gérer les événements de plusieurs objets Widget
, utilisez l’instruction AddHandler
pour traiter les événements de chaque objet séparément.
Notes
Vous pouvez déclarer autant de variables WithEvents
que nécessaire, mais les tableaux de variables WithEvents
ne sont pas pris en charge.