Dans VB6, un sous-programme d'événement, comme Button1_Click, était beaucoup moins compliqué car le système appelait le sous-programme strictement par son nom. Si un événement Button1_Click existait, le système l'a appelé. C'est direct et simple.
Mais dans VB.NET, il existe deux mises à niveau majeures qui rendent VB.NET SOOPercharged (c'est "OOP" pour la programmation orientée objet).
Regardons un exemple simple pour voir la différence que les paramètres font dans VB.NET.
Sous-bouton privé1_Click (
Expéditeur ByVal en tant que System.Object,
ByVal e As System.EventArgs
) Poignées Button1.Click
«Votre code va ici
End Sub
Les sous-programmes d'événements reçoivent toujours un objet "expéditeur" et un paramètre EventArgs système "e". Étant donné que le paramètre EventArgs est un objet, il prend en charge toutes les propriétés et méthodes nécessaires. Par exemple, l'ancien sous-programme d'événement VB6 MouseMove recevait quatre paramètres:
Lorsque des souris plus avancées ont sorti plus de boutons, VB6 a eu un vrai problème à les supporter. VB.NET ne transmet qu'un seul paramètre MouseEventArgs mais il prend en charge beaucoup plus de propriétés et de méthodes. Et chacun d'eux sont des objets qui supportent encore plus. Par exemple, la propriété e.Button contient toutes ces propriétés:
Si quelqu'un invente une souris "trancendental" avec un bouton "virtuel", VB.NET n'aura qu'à mettre à jour le .NET Framework pour le prendre en charge et aucun code précédent ne se cassera en conséquence.
Il existe un certain nombre de technologies .NET qui dépendent absolument de ces paramètres. Par exemple, puisque votre PC n'a généralement qu'un seul écran pour afficher les graphiques, votre code doit fusionner les graphiques qu'il crée dans la même image utilisée par Windows. Pour cette raison, un seul objet "graphique" doit être partagé. La façon principale dont votre code est capable d'utiliser cet objet "graphiques" est d'utiliser le paramètre e qui est passé à l'événement OnPaint avec l'objet PaintEventArgs.
Substitutions protégées Sub OnPaint (
ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g As Graphics = e.Graphics
Que pouvez-vous faire d'autre avec ces paramètres? À titre d'illustration, supposons que vous vouliez savoir si une chaîne, peut-être quelque chose que vous avez entrée dans une zone de texte, existe dans l'une des collections d'autres zones de texte lorsque vous cliquez dessus. Vous pouvez coder quelques dizaines de sous-programmes pratiquement identiques pour chaque zone de texte:
Si TextBox42.Text.IndexOf (
SearchString.Text) = -1
Alors NotFound.Text =
"Pas trouvé"
Mais il est beaucoup plus facile d'en coder un seul et de le laisser les gérer tous. Le paramètre expéditeur révélera la zone de texte sur laquelle vous avez cliqué.
Private Sub FindIt (
Expéditeur ByVal en tant que System.Object,
ByVal e As System.EventArgs
) Gère TextBox1.Enter,
TextBox2.Enter,
… et ainsi de suite…
TextBox42.Enter
Dim myTextbox As TextBox
myTextbox = expéditeur
Dim IndexChar As Integer =
myTextbox.Text.IndexOf (
SearchString.Text)
Si IndexChar = -1 Alors _
NotFound.Text = "Introuvable" _
Autre _
NotFound.Text = "Trouvé!"
End Sub
Récemment, un programmeur m'a demandé un meilleur moyen de "supprimer la ligne sur laquelle vous avez cliqué dans l'une des six listes spécifiées". Il l'a fait fonctionner dans quelques dizaines de lignes de code qui m'ont simplement dérouté. Mais en utilisant l'expéditeur, c'était vraiment assez simple:
Sous-liste privéeBox_Click (
Expéditeur ByVal en tant qu'objet,
ByVal e As System.EventArgs
) Gère ListBox1.Click, ListBox2.Click
Dim myListBox comme nouveau ListBox
myListBox = expéditeur
myListBox.Items.RemoveAt (myListBox.SelectedIndex)
End Sub
Un autre exemple pour clouer le point est une question qui a été envoyée par Pierre en Belgique. Pierre testait l'égalité de Button1 et de l'expéditeur à l'aide du Est opérateur pour les objets:
Si l'expéditeur est Button1, alors…
Ceci est syntaxiquement correct car l'expéditeur et Button1 sont tous deux des objets qui peuvent être référencés. Et puisque l'expéditeur est vraiment identique à Button1, pourquoi ça ne marche pas?
La réponse dépend d'un mot-clé qui se trouve un peu plus tôt dans l'instruction. Tout d'abord, vérifions la documentation Microsoft pour le Est opérateur.
Visual Basic compare deux variables de référence d'objet avec l'opérateur Is. Cet opérateur détermine si deux variables de référence se réfèrent à la même instance d'objet.
Notez que l'expéditeur est dépassé ByVal. Cela signifie qu'une copie de Button1 est passée, pas l'objet réel lui-même. Donc, lorsque Pierre teste pour voir si l'expéditeur et Button1 sont la même instance, le résultat est False.
Pour tester si Button1 ou Button2 a été cliqué, vous devez transformer l'expéditeur en un objet Button réel, puis tester une propriété de cet objet. Le texte est généralement utilisé, mais vous pouvez tester une valeur dans Tag ou même dans la propriété Location.
Ce code fonctionne:
Bouton Dim myButton As
myButton = expéditeur
Si myButton.Text = "Button1" Alors