Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Il s’agit du deuxième des deux sujets qui indiquent comment travailler avec 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 de Widget classe utilise des instructions de gestion des événements traditionnelles. Visual Basic fournit d'autres techniques pour travailler avec les événements. En guise d'exercice, vous pouvez modifier cet exemple pour utiliser les 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 BooleanLe
WithEventsmot clé spécifie que la variablemWidgetest 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
mWidgetest déclarée dansForm1parce que les variablesWithEventsdoivent être au niveau de la classe. Cela est vrai quel que soit le type de classe dans lequel vous les placez.La variable
mblnCancelest utilisée pour annuler laLongTaskmé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 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 d’événement associées à une WithEvents variable reçoivent le nom de la variable comme préfixe.
Pour gérer un événement
Sélectionnez-le
mWidgetdans la liste déroulante de gauche dans l’Éditeur de code.Sélectionnez l’événement
PercentDonedans la liste déroulante de droite. L’Éditeur de code ouvre lamWidget_PercentDoneprocédure événementielle.Remarque
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.
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 SubChaque fois que l’événement
PercentDoneest déclenché, la procédure événementielle affiche le pourcentage terminé dans un contrôleLabel. LaDoEventsméthode permet à l’étiquette de repeindre, et donne également à l’utilisateur la possibilité de cliquer sur le bouton Annuler .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 au niveau de la classe mblnCancel est définie à True, et l’événement mWidget_PercentDone la teste, puis 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 Widget objet. Il ne reste qu'à trouver un Widget quelque part.
Lorsque vous déclarez une variable WithEvents au moment du design, aucun objet n’est associé à celui-ci. Une WithEvents variable est tout comme n’importe quelle autre variable d’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
Sélectionnez (Événements Form1) dans la liste déroulante de gauche dans l’Éditeur de code.
Sélectionnez l’événement
Loaddans la liste déroulante de droite. L’Éditeur de code ouvre laForm1_Loadprocédure événementielle.Ajoutez le code suivant pour la procédure d'événement
Form1_Loadafin de 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 Widget objet et connecte ses événements aux procédures événementielles associées mWidget. À partir de ce stade, chaque fois que Widget lève son événement PercentDone, la procédure d'événement 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 que la méthode LongTask soit appelée, l'étiquette qui affiche le pourcentage terminé doit être initialisée, et le marqueur au niveau de la classe Boolean 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 par 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 est effectué, 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 de complétion est mis à jour uniquement dans le premier cas.
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
PercentDoneest 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
Clickne peut pas se produire tant que l'instructionMy.Application.DoEventsn'autorise pas le traitement des événements.Remarque
La
My.Application.DoEventsmé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 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 LongTask méthode a été appelée à nouveau ? Au pire, un dépassement de la capacité de la pile peut se produire si LongTask a été appelé à chaque déclenchement de l’événement.
Vous pouvez faire en sorte que la variable mWidget gère des événements pour un autre objet Widget en assignant une référence au nouveau Widget à mWidget. En fait, vous pouvez programmer le code dans Button1_Click pour qu'il fasse cela 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_Clickprocédure, juste avant la ligne qui litmWidget.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 méthode LongTask se termine, la référence à Widget est libérée et Widget est détruit.
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, mWidgetles événements de l’objet précédent Widget ne seront plus gérés. S’il mWidget s’agit de la seule variable d’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.
Remarque
Vous pouvez déclarer autant de variables WithEvents que nécessaire, mais les tableaux de variables WithEvents ne sont pas pris en charge.