VB6: ssa tapahtuman aliohjelma, kuten Button1_Click, oli paljon vähemmän monimutkainen, koska järjestelmä kutsui aliohjelmaa tiukasti nimellä. Jos Button1_Click-tapahtuma oli olemassa, järjestelmä kutsui sitä. Se on suoraa ja suoraviivaista.
Mutta VB.NETissä on kaksi suurta päivitystä, jotka tekevät VB.NET SOOPercharged (se on "OOP" Olio-ohjelmointi).
- "Kahvat" -lause hallitsee kutsutaanko järjestelmä aliohjelmaa, ei nimeä.
- Lähettäjä- ja e-parametrit välitetään aliohjelmaan.
Parametrien käyttö
Katsotaanpa yksinkertaista esimerkkiä nähdäksesi ero, jonka parametrit tekevät VB.NET: ssä.
Yksityinen alapainike1_Klikkaa (
ByVal-lähettäjä järjestelmänä. Esine,
ByVal e As -järjestelmä. EventArgs
) Kahvat Button1.Click
'Koodisi menee tänne
End Sub
Tapahtuman aliohjelmat vastaanottavat aina "lähettäjän" objektin ja järjestelmän EventArgs-parametrin "e". Koska EventArgs-parametri on objekti, se tukee kaikkia tarvittavia ominaisuuksia ja menetelmiä. Esimerkiksi vanha VB6 MouseMove -tapahtuman aliohjelma, jota käytetään vastaanottamaan neljä parametria:
- Painike kokonaislukuna
- Vaihda kokonaislukuna
- X Yhtenä
- Y kuin sinkku
Kun edistyneemmät hiiret tulivat ulos useammalla painikkeella, VB6: lla oli todellinen ongelma tukea niitä. VB.NET ohittaa vain yhden MouseEventArgs-parametrin, mutta se tukee paljon enemmän ominaisuuksia ja menetelmiä. Ja jokainen niistä on esineitä, jotka tukevat vielä enemmän. Esimerkiksi e. Painikeominaisuus sisältää kaikki nämä ominaisuudet:
- Vasen
- keskimmäinen
- oikea
- Ei mitään
- XButton1
- XButton2
Jos joku keksii "trancendentaalisen" hiiren "virtuaalisella" -painikkeella, VB.NET joutuu päivittämään .NET-kehys vain tukemaan sitä, eikä mikään aikaisempi koodi hajoa seurauksena.
On olemassa useita .NET-tekniikoita, jotka ovat ehdottomasti riippuvaisia näistä parametreista. Esimerkiksi, koska tietokoneellasi on yleensä vain yksi näyttö grafiikan näyttämistä varten, koodisi on yhdistettävä sen luoma grafiikka samaan kuvaan, jota Windows käyttää. Tästä syystä yksi "grafiikka" objekti on jaettava. Tärkein tapa, jolla koodisi pystyy käyttämään kyseistä "grafiikkaa", on käyttää e-parametria, joka on siirretty OnPaint-tapahtumaan PaintEventArgs-objektin kanssa.
Suojattu ohittaa Sub OnPaintin (
ByVal e As -järjestelmä. Windows. Lomakkeet. PaintEventArgs)
Himmennä graafisena = e. grafiikka
Muut esimerkit
Mitä muuta voit tehdä näillä parametreilla? Havainnollistakaamme esimerkiksi, että haluat selvittää, onko jokin merkkijono, kenties jotain, jonka kirjoitit tekstilaatikkoon, jokaisessa muussa tekstilaatikossa, kun napsautat sitä. Voit koodata muutama tusina käytännöllisesti identtistä aliohjelmaa kutakin tekstilaatikkoa varten:
Jos TextBox42.Text. Sisällysluettelo(
SearchString. Teksti) = -1
Sitten NotFound. Teksti =
"Ei löydetty"
Mutta on paljon helpompaa koodata vain yksi ja antaa sen käsitellä niitä kaikkia. Lähettäjäparametri paljastaa, mitä tekstilaatikkoa napsautettiin.
Yksityinen alihaku (
ByVal-lähettäjä järjestelmänä. Esine,
ByVal e As -järjestelmä. EventArgs
) Käsittelee TextBox1.Enter,
TextBox2.Enter,
... ja edelleen.. .
TextBox42.Enter
Himmennä myTextbox tekstilaatikkona
myTextbox = lähettäjä
Dim IndexChar kokonaislukuna =
myTextbox. Teksti. Sisällysluettelo(
SearchString. Teksti)
Jos IndexChar = -1 Sitten _
Ei löydetty. Teksti = "Ei löydy" _
Muu _
Ei löydetty. Text = "Löytyi!"
End Sub
Äskettäin ohjelmoija pyysi minulta parempaa tapaa "poistaa rivi, jota napsautettiin missä tahansa kuudesta määritellystä luettelosta". Hänellä se toimi parikymmentä rivillä koodia, joka yksinkertaisesti hämmentää minua. Mutta lähettäjän avulla se oli todella melko yksinkertainen:
Yksityinen aliluetteloBox_Click (
ByVal-lähettäjä objektina,
ByVal e As -järjestelmä. EventArgs
) Käsittelee ListBox1.Click, ListBox2.Click
Himmennä myListBox uutena listaikkuna
myListBox = lähettäjä
myListBox. Kohteita. PoistaAt (myListBox. SelectedIndex)
End Sub
Vielä yksi esimerkki kohtaan on kysymys, jonka Pierre lähetti Belgiassa. Pierre testasi Button1: n ja lähettäjän tasa-arvoa On esineiden operaattori:
Jos lähettäjä on Button1 Sitten ...
Tämä on syntaktisesti oikein, koska lähettäjä ja Button1 ovat molemmat objektit, joihin voidaan viitata. Ja koska lähettäjä todella on identtinen Button1: n kanssa, miksi se ei toimi?
Vastaus riippuu avainsanasta, joka löytyy hieman aikaisemmin lausunnosta. Tarkistetaan ensin Microsoftin dokumentaatio On operaattori.
Visual Basic vertaa kahta objektiohjelmamuuttujaa Is Operaattoriin. Tämä operaattori määrittelee, viittaavatko kaksi referenssimuuttujaa samaan objekti-esiintymään.
Huomaa, että lähettäjä on ohitettu ByVal. Tämä tarkoittaa, että kopio Button1: stä välitetään, ei varsinainen objekti itse. Joten kun Pierre testaa onko lähettäjä ja Button1 samat ilmentymät, tulos on väärä.
Testaaksesi, onko Button1 tai Button2 napsautettu, sinun on muutettava lähettäjä todelliseksi Button Objectiksi ja testattava sitten kyseisen objektin ominaisuus. Tekstiä käytetään yleensä, mutta voit testata arvoa Tagissa tai jopa Sijainti-ominaisuudessa.
Tämä koodi toimii:
Himmennä myButton As Button
myButton = lähettäjä
Jos myButton. Teksti = "Button1" Sitten