Vb.Net Sender i parametry zdarzenia e

Programiści komputerowi patrzący na kod

PeopleImages.com / Getty Images





W VB6 podprogram zdarzenia, taki jak Button1_Click, był znacznie mniej skomplikowany, ponieważ system nazywał podprogram ściśle po nazwie. Jeśli istniało zdarzenie Button1_Click, system je wywołał. To bezpośrednie i proste.

Ale w VB.NET są dwie główne aktualizacje, które sprawiają, żeVB.NETSOOPercharged (to „OOP” dla Programowanie obiektowe ).



  1. Klauzula „Handles” kontroluje, czy system wywołuje podprogram, a nie nazwę.
  2. Parametry sender i e są przekazywane do podprogramu.

Wykorzystanie parametrów

Spójrzmy na prosty przykład, aby zobaczyć różnicę, jaką parametry robią w VB.NET.

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Podprogramy zdarzeń zawsze otrzymują obiekt „nadawca” i systemowy parametr EventArgs „e”. Ponieważ parametr EventArgs jest obiektem, obsługuje wszystkie niezbędne właściwości i metody. Na przykład stary podprogram zdarzenia VB6 MouseMove otrzymywał cztery parametry:



  • Przycisk jako liczba całkowita
  • Przesuń jako liczbę całkowitą
  • X jako singiel
  • Y jako pojedynczy

Gdy bardziej zaawansowane myszy wyszły z większą liczbą przycisków, VB6 miał nie lada problem z ich obsługą. VB.NET przekazuje tylko jeden parametr MouseEventArgs, ale obsługuje znacznie więcej właściwości i metod. A każdy z nich to obiekty, które wspierają jeszcze bardziej. Na przykład właściwość e.Button zawiera wszystkie te właściwości:

  • Lewy
  • Środek
  • Prawidłowy
  • Nic
  • XPrzycisk1
  • XPrzycisk2

Jeśli ktoś wymyśli „transcendentalną” mysz z „wirtualnym” przyciskiem, VB.NET będzie musiał tylko zaktualizować .NET Framework, aby go obsługiwać i żaden poprzedni kod nie ulegnie uszkodzeniu.

Istnieje wiele technologii .NET, które są absolutnie zależne od tych parametrów. Na przykład, ponieważ twój komputer ma zwykle tylko jeden ekran do wyświetlania grafiki, twój kod musi scalić utworzoną grafikę z tym samym obrazem używanym przez system Windows. Z tego powodu jeden obiekt „grafika” musi być udostępniony. Głównym sposobem, w jaki twój kod może używać tego obiektu „grafika”, jest użycie parametru e, który jest przeszedł na wydarzenie OnPaint z obiektem PaintEventArgs.

|_+_||_+_|
|_+_|
|_+_|

Inne przykłady

Co jeszcze można zrobić z tymi parametrami? Aby to zilustrować, załóżmy, że chcesz sprawdzić, czy ciąg, być może coś, co wpisałeś w polu tekstowym, 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:



|_+_||_+_|
|_+_|
|_+_|
|_+_|

Ale o wiele łatwiej jest zakodować tylko jeden i pozwolić mu obsłużyć je wszystkie. Parametr sender pokaże, które pole tekstowe zostało kliknięte.

|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Niedawno programista zapytał mnie o lepszy sposób „usuwania linii, która została kliknięta na dowolnej z sześciu określonych list”. Pracował w kilkudziesięciu linijkach kodu, które po prostu mnie zdezorientowały. Ale przy użyciu sendera było to naprawdę proste:



|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|

Jeszcze jednym przykładem, który wyjaśnia sprawę, jest pytanie przesłane przez Pierre'a z Belgii. Pierre testował równość Button1 i nadawcy za pomocą Jest operator dla obiektów:

|_+_||_+_|

Jest to poprawne pod względem składniowym, ponieważ zarówno sender, jak i Button1 są obiektami, do których można się odwoływać. A skoro tak naprawdę nadawca jest identyczny z Button1, dlaczego to nie działa?



Odpowiedź zależy od słowa kluczowego, które znajduje się nieco wcześniej w instrukcji. Najpierw sprawdźmy dokumentację firmy Microsoft pod kątem Jest operator.

Visual Basic porównuje dwie zmienne odwołania do obiektu z operatorem Is. Ten operator określa, czy dwie zmienne referencyjne odnoszą się do tej samej instancji obiektu.



Zauważ, że nadawca został przekazany ByVal . Oznacza to, że przekazywana jest kopia Button1, a nie sam obiekt. Więc kiedy Pierre sprawdza, czy sender i Button1 to ta sama instancja, wynikiem jest False.

Aby sprawdzić, czy przycisk Button1 lub Button2 został kliknięty, 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ść we właściwości Tag lub nawet we właściwości Lokalizacja.

Ten kod działa:

|_+_||_+_|
|_+_|
|_+_|