W VB6 podprogram zdarzenia, taki jak Button1_Click, był znacznie mniej skomplikowany, ponieważ system nazywał podprogram ściśle według nazwy. Jeśli istniało zdarzenie Button1_Click, system je nazwał. Jest to bezpośrednie i proste.
Ale w VB.NET istnieją dwie główne aktualizacje VB.NET SOOPercharged (to „OOP” dla Programowanie obiektowe).
- Klauzula „Uchwyty” kontroluje, czy system wywołuje podprogram, a nie nazwę.
- Parametry nadawcy i e są przekazywane do podprogramu.
Zastosowanie parametrów
Spójrzmy na prosty przykład, aby zobaczyć różnicę, jaką powodują parametry w VB.NET.
Prywatny przycisk podrzędny1_Click (
ByVal nadawca jako system. Obiekt,
ByVal e As System. EventArgs
) Obsługuje Button1.Click
„Twój kod jest tutaj
Napis końcowy
Podprogramy zdarzeń zawsze otrzymują obiekt „nadawca” i systemowy parametr EventArgs „e”. Ponieważ parametr EventArgs jest obiektem, obsługuje wszelkie niezbędne właściwości i metody. Na przykład stary podprogram zdarzenia MouseMove VB6 używany do odbierania czterech parametrów:
- Button As Integer
- Shift As Integer
- X jako singiel
- Y jako singiel
Kiedy bardziej zaawansowane myszy pojawiły się z większą liczbą przycisków, VB6 miał prawdziwy problem z ich obsługą. VB.NET przekazuje tylko jeden parametr MouseEventArgs, ale obsługuje o wiele więcej właściwości i metod. A każdy z nich to obiekty, które wspierają jeszcze bardziej. Na przykład e. Właściwość Button zawiera wszystkie te właściwości:
- Lewo
- Środkowy
- Dobrze
- Żaden
- XButton1
- XButton2
Jeśli ktoś wymyśli mysz „transcendentalną” za pomocą przycisku „wirtualnego”, VB.NET będzie musiał jedynie zaktualizować system .NET Framework, aby go obsługiwać, i w rezultacie żaden poprzedni kod nie zostanie zepsuty.
Istnieje wiele technologii .NET, które całkowicie zależą od tych parametrów. Na przykład, ponieważ komputer zazwyczaj ma tylko jeden ekran do wyświetlania grafiki, kod musi połączyć grafikę, którą tworzy, z tym samym obrazem, z którego korzysta system Windows. Z tego powodu należy udostępnić pojedynczy obiekt „graficzny”. Głównym sposobem, w jaki Twój kod może korzystać z tego obiektu „graficznego”, jest użycie parametru e przekazany do zdarzenia OnPaint z obiektem PaintEventArgs.
Protected Overrides Sub OnPaint (
ByVal e As System. Windows Formularze PaintEventArgs)
Dim g As Graphics = e. Grafika
Inne przykłady
Co jeszcze możesz zrobić z tymi parametrami? Aby to zilustrować, załóżmy, że chcesz sprawdzić, czy ciąg znaków, być może coś, co wprowadziłeś do pola tekstowego, istnieje w jednym z kolekcji innych pól tekstowych po kliknięciu jednego z nich. Możesz zakodować kilkadziesiąt praktycznie identycznych podprogramów dla każdego pola tekstowego:
Jeśli TextBox42.Text. Indeks(
Szukana fraza. Tekst) = -1
Następnie nie znaleziono. Tekst =
"Nie znaleziono"
Ale o wiele łatwiej jest zakodować tylko jeden i pozwolić obsłużyć je wszystkie. Parametr nadawcy ujawni, które pole tekstowe zostało kliknięte.
Private Sub FindIt (
ByVal nadawca jako system. Obiekt,
ByVal e As System. EventArgs
) Obsługuje TextBox1.Enter,
TextBox2.Enter,
... i tak dalej.. .
TextBox42.Enter
Dim myTextbox jako TextBox
myTextbox = nadawca
Dim IndexChar As Integer =
myTextbox. Tekst. Indeks(
Szukana fraza. Tekst)
Jeśli IndexChar = -1, to _
Nie znaleziono. Text = „Nie znaleziono” _
W przeciwnym razie _
Nie znaleziono. Text = „Znaleziono!”
Napis końcowy
Ostatnio programista poprosił mnie o lepszy sposób na „usunięcie linii, która została kliknięta na jednej z sześciu określonych list”. Zmusił go do działania w kilkudziesięciu wierszach kodu, które po prostu mnie pomieszały. Ale używając nadawcy, było to naprawdę bardzo proste:
Prywatna lista podrzędna Box_Click (
ByVal sender As Object,
ByVal e As System. EventArgs
) Obsługuje ListBox1.Click, ListBox2.Click
Dim myListBox jako nowy ListBox
myListBox = nadawca
myListBox. Przedmiotów. RemoveAt (myListBox. SelectedIndex)
Napis końcowy
Jeszcze jednym przykładem, aby wyjaśnić tę kwestię, jest pytanie przesłane przez Pierre'a w Belgii. Pierre testował równość przycisku 1 i nadawcy za pomocą Jest operator dla obiektów:
Jeśli nadawcą jest przycisk 1, to ...
Jest to poprawne składniowo, ponieważ nadawca i Button1 są obiektami, do których można się odwoływać. A ponieważ nadawca naprawdę jest identyczny z Button1, dlaczego to nie działa?
Odpowiedź zależy od słowa kluczowego znalezionego nieco wcześniej w instrukcji. Najpierw sprawdźmy dokumentację Microsoft pod kątem Jest operator.
Visual Basic porównuje dwie zmienne odniesienia obiektu z operatorem Is. Ten operator określa, czy dwie zmienne odniesienia odnoszą się do tej samej instancji obiektu.
Zauważ, że nadawca został przekazany ByVal. Oznacza to, że przekazywana jest kopia Button1, a nie sam obiekt. Kiedy więc Pierre sprawdza, czy nadawca i Button1 są tym samym wystąpieniem, wynik jest fałszywy.
Aby sprawdzić, czy kliknięto Button1 lub Button2, musisz zmienić nadawcę w rzeczywisty obiekt Button, a następnie przetestować właściwość tego obiektu. Zwykle używany jest tekst, ale można przetestować wartość w tagu, a nawet we właściwości Location.
Ten kod działa:
Dim myButton As Button
myButton = nadawca
Jeśli myButton. Tekst = „Button1” Następnie