I VB6 var en subroutine af hændelser, som Button1_Click, meget mindre kompliceret, fordi systemet kaldte subroutinen strengt ved navn. Hvis der eksisterede en knap1_Klik-begivenhed, kaldte systemet den. Det er direkte og ligetil.
Men i VB.NET er der to store opgraderinger, der foretages VB.NET SOOPladet (det er "OOP" til Objektorienteret programmering).
- "Håndtag" -klausulen kontrollerer, om systemet kalder underprogrammet, ikke navnet.
- Afsender- og e-parametre sendes til underprogrammet.
Brug af parametre
Lad os se på et simpelt eksempel for at se den forskel, som parametre udgør i VB.NET.
Privat underknap1_Klik (
ByVal afsender som system. Objekt,
ByVal e As System. EventArgs
) Håndtagsknap1.Klik
'Din kode går her
Afslut under
Begivenhedsunderprogrammer modtager altid et "afsender" -objekt og en system EventArgs-parameter "e". Da parameteren EventArgs er et objekt, understøtter den de egenskaber og metoder, der er nødvendige. F.eks. Den gamle VB6 MouseMove-hændelsessubutine, der blev brugt til at modtage fire parametre:
- Knap som heltal
- Skift som heltal
- X som singel
- Y som singel
Da mere avancerede mus kom ud med flere knapper, havde VB6 et reelt problem med at støtte dem. VB.NET passerer kun en MouseEventArgs-parameter, men det understøtter meget flere egenskaber og metoder. Og hver af dem er genstande, der understøtter endnu mere. For eksempel e. Knappeegenskab indeholder alle disse egenskaber:
- Venstre
- Mellemøsten
- Ret
- Ingen
- XButton1
- XButton2
Hvis nogen opfinder en "trancendental" mus med en "virtuel" knap, vil VB.NET kun skulle opdatere .NET Framework for at understøtte den, og ingen tidligere kode vil gå i stykker som resultat.
Der er en række .NET-teknologier, der absolut afhænger af disse parametre. For eksempel, da din pc normalt kun har en enkelt skærm til visning af grafik, skal din kode flette den grafik, den opretter, til det samme billede, der bruges af Windows. Derfor skal et enkelt "grafik" -objekt deles. Den vigtigste måde, hvorpå din kode er i stand til at bruge det "grafik" -objekt, er at bruge den e-parameter, der er overført til OnPaint-begivenheden med PaintEventArgs-objektet.
Protected Overrides Sub OnPaint (
ByVal e As System. Windows. Formularer. PaintEventArgs)
Dim g Som grafik = e. Grafik
Andre eksempler
Hvad kan du ellers gøre med disse parametre? For at illustrere skal du antage, at du vil finde ud af, om en streng, måske noget, du har indtastet i en tekstboks, findes i en af en samling af andre tekstbokse, når du klikker på en. Du kan kode et par dusin næsten identiske underprogrammer for hver tekstboks:
Hvis TextBox42.Text. Indeks af(
SearchString. Tekst) = -1
Så NotFound. Tekst =
"Ikke fundet"
Men det er meget nemmere at kode kun en og lade den håndtere dem alle. Afsenderparameteren afslører, hvilken tekstboks der blev klikket på.
Privat sub FindIt (
ByVal afsender som system. Objekt,
ByVal e As System. EventArgs
) Håndterer TextBox1.Enter,
TextBox2.Enter,
... og til og med.. .
TextBox42.Enter
Dim myTextbox som TextBox
myTextbox = afsender
Dim indeksChar som heltal =
mintekstboks. Tekst. Indeks af(
SearchString. Tekst)
Hvis IndexChar = -1 Så _
Ikke fundet. Tekst = "Ikke fundet" _
Ellers _
Ikke fundet. Tekst = "Fundet det!"
Afslut under
For nylig bad en programmør mig om en bedre måde at "slette den linje, der blev klikket på en af de seks specificerede lister." Han fik det til at arbejde i et par dusin linjer med kode, der simpelthen forvirrede mig. Men ved hjælp af afsender var det virkelig ganske enkelt:
Privat underlisteBox_Klik (
ByVal afsender som objekt,
ByVal e As System. EventArgs
) Håndterer ListBox1.Click, ListBox2.Click
Dim myListBox som ny ListBox
myListBox = afsender
myListBox. Elementer. FjernAt (myListBox. SelectedIndex)
Afslut under
Et yderligere eksempel på at negle punktet er et spørgsmål, der blev sendt af Pierre i Belgien. Pierre testede ligheden mellem Button1 og afsender ved hjælp af Er operator til objekter:
Hvis afsender er knap1 Så ...
Dette er syntaktisk korrekt, fordi afsender og knap1 begge er objekter, der kan henvises til. Og da afsender virkelig er identisk med Button1, hvorfor fungerer det ikke?
Svaret afhænger af et nøgleord, der findes lidt tidligere i erklæringen. Lad os først kontrollere Microsoft-dokumentationen for Er operatør.
Visual Basic sammenligner to objektreferencevariabler med Is Operator. Denne operator bestemmer, om to referencevariabler refererer til den samme objektforekomst.
Bemærk, at afsenderen er bestået ByVal. Det betyder, at en kopi af knap1 sendes, ikke selve objektet. Så når Pierre tester for at se, om afsender og knap1 er den samme instans, er resultatet falsk.
For at teste, om der er klikket på knap1 eller knap2, skal du omdanne afsender til et faktisk knapobjekt og derefter teste en egenskab for det pågældende objekt. Tekst bruges normalt, men du kan teste en værdi i Tag eller endda egenskaben Placering.
Denne kode fungerer:
Dæmp myButton som knap
myButton = afsender
Hvis myButton. Tekst = "Knap1" Derefter