U VB6 podprogrami događaja, poput Button1_Click, bili su mnogo manje komplicirani, jer je sustav nazvao potprogram strogo po imenu. Ako je postojao Button1_Click događaj, sustav ga je pozvao. Izravno je i izravno.
Ali u VB.NET-u postoje dvije velike nadogradnje VB.NET SOOP naplaćuje (to je "OOP" za Objektno orijentirano programiranje).
- Odredba "Ručke" kontrolira hoće li sustav pozvati potprogram, a ne ime.
- Pošiljalac i e parametri prosljeđuju se u podprogramu.
Upotreba parametara
Pogledajmo jednostavan primjer kako bismo vidjeli razliku koju parametri prave u VB.NET-u.
Privatni pod gumb1_Click (
ByVal pošiljalac kao sustav. Objekt,
ByVal e kao sustav. EventArgs
) Ručke gumba1.Kliknite
'Vaš kod je ovdje
Kraj Sub
Potprogrami događaja uvijek primaju objekt "pošiljatelj" i sistemski parametar EventArgs "e". Budući da je parametar EventArgs objekt, on podržava sva svojstva i metode potrebne. Na primjer, stari podprogram događaja VB6 MouseMove koji se koristio za primanje četiri parametra:
- Gumb Kao Integer
- Shift kao Integer
- X Kao samci
- Y Kao samci
Kad su napredniji miševi izašli s više gumba, VB6 je imao stvarni problem s podrškom za njih. VB.NET prolazi samo jedan MouseEventArgs parametar, ali podržava puno više svojstava i metoda. A svaki od njih su predmeti koji podržavaju još više. Na primjer, e. Svojstvo gumba sadrži sva ova svojstva:
- Lijevo
- srednji
- Pravo
- nijedan
- XButton1
- XButton2
Ako netko izmisli "trancendentalni" miš pomoću "virtualnog" gumba, VB.NET će morati ažurirati samo .NET Framework da bi ga podržao i kao rezultat se neće slomiti prethodni kôd.
Postoji niz .NET tehnologija koje apsolutno ovise o tim parametrima. Na primjer, budući da vaše računalo obično ima samo jedan zaslon za prikaz grafike, vaš kôd mora spojiti grafiku koju stvara u istu sliku koju koristi Windows. Iz tog razloga, mora se dijeliti jedan "grafički" objekt. Glavni način na koji vaš kôd može upotrijebiti taj grafički objekt je korištenje e parametra koji je proslijeđen događaju OnPaint s objektom PaintEventArgs.
Zaštićeni poništavanja Sub OnPaint (
ByVal e kao sustav. Windows. Obrasci. PaintEventArgs)
Dim g kao grafika = e. Grafika
Ostali primjeri
Što još možete učiniti s tim parametrima? Za ilustraciju, pretpostavimo da želite otkriti postoji li niz, možda nešto što ste unijeli u Textbox, u bilo kojem od zbirki drugih Textbox-ova kad kliknete na jedan. Za svaki Textbox možete kodirati nekoliko desetaka gotovo identičnih podprograma:
Ako TextBox42.Text. IndexOf (
SearchString. Tekst) = -1
Zatim NotFound. Tekst =
"Nije pronađeno"
Ali puno je lakše kodirati samo jedan i pustiti ga da obrađuje sve njih. Parametar pošiljatelja otkrit će na koji je Textbox kliknut.
Privatni pod FindIt (
ByVal pošiljalac kao sustav. Objekt,
ByVal e kao sustav. EventArgs
) Rukuje TextBox1.Enter,
TextBox2.Enter,
... i dalje i dalje.. .
TextBox42.Enter
Zatamni myTextbox kao TextBox
myTextbox = pošiljalac
Dim IndexChar As Integer =
myTextbox. Tekst. IndexOf (
SearchString. Tekst)
Ako je IndexChar = -1, tada _
Nije pronađeno. Text = "Nije pronađen" _
Ostalo _
Nije pronađeno. Text = "Pronađeno!"
Kraj Sub
Nedavno me jedan programer pitao za bolji način za "brisanje linije koja je bila kliknuta na bilo kojem od šest određenih popisa." Radio je u nekoliko desetaka redaka koda što me je jednostavno zbunilo. Ali pomoću pošiljatelja bilo je vrlo jednostavno:
Privatni potpopisBox_Click (
ByVal pošiljatelj Kao predmet,
ByVal e kao sustav. EventArgs
) Rukuje ListBox1.Click, ListBox2.Click
Zatamni myListBox kao novi ListBox
myListBox = pošiljalac
myListBox. Stavke. RemoveAt (myListBox. SelectedIndex)
Kraj Sub
Još jedan primjer da se umanji točka je pitanje koje je poslao Pierre u Belgiji. Pierre je testirao jednakost Buttona1 i pošiljatelja koristeći Je operator za objekte:
Ako je pošiljalac Button1, tada ...
To je sintaktički ispravno jer su pošiljatelj i Button1 objekti koji se mogu uputiti. A budući da je pošiljalac doista identičan s Buttonom1, zašto to ne uspije?
Odgovor ovisi o ključnoj riječi koja se nalazi malo ranije u izjavi. Prvo provjerimo Microsoftovu dokumentaciju za Je operater.
Visual Basic uspoređuje dvije referentne varijable objekta s operatorom Is. Ovaj operater određuje da li se dvije referentne varijable odnose na istu instancu objekta.
Obratite pažnju da je pošiljatelj prošao ByVal. To znači da je prenesena kopija gumba1, a ne sam stvarni objekt. Kada Pierre testira da li su pošiljalac i Button1 ista instanca, rezultat je netočan.
Da biste provjerili je li Button1 ili Button2 kliknuta, pošiljatelja morate pretvoriti u stvarni Button objekt i zatim testirati svojstvo tog objekta. Tekst se obično koristi, ali možete testirati vrijednost u oznaci ili čak entitetu Location.
Ovaj kod radi:
Zatamni moju tipku kao gumb
myButton = pošiljatelj
Ako je moj gumb. Tekst = "Gumb1" Zatim