In VB6 was een event-subroutine, zoals Button1_Click, veel minder ingewikkeld omdat het systeem de subroutine strikt bij naam noemde. Als er een gebeurtenis Button1_Click bestond, noemde het systeem het. Het is direct en duidelijk.
Maar in VB.NET zijn er twee belangrijke upgrades die VB.NET SOOPercharged maken (dat is "OOP" voor Object Oriented Programming).
Laten we een eenvoudig voorbeeld bekijken om het verschil te zien dat parameters maken in VB.NET.
Private Sub Button1_Click (
ByVal-afzender als System.Object,
ByVal e As System.EventArgs
) Handgrepen Button1.Click
'Uw code komt hier
Einde Sub
Gebeurtenissubroutines ontvangen altijd een "afzender" -object en een systeem EventArgs-parameter "e". Omdat de parameter EventArgs een object is, ondersteunt deze de vereiste eigenschappen en methoden. Bijvoorbeeld, de oude VB6 MouseMove-gebeurtenis-subroutine gebruikte om vier parameters te ontvangen:
Toen meer geavanceerde muizen met meer knoppen uitkwamen, had VB6 een echt probleem met het ondersteunen ervan. VB.NET geeft slechts één parameter MouseEventArgs door, maar ondersteunt nog veel meer eigenschappen en methoden. En elk van hen zijn objecten die nog meer ondersteunen. De eigenschap e.Button bevat bijvoorbeeld al deze eigenschappen:
Als iemand een "transcendentale" muis uitvindt met een "virtuele" knop, hoeft VB.NET alleen het .NET Framework bij te werken om dit te ondersteunen en zal geen eerdere code breken.
Er zijn een aantal .NET-technologieën die absoluut afhankelijk zijn van deze parameters. Omdat uw pc bijvoorbeeld meestal slechts één scherm heeft om afbeeldingen weer te geven, moet uw code de afbeeldingen samenvoegen tot dezelfde afbeelding die door Windows wordt gebruikt. Daarom moet een enkel "grafisch" object worden gedeeld. De belangrijkste manier waarop uw code dat "grafische" object kan gebruiken, is door de parameter e te gebruiken die wordt doorgegeven aan de OnPaint-gebeurtenis met het PaintEventArgs-object.
Beschermde overschrijvingen Sub OnPaint (
ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g As Graphics = e.Graphics
Wat kunt u nog meer doen met deze parameters? Stel dat u wilt weten of een tekenreeks, misschien iets dat u in een tekstvak hebt ingevoerd, voorkomt in een verzameling van andere tekstvakken wanneer u erop klikt. Je zou een paar dozijn vrijwel identieke subroutines voor elk tekstvak kunnen coderen:
Als TextBox42.Text.IndexOf (
SearchString.Text) = -1
Dan NotFound.Text =
"Niet gevonden"
Maar het is een stuk eenvoudiger om er slechts één te coderen en ze allemaal te laten verwerken. De afzenderparameter laat zien op welk tekstvak is geklikt.
Private Sub FindIt (
ByVal-afzender als System.Object,
ByVal e As System.EventArgs
) Handvatten TextBox1.Enter,
TextBox2.Enter,
… enzovoort…
TextBox42.Enter
Dim myTextbox As TextBox
myTextbox = afzender
Dim IndexChar As Integer =
myTextbox.Text.IndexOf (
SearchString.Text)
Als IndexChar = -1 Dan _
NotFound.Text = "Niet gevonden" _
Anders _
NotFound.Text = "Gevonden!"
Einde Sub
Onlangs vroeg een programmeur me om een betere manier om "de regel te verwijderen waarop werd geklikt in een van de zes gespecificeerde lijsten." Hij liet het werken in een paar dozijn regels code die me gewoon in verwarring brachten. Maar met behulp van afzender was het echt vrij eenvoudig:
Private Sub ListBox_Click (
ByVal-afzender als object,
ByVal e As System.EventArgs
) Handvatten ListBox1.Click, ListBox2.Click
Dim myListBox als nieuwe ListBox
myListBox = afzender
myListBox.Items.RemoveAt (myListBox.SelectedIndex)
Einde Sub
Nog een voorbeeld om dit punt nader te omschrijven, is een vraag die Pierre in België heeft ingediend. Pierre testte de gelijkheid van Button1 en afzender met de is operator voor objecten:
Als de afzender knop 1 is, dan ...
Dit is syntactisch correct omdat afzender en Button1 beide objecten zijn waarnaar kan worden verwezen. En aangezien de afzender echt identiek is met Button1, waarom werkt het niet??
Het antwoord is afhankelijk van een trefwoord dat iets eerder in de verklaring wordt gevonden. Laten we eerst de Microsoft-documentatie voor de is operator.
Visual Basic vergelijkt twee objectreferentievariabelen met de operator Is. Deze operator bepaalt of twee referentievariabelen naar dezelfde objectinstantie verwijzen.
Merk op dat de afzender is doorgegeven ByVal. Dat betekent dat een kopie van Button1 wordt doorgegeven, niet het eigenlijke object zelf. Dus wanneer Pierre test of de afzender en Button1 dezelfde instantie zijn, is het resultaat False.
Om te testen of op Button1 of Button2 is geklikt, moet u de afzender in een echt Button-object veranderen en vervolgens een eigenschap van dat object testen. Meestal wordt tekst gebruikt, maar u kunt een waarde in Tag of zelfs de eigenschap Location testen.
Deze code werkt:
Dim mijn knop als knop
myButton = afzender
If myButton.Text = "Button1" Dan