In VB6 was een gebeurtenissubroutine, zoals Button1_Click, veel minder gecompliceerd omdat het systeem de subroutine strikt bij naam noemde. Als er een Button1_Click-gebeurtenis was, noemde het systeem deze. Het is direct en duidelijk.
Maar in VB.NET zijn er twee belangrijke upgrades VB.NET SOOPercharged (dat is "OOP" voor Object georiënteerd programmeren).
- De clausule "Handles" bepaalt of het systeem de subroutine aanroept, niet de naam.
- De parameters voor afzender en e worden doorgegeven aan de subroutine.
Gebruik van parameters
Laten we een eenvoudig voorbeeld bekijken om het verschil te zien dat parameters maken in VB.NET.
Private Sub Button1_Click (
ByVal-afzender als systeem. Voorwerp,
ByVal e als systeem. EventArgs
) Knop Handles 1. klikken
'Je code komt hier
Einde Sub
Event-subroutines ontvangen altijd een "sender" -object en een systeem EventArgs-parameter "e". Omdat de EventArgs-parameter een object is, ondersteunt deze alle eigenschappen en methoden die nodig zijn. De oude VB6 MouseMove-gebeurtenissubroutine gebruikte bijvoorbeeld vier parameters:
- Knop als geheel getal
- Verschuiving als geheel getal
- X als single
- Y als single
Toen meer geavanceerde muizen met meer knoppen uitkwamen, had VB6 een echt probleem om ze te ondersteunen. VB.NET passeert slechts één MouseEventArgs-parameter, maar het ondersteunt veel meer eigenschappen en methoden. En elk zijn objecten die nog meer ondersteunen. Bijvoorbeeld de e. De eigenschap Button bevat al deze eigenschappen:
- Links
- Midden
- Rechtsaf
- Geen
- X-knop 1
- X-knop 2
Als iemand een "trancendentale" muis met een "virtuele" knop uitvindt, hoeft VB.NET alleen het .NET Framework bij te werken om het te ondersteunen en zal er geen eerdere code kapot gaan.
Er zijn een aantal .NET-technologieën die absoluut afhankelijk zijn van deze parameters. Omdat uw pc bijvoorbeeld meestal maar één scherm heeft om afbeeldingen weer te geven, moet uw code de afbeeldingen die hij maakt samenvoegen tot dezelfde afbeelding die door Windows wordt gebruikt. Om die reden moet één "grafisch" object worden gedeeld. De belangrijkste manier waarop uw code dat "grafische" object kan gebruiken, is door de e-parameter te gebruiken doorgegeven aan het OnPaint-evenement met het PaintEventArgs-object.
Beveiligde overschrijft Sub OnPaint (
ByVal e als systeem. Ramen. Formulieren. Met PaintEventArgs)
Dim g als afbeeldingen = e. Graphics
Andere voorbeelden
Wat kun je nog meer doen met deze parameters? Stel ter illustratie 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. U kunt voor elk tekstvak enkele tientallen vrijwel identieke subroutines coderen:
Als TextBox42.Text. Index van(
SearchString. Tekst) = -1
Dan niet gevonden. Tekst =
"Niet gevonden"
Maar het is een stuk eenvoudiger om er maar één te coderen en ze allemaal te laten afhandelen. De afzenderparameter zal onthullen op welk tekstvak is geklikt.
Private Sub FindIt (
ByVal-afzender als systeem. Voorwerp,
ByVal e als systeem. EventArgs
) Behandelt TextBox1.Enter,
TextBox2. Invoeren,
... enzovoort.. .
TextBox42.Enter
Dim myTextbox als TextBox
myTextbox = afzender
Dim IndexChar als geheel getal =
myTextbox. Tekst. Index van(
SearchString. Tekst)
Als IndexChar = -1 Dan _
Niet gevonden. Text = "Not Found" _
Anders _
Niet gevonden. Text = "Gevonden!"
Einde Sub
Onlangs vroeg een programmeur me om een betere manier om 'de regel te verwijderen die in een van de zes opgegeven lijsten was aangeklikt'. Hij had het in een paar dozijn regels code die me gewoon in de war brachten. Maar met afzender was het eigenlijk heel simpel:
Private Sub ListBox_Click (
ByVal-afzender als object,
ByVal e als systeem. EventArgs
) Behandelt ListBox1.Click, ListBox2.Click
Dim myListBox als nieuwe ListBox
myListBox = afzender
myListBox. Artikelen. RemoveAt (myListBox. Geselecteerde Index)
Einde Sub
Nog een voorbeeld om het punt vast te leggen, is een vraag die door Pierre in België is gesteld. Pierre testte de gelijkheid van Button1 en afzender met behulp van de Is operator voor objecten:
Als 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 aan Button1, waarom werkt het dan niet?
Het antwoord hangt af van een trefwoord dat iets eerder in de verklaring wordt gevonden. Laten we eerst de Microsoft-documentatie voor de controleren Is operator.
Visual Basic vergelijkt twee objectreferentievariabelen met de Is-operator. Deze operator bepaalt of twee referentievariabelen verwijzen naar dezelfde objectinstantie.
Merk op dat de afzender is geslaagd ByVal. Dat betekent dat er een kopie van Button1 wordt doorgegeven, niet het daadwerkelijke object zelf. Dus als Pierre test om te zien of 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. Tekst wordt meestal gebruikt, maar u kunt een waarde testen in Tag of zelfs in de eigenschap Location.
Deze code werkt:
Dim myButton As Button
myButton = afzender
Als myButton. Text = "Button1" Dan