V VB6 je bila podprogram dogodka, kot je Button1_Click, precej manj zapleten, ker je sistem imenoval podprogram strogo po imenu. Če je obstajal dogodek Button1_Click, ga je sistem poklical. Je neposreden in neposreden.
Toda v VB.NET obstajata dve večji nadgradnji VB.NET SOOPercharged (to je "OOP" za Objektno usmerjeno programiranje).
- Klavzula "Ročaji" nadzoruje, ali sistem pokliče podprogram in ne ime.
- Parametra pošiljatelja in e posredujeta podprogramu.
Uporaba parametrov
Poglejmo si preprost primer, da vidimo, kakšna je razlika v parametrih VB.NET.
Zasebni pod gumb1_Click (
ByVal pošiljatelj kot sistem. Predmet,
ByVal e As System. EventArgs
) Ročaji s tipko1.Klik
"Vaša koda je tukaj
Končni pod
Podprogrami dogodkov vedno prejmejo predmet "pošiljatelj" in sistemski parameter EventArgs "e". Ker je parameter EventArgs objekt, podpira vse lastnosti in metode, ki so potrebne. Na primer, podprogram za dogodek VB6 MouseMove, ki je bil uporabljen za prejem štirih parametrov:
- Gumb Kot celoten
- Shift kot celoten
- X Kot samski
- Y Kot samski
Ko so se naprednejše miši pojavile z več gumbi, je imel VB6 resnično težavo pri njihovi podpori. VB.NET prenese samo en parameter MouseEventArgs, vendar podpira veliko več lastnosti in metod. In vsak od njih je predmet, ki podpira še več. Na primer, e. Lastnost gumba vsebuje vse te lastnosti:
- Levo
- Srednji
- Prav
- Noben
- XButton1
- XButton2
Če nekdo izumi "trancendentalno" miško z "virtualnim" gumbom, bo moral VB.NET posodobiti samo .NET Framework le za podporo in nobena prejšnja koda se ne bo zlomila.
Obstaja več tehnologij .NET, ki so popolnoma odvisne od teh parametrov. Na primer, ker ima računalnik običajno samo en zaslon za prikaz grafike, mora vaša koda grafiko, ki jo ustvari, združiti v isto sliko, kot jo uporablja Windows. Zaradi tega je treba deliti en sam "grafični" predmet. Glavni način, da vaša koda lahko uporabi ta "grafični" objekt, je uporaba parametra e, ki je prenese na dogodek OnPaint s predmetom PaintEventArgs.
Zaščiteno preglasovanje Sub OnPaint (
ByVal e As System. Windows. Obrazci. PaintEventArgs)
Dim g kot grafika = e. Grafika
Drugi primeri
Kaj še lahko storite s temi parametri? Za ponazoritev predpostavimo, da želite ugotoviti, ali niz, morda nekaj, kar ste vnesli v Textbox, obstaja v kateri koli od zbirk drugih besedilnih polj, ko kliknete na eno. Za vsako besedilno polje lahko kodirate nekaj deset skoraj enakih podprogramov:
Če TextBox42.Text. Indeks(
SearchString. Besedilo) = -1
Potem NotFound. Besedilo =
"Ni najdeno"
Vendar je veliko lažje kodirati samo enega in ga pustiti, da obvladuje vse. Parameter pošiljatelja bo razkril, na katerega kliku je bil Textbox.
Zasebni Sub FindIt (
ByVal pošiljatelj kot sistem. Predmet,
ByVal e As System. EventArgs
) Ročaji TextBox1.Enter,
TextBox2.Enter,
... in naprej in naprej.. .
TextBox42.Enter
Zatemni myTextbox kot TextBox
myTextbox = pošiljatelj
Dim IndexChar As Integer =
myTextbox. Besedilo. Indeks(
SearchString. Besedilo)
Če je IndexChar = -1, potem _
Ni najdeno. Text = "Ni mogoče najti" _
Ostalo _
Ni najdeno. Text = "Najdeno!"
Končni pod
Pred kratkim me je programer vprašal za boljši način, kako "izbrisati vrstico, ki je bila kliknjena na katerem koli od šestih določenih seznamov." Delal je v nekaj ducatih vrstic kode, kar me je preprosto zmedlo. Toda s pošiljateljem je bilo res čisto preprosto:
Zasebni pod seznamBox_Click (
Pošiljatelj ByVal kot predmet,
ByVal e As System. EventArgs
) Ročaji ListBox1.Click, ListBox2.Click
Zatemnite myListBox kot nov seznam
myListBox = pošiljatelj
myListBox. Predmeti. RemoveAt (myListBox. IzbranoIndex)
Končni pod
Še en primer, s katerim bi lahko odpravili bistvo, je vprašanje, ki ga je poslal Pierre v Belgiji. Pierre je preizkušal enakost Button1 in pošiljatelja z uporabo Je operater za predmete:
Če je pošiljatelj Button1, potem ...
To je skladenjsko pravilno, saj sta pošiljatelj in Button1 oba predmeta, na katera se lahko sklicuje. In ker je pošiljatelj res enak Button1, zakaj ne deluje?
Odgovor je odvisen od ključne besede, ki jo najdemo nekoliko prej v izjavi. Najprej preverimo Microsoftovo dokumentacijo za Je operater.
Visual basic primerja dve referenčni spremenljivki objekta z operaterjem Is. Ta operater ugotovi, ali se dve referenčni spremenljivki nanašata na isti primerek predmeta.
Opazite, da je pošiljatelj poslan ByVal. To pomeni, da je prenesena kopija gumba1, ne pa dejanski objekt. Ko Pierre preizkusi, ali sta pošiljatelj in Button1 enaka primerka, je rezultat napačen.
Če želite preveriti, ali ste kliknili Button1 ali Button2, morate pošiljatelja spremeniti v dejanski predmet Buttona in nato preizkusiti lastnost tega predmeta. Običajno se uporablja besedilo, vendar lahko vrednost preizkusite v oznaki ali celo v lastnosti lokacije.
Ta koda deluje:
Zatemni gumb My As Button
myButton = pošiljatelj
Če je moj gumb. Text = "Gumb1" Potem