De Vb.Net-afzender en e-gebeurtenisparameters

In VB6 was een event-subroutine, zoals Button1_Click, veel minder ingewikkeld omdat het systeem de subroutine strikt bij naam noemde. Als er een gebeurtenis Button1_Click bestond, noemde het systeem het. Het is direct en duidelijk.

Maar in VB.NET zijn er twee belangrijke upgrades die VB.NET SOOPercharged maken (dat is "OOP" voor Object Oriented Programming).

  1. De clausule "Handles" bepaalt of het systeem de subroutine aanroept en niet de naam.
  2. De afzender- en e-parameters worden doorgegeven aan de subroutine.

Gebruik van parameters

Laten we een eenvoudig voorbeeld bekijken om het verschil te zien dat parameters maken in VB.NET.

Private Sub Button1_Click ( 

 ByVal-afzender als System.Object,

 ByVal e As System.EventArgs

 ) Handgrepen Button1.Click

 'Uw code komt hier

Einde Sub

Gebeurtenissubroutines ontvangen altijd een "afzender" -object en een systeem EventArgs-parameter "e". Omdat de parameter EventArgs een object is, ondersteunt deze de vereiste eigenschappen en methoden. Bijvoorbeeld, de oude VB6 MouseMove-gebeurtenis-subroutine gebruikte om vier parameters te ontvangen:

  • Knop als geheel getal
  • Verschuiven als geheel getal
  • X als single
  • Y als single

Toen meer geavanceerde muizen met meer knoppen uitkwamen, had VB6 een echt probleem met het ondersteunen ervan. VB.NET geeft slechts één parameter MouseEventArgs door, maar ondersteunt nog veel meer eigenschappen en methoden. En elk van hen zijn objecten die nog meer ondersteunen. De eigenschap e.Button bevat bijvoorbeeld al deze eigenschappen:

  • Links
  • Midden
  • Rechtsaf
  • Geen
  • XButton1
  • XButton2

Als iemand een "transcendentale" muis uitvindt met een "virtuele" knop, hoeft VB.NET alleen het .NET Framework bij te werken om dit te ondersteunen en zal geen eerdere code breken.

Er zijn een aantal .NET-technologieën die absoluut afhankelijk zijn van deze parameters. Omdat uw pc bijvoorbeeld meestal slechts één scherm heeft om afbeeldingen weer te geven, moet uw code de afbeeldingen samenvoegen tot dezelfde afbeelding die door Windows wordt gebruikt. Daarom moet een enkel "grafisch" object worden gedeeld. De belangrijkste manier waarop uw code dat "grafische" object kan gebruiken, is door de parameter e te gebruiken die wordt doorgegeven aan de OnPaint-gebeurtenis met het PaintEventArgs-object.

Beschermde overschrijvingen Sub OnPaint (

 ByVal e As System.Windows.Forms.PaintEventArgs)

 Dim g As Graphics = e.Graphics

Andere voorbeelden

Wat kunt u nog meer doen met deze parameters? Stel dat u wilt weten of een tekenreeks, misschien iets dat u in een tekstvak hebt ingevoerd, voorkomt in een verzameling van andere tekstvakken wanneer u erop klikt. Je zou een paar dozijn vrijwel identieke subroutines voor elk tekstvak kunnen coderen:

Als TextBox42.Text.IndexOf (

 SearchString.Text) = -1 

 Dan NotFound.Text = 

 "Niet gevonden"

Maar het is een stuk eenvoudiger om er slechts één te coderen en ze allemaal te laten verwerken. De afzenderparameter laat zien op welk tekstvak is geklikt.

Private Sub FindIt (

 ByVal-afzender als System.Object,

 ByVal e As System.EventArgs

 ) Handvatten TextBox1.Enter, 

 TextBox2.Enter, 

… enzovoort… 

 TextBox42.Enter

 Dim myTextbox As TextBox

 myTextbox = afzender

 Dim IndexChar As Integer = 

 myTextbox.Text.IndexOf ( 

 SearchString.Text)

 Als IndexChar = -1 Dan _

 NotFound.Text = "Niet gevonden" _

 Anders _

 NotFound.Text = "Gevonden!"

 Einde Sub

Onlangs vroeg een programmeur me om een ​​betere manier om "de regel te verwijderen waarop werd geklikt in een van de zes gespecificeerde lijsten." Hij liet het werken in een paar dozijn regels code die me gewoon in verwarring brachten. Maar met behulp van afzender was het echt vrij eenvoudig:

Private Sub ListBox_Click ( 

 ByVal-afzender als object, 

 ByVal e As System.EventArgs

 ) Handvatten ListBox1.Click, ListBox2.Click

 Dim myListBox als nieuwe ListBox

 myListBox = afzender

 myListBox.Items.RemoveAt (myListBox.SelectedIndex)

Einde Sub

Nog een voorbeeld om dit punt nader te omschrijven, is een vraag die Pierre in België heeft ingediend. Pierre testte de gelijkheid van Button1 en afzender met de is operator voor objecten:

Als de afzender knop 1 is, dan ... 

Dit is syntactisch correct omdat afzender en Button1 beide objecten zijn waarnaar kan worden verwezen. En aangezien de afzender echt identiek is met Button1, waarom werkt het niet??

Het antwoord is afhankelijk van een trefwoord dat iets eerder in de verklaring wordt gevonden. Laten we eerst de Microsoft-documentatie voor de is operator.

Visual Basic vergelijkt twee objectreferentievariabelen met de operator Is. Deze operator bepaalt of twee referentievariabelen naar dezelfde objectinstantie verwijzen.

Merk op dat de afzender is doorgegeven ByVal. Dat betekent dat een kopie van Button1 wordt doorgegeven, niet het eigenlijke object zelf. Dus wanneer Pierre test of de afzender en Button1 dezelfde instantie zijn, is het resultaat False.

Om te testen of op Button1 of Button2 is geklikt, moet u de afzender in een echt Button-object veranderen en vervolgens een eigenschap van dat object testen. Meestal wordt tekst gebruikt, maar u kunt een waarde in Tag of zelfs de eigenschap Location testen.

Deze code werkt:

Dim mijn knop als knop

myButton = afzender

If myButton.Text = "Button1" Dan