În VB6, o subrutină de evenimente, cum ar fi Button1_Click, a fost mult mai puțin complicată, deoarece sistemul a numit subrutină strict după nume. Dacă a existat un eveniment Button1_Click, sistemul îl numea. Este direct și simplu.
Dar în VB.NET, există două upgrade-uri majore care fac VB.NET SOOPcărcat (acesta este "OOP" pentru Programare orientată pe obiecte).
- Clauza „Handles” controlează dacă sistemul numește subrutină, nu numele.
- Parametrii expeditorului și e sunt trecuți la subrutină.
Utilizarea parametrilor
Să ne uităm la un exemplu simplu pentru a vedea diferența pe care o fac parametrii în VB.NET.
Sub-buton privat1_Click (
ByVal expeditor ca sistem. Obiect,
Sistemul ByVal e As. EventArgs
) Butoane Manevre1.Click
- Codul tău merge aici
Sub final
Subrutinele de evenimente primesc întotdeauna un obiect "expeditor" și un parametru "e" EventArgs de sistem. Deoarece parametrul EventArgs este un obiect, acesta acceptă orice proprietăți și metode sunt necesare. De exemplu, vechea subrutină a evenimentului VB6 MouseMove folosit pentru a primi patru parametri:
- Buton ca număr întreg
- Shift As Integer
- X Ca single
- Y ca singur
Când șoarecii mai avansați au apărut cu mai multe butoane, VB6 a avut o problemă reală în sprijinirea lor. VB.NET trece doar un parametru MouseEventArgs, dar acceptă mai multe proprietăți și metode. Și fiecare dintre ele sunt obiecte care susțin și mai mult. De exemplu, e. Proprietatea butonului conține toate aceste proprietăți:
- Stânga
- Mijloc
- Dreapta
- Nici unul
- XButton1
- XButton2
Dacă cineva inventează un mouse „trancendental” cu un buton „virtual”, VB.NET va trebui să actualizeze doar .NET Framework pentru a-l susține și niciun cod anterior nu se va rupe.
Există o serie de tehnologii .NET care depind absolut de acești parametri. De exemplu, deoarece computerul dvs. are de obicei doar un singur ecran pentru a afișa grafică, codul dvs. trebuie să îmbine graficele pe care le creează în aceeași imagine folosită de Windows. Din acest motiv, trebuie împărțit un singur obiect „grafic”. Principala modalitate prin care codul dvs. este capabil să folosească acel obiect „grafic” este să folosiți parametrul e care este trecut la evenimentul OnPaint cu obiectul PaintEventArgs.
Substituiri protejate Sub OnPaint (
Sistemul ByVal e As. Windows. Formulare. PaintEventArgs)
Dim g As Graphics = e. Grafică
Alte exemple
Ce mai poți face cu acești parametri? Pentru a ilustra, să presupunem că doriți să aflați dacă un șir, poate ceva introdus într-o casetă de text, există în oricare dintre colecțiile de alte casete de text atunci când faceți clic pe una. Puteți codifica câteva zeci de subrutine practic identice pentru fiecare casetă de text:
Dacă TextBox42.Text. Index de(
Searchstring. Text) = -1
Apoi NotFound. Text =
"Nu a fost gasit"
Dar este mult mai ușor să codați doar unul și să-l lăsați să se ocupe de toate. Parametrul expeditorului va dezvălui ce cutie text a fost făcut clic.
Sub-Find privat (
ByVal expeditor ca sistem. Obiect,
Sistemul ByVal e As. EventArgs
) Gestionează TextBox1.Enter,
TextBox2.Enter,
... ș.a.m.d.. .
TextBox42.Enter
Dim myTextbox Ca TextBox
myTextbox = expeditor
Dim IndexChar As Integer =
myTextbox. Text. Index de(
Searchstring. Text)
Dacă IndexChar = -1 Atunci _
Nu a fost gasit. Text = "Nu a fost găsit" _
Altfel _
Nu a fost gasit. Text = "Găsit!"
Sub final
Recent, un programator mi-a cerut o modalitate mai bună de a „șterge linia pe care s-a făcut clic pe oricare dintre cele șase liste specificate”. El a lucrat în câteva zeci de linii de cod care pur și simplu m-au confundat. Dar folosind expeditor, a fost foarte simplu:
Sublista privatăBox_Click (
Expeditor ByVal ca obiect,
Sistemul ByVal e As. EventArgs
) Gestionează ListBox1.Click, ListBox2.Click
Dim myListBox Ca listă nouă
myListBox = expeditor
myListBox. Articole. RemoveAt (myListBox. SelectedIndex)
Sub final
Un alt exemplu pentru a pune problema este o întrebare care a fost trimisă de Pierre în Belgia. Pierre testa egalitatea Button1 și a expeditorului folosind Este operator pentru obiecte:
Dacă expeditorul este butonul1 Atunci ...
Acest lucru este corect sintactic, deoarece expeditorul și Button1 sunt ambele obiecte la care se poate face referire. Și din moment ce expeditorul este într-adevăr identic cu Button1, de ce nu funcționează?
Răspunsul depinde de un cuvânt cheie care se găsește puțin mai devreme în enunț. Mai întâi, să verificăm documentația Microsoft pentru Este operator.
Visual Basic compară două variabile de referință de obiect cu Operatorul Is. Acest operator stabilește dacă două variabile de referință se referă la aceeași instanță a obiectului.
Observați că expeditorul a fost trecut ByVal. Aceasta înseamnă că o copie a butonului1 este transmisă, nu obiectul propriu-zis. Deci, când Pierre testează pentru a vedea dacă expeditorul și Button1 sunt aceeași instanță, rezultatul este False.
Pentru a testa dacă a fost făcut clic pe Button1 sau Button2, trebuie să transformați expeditorul într-un obiect Button real și apoi să testați o proprietate a acelui obiect. Textul este de obicei utilizat, dar puteți testa o valoare în etichetă sau chiar proprietatea Locație.
Acest cod funcționează:
Dim myButton As Button
myButton = expeditor
Dacă myButton. Text = "Buton1" Apoi