Wskazówki: obsługa zdarzeń (Visual Basic)
Jest to drugi z dwóch tematów, które pokazują, jak pracować ze zdarzeniami. W pierwszym temacie, Przewodnik: deklarowanie i wywoływanie zdarzeń, pokazano, jak deklarować i zgłaszać zdarzenia. W tej sekcji użyto formularza i klasy z tego przewodnika, aby pokazać, jak obsługiwać zdarzenia podczas ich wykonywania.
W przykładzie Widget
klasy są używane tradycyjne instrukcje obsługi zdarzeń. Język Visual Basic udostępnia inne techniki pracy ze zdarzeniami. W ramach ćwiczenia możesz zmodyfikować ten przykład tak, aby używał instrukcji AddHandler
i Handles
.
Aby obsłużyć zdarzenie PercentDone klasy Widget
Umieść następujący kod w pliku
Form1
:Private WithEvents mWidget As Widget Private mblnCancel As Boolean
Słowo
WithEvents
kluczowe określa, że zmiennamWidget
jest używana do obsługi zdarzeń obiektu. Należy określić rodzaj obiektu, podając nazwę klasy, z której zostanie utworzony obiekt.Zmienna
mWidget
jest zadeklarowana,Form1
ponieważWithEvents
zmienne muszą być na poziomie klasy. Jest to prawdą niezależnie od typu klasy, w której je umieszczasz.Zmienna
mblnCancel
jest używana do anulowaniaLongTask
metody.
Pisanie kodu do obsługi zdarzenia
Gdy tylko zadeklarujesz zmienną przy użyciu metody WithEvents
, nazwa zmiennej pojawi się na liście rozwijanej po lewej stronie edytora kodu klasy. Po wybraniu Widget
pozycji mWidget
zdarzenia klasy są wyświetlane na liście rozwijanej po prawej stronie. Wybranie zdarzenia powoduje wyświetlenie odpowiedniej procedury zdarzenia z prefiksem mWidget
i podkreślenia. Wszystkie procedury zdarzeń skojarzone ze zmienną WithEvents
otrzymują nazwę zmiennej jako prefiks.
Aby obsłużyć zdarzenie
Wybierz
mWidget
z listy rozwijanej po lewej stronie w Edytorze kodu.PercentDone
Wybierz zdarzenie z listy rozwijanej po prawej stronie. Edytor kodu otwiera proceduręmWidget_PercentDone
zdarzenia.Uwaga
Edytor kodu jest przydatny, ale nie jest wymagany do wstawiania nowych programów obsługi zdarzeń. W tym przewodniku bardziej bezpośrednie jest skopiowanie programów obsługi zdarzeń bezpośrednio do kodu.
Dodaj następujący kod do programu obsługi zdarzeń
mWidget_PercentDone
:Private Sub mWidget_PercentDone( ByVal Percent As Single, ByRef Cancel As Boolean ) Handles mWidget.PercentDone lblPercentDone.Text = CInt(100 * Percent) & "%" My.Application.DoEvents() If mblnCancel Then Cancel = True End Sub
Za każdym razem, gdy zdarzenie
PercentDone
jest wywoływane, procedura zdarzenia wyświetla procent wykonania w kontrolceLabel
. MetodaDoEvents
umożliwia przemalować etykietę, a także daje użytkownikowi możliwość kliknięcia przycisku Anuluj .Dodaj następujący kod dla programu obsługi zdarzeń
Button2_Click
:Private Sub Button2_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button2.Click mblnCancel = True End Sub
Jeśli użytkownik kliknie przycisk Anuluj podczas LongTask
działania, Button2_Click
zdarzenie jest wykonywane natychmiast po uruchomieniu DoEvents
instrukcji zezwala na przetwarzanie zdarzeń. Zmienna mblnCancel
na poziomie klasy jest ustawiona na True
, a mWidget_PercentDone
zdarzenie następnie testuje go i ustawia ByRef Cancel
argument na True
.
Połączenie zmiennej WithEvents do obiektu
Form1
program jest teraz skonfigurowany do obsługi Widget
zdarzeń obiektu. Wszystko, co pozostaje, to znaleźć Widget
gdzieś.
W przypadku deklarowania zmiennej WithEvents
w czasie projektowania żaden obiekt nie jest z nim skojarzony. Zmienna jest podobnie jak każda WithEvents
inna zmienna obiektu. Musisz utworzyć obiekt i przypisać do niego odwołanie ze zmienną WithEvents
.
Aby utworzyć obiekt i przypisać do niego odwołanie
Wybierz pozycję (Zdarzenia formularza1) z listy rozwijanej po lewej stronie w Edytorze kodu.
Load
Wybierz zdarzenie z listy rozwijanej po prawej stronie. Edytor kodu otwiera proceduręForm1_Load
zdarzenia.Dodaj następujący kod procedury
Form1_Load
zdarzeń, aby utworzyć elementWidget
:Private Sub Form1_Load( ByVal sender As System.Object, ByVal e As System.EventArgs ) Handles MyBase.Load mWidget = New Widget End Sub
Po wykonaniu tego kodu program Visual Basic tworzy Widget
obiekt i łączy swoje zdarzenia z procedurami zdarzeń skojarzonymi z mWidget
programem . Od tego momentu za każdym razem, gdy Widget
zgłaszane jest zdarzenie PercentDone
, mWidget_PercentDone
procedura zdarzenia jest wykonywana.
Aby wywołać metodę LongTask
Dodaj następujący kod do programu obsługi zdarzeń
Button1_Click
:Private Sub Button1_Click( ByVal sender As Object, ByVal e As System.EventArgs ) Handles Button1.Click mblnCancel = False lblPercentDone.Text = "0%" lblPercentDone.Refresh() mWidget.LongTask(12.2, 0.33) If Not mblnCancel Then lblPercentDone.Text = CStr(100) & "%" End Sub
Przed wywołaniem LongTask
metody należy zainicjować etykietę wyświetlającą procent ukończenia, a flaga na poziomie Boolean
klasy do anulowania metody musi być ustawiona na False
.
LongTask
jest wywoływana z czasem trwania zadania 12,2 sekundy. Zdarzenie PercentDone
jest wywoływane raz na jedną trzecią sekundy. Za każdym razem, gdy zdarzenie jest wywoływane, wykonywana mWidget_PercentDone
jest procedura zdarzenia.
Po LongTask
zakończeniu jest testowany, aby sprawdzić, mblnCancel
czy LongTask
zakończył się normalnie, lub jeśli został zatrzymany, ponieważ mblnCancel
został ustawiony na True
wartość . Procent ukończenia jest aktualizowany tylko w poprzednim przypadku.
Aby uruchomić program
Naciśnij klawisz F5, aby umieścić projekt w trybie uruchamiania.
Kliknij przycisk Uruchom zadanie. Za każdym razem,
PercentDone
gdy zdarzenie jest wywoływane, etykieta jest aktualizowana o wartość procentową ukończenia zadania.Kliknij przycisk Anuluj, aby zatrzymać zadanie. Zwróć uwagę, że wygląd przycisku Anuluj nie zmienia się natychmiast po kliknięciu. Zdarzenie
Click
nie może wystąpić, dopókiMy.Application.DoEvents
instrukcja nie zezwala na przetwarzanie zdarzeń.Uwaga
Metoda
My.Application.DoEvents
nie przetwarza zdarzeń w dokładnie taki sam sposób, jak w przypadku formularza. Na przykład w tym przewodniku należy dwukrotnie kliknąć przycisk Anuluj . Aby zezwolić formularzowi na bezpośrednią obsługę zdarzeń, możesz użyć wielowątku. Aby uzyskać więcej informacji, zobacz Managed Threading (Zarządzanie wątkami).
Może się okazać, że jest to instruktażowe uruchamianie programu za pomocą klawisza F11 i przechodzenie przez kod wiersza w danym momencie. Możesz wyraźnie zobaczyć, jak jest wprowadzane LongTask
wykonanie , a następnie pokrótce wprowadza Form1
się ponownie za każdym razem, PercentDone
gdy zdarzenie jest wywoływane.
Co by się stało, gdyby wykonanie było z powrotem w kodzie Form1
metody , LongTask
metoda została wywołana ponownie? Najgorsze przepełnienie stosu może wystąpić, jeśli LongTask
były wywoływane za każdym razem, gdy zdarzenie zostało podniesione.
Zmienna mWidget
może obsługiwać zdarzenia dla innego Widget
obiektu, przypisując odwołanie do nowego Widget
obiektu .mWidget
W rzeczywistości możesz wykonać kod za Button1_Click
każdym razem, gdy klikniesz przycisk.
Aby obsługiwać zdarzenia dla innego widżetu
Dodaj następujący wiersz kodu do
Button1_Click
procedury, bezpośrednio poprzedzający wiersz, który odczytujemWidget.LongTask(12.2, 0.33)
polecenie :mWidget = New Widget ' Create a new Widget object.
Powyższy kod tworzy nowy Widget
przy każdym kliknięciu przycisku. Gdy tylko LongTask
metoda zostanie ukończona, odwołanie do elementu Widget
zostanie zwolnione i Widget
zostanie zniszczone.
Zmienna WithEvents
może zawierać tylko jedno odwołanie do obiektu w danym momencie, więc w przypadku przypisania innego Widget
obiektu do mWidget
obiektu zdarzenia poprzedniego Widget
obiektu nie będą już obsługiwane. Jeśli mWidget
jest jedyną zmienną obiektu zawierającą odwołanie do starego Widget
obiektu , obiekt zostanie zniszczony. Jeśli chcesz obsługiwać zdarzenia z kilku Widget
obiektów, użyj AddHandler
instrukcji , aby przetwarzać zdarzenia z każdego obiektu oddzielnie.
Uwaga
Można zadeklarować dowolną liczbę WithEvents
zmiennych, ale tablice WithEvents
zmiennych nie są obsługiwane.