I VB6 var en händelsunderrutin, som Button1_Click, mycket mindre komplicerad eftersom systemet kallade subroutinen strikt med namnet. Om en knapp1_Klickhändelse fanns, kallade systemet det. Det är direkt och enkelt.
Men i VB.NET finns det två stora uppgraderingar som gör VB.NET SOOP-laddad (det är "OOP" för objektorienterad programmering).
Låt oss titta på ett enkelt exempel för att se skillnaden som parametrarna gör i VB.NET.
Privat subknapp1_Klicka (
ByVal avsändare som system.objekt,
ByVal e As System.EventArgs
) Handtag-knapp1.Klicka
"Din kod går här
Avsluta under
Underprogram för händelser får alltid ett "avsändare" -objekt och en system EventArgs-parameter "e". Eftersom parametern EventArgs är ett objekt, stöder den alla egenskaper och metoder som är nödvändiga. Till exempel den gamla VB6 MouseMove-händelsunderrutinen som användes för att ta emot fyra parametrar:
När mer avancerade möss kom ut med fler knappar hade VB6 ett verkligt problem att stödja dem. VB.NET passerar bara en MouseEventArgs-parameter men den stöder mycket fler egenskaper och metoder. Och var och en av dem är objekt som stöder ännu mer. Till exempel innehåller egenskapen e.Button alla dessa egenskaper:
Om någon uppfinner en "trancendental" mus med en "virtuell" knapp, kommer VB.NET bara att uppdatera .NET Framework för att stödja den och ingen tidigare kod kommer att bryta som resultat.
Det finns ett antal .NET-tekniker som helt beror på dessa parametrar. Till exempel, eftersom din dator vanligtvis bara har en enda skärm för att visa grafik, måste din kod slå samman den grafik som den skapar till samma bild som används av Windows. Därför måste ett enda "grafik" -objekt delas. Det viktigaste sättet att din kod kan använda det "grafikobjektet" är att använda parametern e som skickas till OnPaint-händelsen med PaintEventArgs-objektet.
Protected Overrides Sub OnPaint (
ByVal e As System.Windows.Forms.PaintEventArgs)
Dim g Som grafik = e.Grafik
Vad kan du göra mer med dessa parametrar? För att illustrera, antar du att du vill hitta om en sträng, kanske något du skrev in i en textlåda, finns i någon av en samling andra textlådor när du klickar på en. Du kan koda ett par dussin praktiskt taget identiska underrutiner för varje textlåda:
Om TextBox42.Text.IndexOf (
SearchString.Text) = -1
Sedan NotFound.Text =
"Hittades inte"
Men det är mycket lättare att koda bara en och låta den hantera dem alla. Avsändarparametern avslöjar vilken textlåda som klickades på.
Private Sub FindIt (
ByVal avsändare som system.objekt,
ByVal e As System.EventArgs
) Hanterar TextBox1.Enter,
TextBox2.Enter,
… och så vidare…
TextBox42.Enter
Dim myTextbox som textbox
myTextbox = avsändare
Dim IndexChar som heltal =
myTextbox.Text.IndexOf (
SearchString.Text)
Om IndexChar = -1 Sedan _
NotFound.Text = "Inte hittat" _
Annars _
NotFound.Text = "Hittade det!"
Avsluta under
Nyligen bad en programmerare mig om ett bättre sätt att "radera raden som klickades i någon av sex angivna listor." Han fick det att fungera i ett par dussin rader kod som helt enkelt förvirrade mig. Men med avsändaren var det egentligen ganska enkelt:
Privat underlistaBox_Click (
ByVal avsändare som objekt,
ByVal e As System.EventArgs
) Hanterar ListBox1.Click, ListBox2.Click
Dim myListBox som ny ListBox
myListBox = avsändare
myListBox.Items.RemoveAt (myListBox.SelectedIndex)
Avsluta under
Ett ytterligare exempel för att spikra ned poängen är en fråga som skickades in av Pierre i Belgien. Pierre testade likheten mellan knapp 1 och avsändare med hjälp av Är operatör för objekt:
Om avsändaren är knapp1 Då ...
Detta är syntaktiskt korrekt eftersom avsändare och knapp 1 är båda objekt som kan hänvisas till. Och eftersom avsändaren verkligen är identisk med knapp 1, varför fungerar det inte?
Svaret beror på ett nyckelord som finns lite tidigare i uttalandet. Låt oss först kontrollera Microsoft-dokumentationen för Är operatör.
Visual Basic jämför två objektreferensvariabler med Is Operator. Denna operatör avgör om två referensvariabler refererar till samma objektinstans.
Lägg märke till att avsändaren passeras ByVal. Det betyder att en kopia av knapp1 skickas, inte själva objektet. Så när Pierre testar för att se om avsändare och knapp 1 är samma instans är resultatet falskt.
För att testa om knapp 1 eller knapp 2 har klickats måste du förvandla avsändaren till ett verkligt knappobjekt och sedan testa en egenskap hos det objektet. Text används vanligtvis, men du kan testa ett värde i Tag eller till och med Location-egenskapen.
Den här koden fungerar:
Dim myButton As-knapp
myButton = avsändare
Om myButton.Text = "Knapp1" Sedan