Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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, gdy się pojawiają.
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 w klasie Widget
Umieść następujący kod w pliku
Form1:Private WithEvents mWidget As Widget Private mblnCancel As BooleanSłowo
WithEventskluczowe określa, że zmiennamWidgetjest używana do obsługi zdarzeń obiektu. Należy określić rodzaj obiektu, podając nazwę klasy, z której zostanie utworzony obiekt.Zmienna
mWidgetjest zadeklarowana wForm1, dlatego że zmienneWithEventsmuszą być na poziomie klasy. Jest to prawdą niezależnie od typu klasy, w której je umieszczasz.Zmienna
mblnCanceljest używana do anulowaniaLongTaskmetody.
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 mWidget wydarzenia klasy Widget pojawią się na liście rozwijanej po prawej stronie. Wybranie zdarzenia powoduje wyświetlenie odpowiedniej procedury zdarzenia z prefiksem mWidget i podkreślnika. Wszystkie procedury zdarzeń skojarzone ze zmienną WithEvents otrzymują nazwę zmiennej jako prefiks.
Aby zarządzać zdarzeniem
Wybierz
mWidgetz listy rozwijanej po lewej stronie w Edytorze kodu.PercentDoneWybierz zdarzenie z listy rozwijanej po prawej stronie. Edytor kodu otwiera proceduręmWidget_PercentDonezdarzenia.Uwaga / Notatka
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 SubZa każdym razem, gdy zdarzenie
PercentDonejest wywoływane, procedura zdarzenia wyświetla procent wykonania w kontrolceLabel. MetodaDoEventsumoż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 działania LongTask, zdarzenie Button2_Click jest wykonywane natychmiast, gdy DoEvents instrukcja zezwoli na przetwarzanie zdarzeń. Ustawiona jest zmienna na poziomie klasy mblnCancel na True, następnie zdarzenie mWidget_PercentDone testuje ją i ustawia argument ByRef Cancel na True.
Łączenie zmiennej WithEvents z obiektem
Form1 jest teraz skonfigurowany do obsługi zdarzeń obiektu Widget. Pozostaje tylko znaleźć Widget gdziekolwiek.
W przypadku deklarowania zmiennej WithEvents w czasie projektowania żaden obiekt nie jest z nim skojarzony. Zmienna WithEvents jest taka sama jak każda 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 (Zdarzenia Form1) z listy rozwijanej po lewej stronie w Edytorze kodu.
LoadWybierz zdarzenie z listy rozwijanej po prawej stronie. Edytor kodu otwiera proceduręForm1_Loadzdarzenia.Dodaj następujący kod dla procedury zdarzenia
Form1_Load, aby utworzyćWidget.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 Visual Basic tworzy obiekt Widget i łączy jego zdarzenia z procedurami zdarzeń związanych z mWidget. Od tego momentu, za każdym razem gdy Widget inicjuje zdarzenie PercentDone, wykonywana jest procedura zdarzenia mWidget_PercentDone.
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 metody LongTask należy zainicjować etykietę pokazującą procent ukończenia, a flaga na poziomie klasy Boolean do anulowania metody musi być ustawiona na wartość False.
LongTask jest wywołane z czasem trwania zadania wynoszącym 12,2 sekundy. Zdarzenie PercentDone jest wywoływane raz na jedną trzecią sekundy. Za każdym razem, gdy zdarzenie jest wywoływane, procedura zdarzenia mWidget_PercentDone jest wykonywana.
Po zakończeniu LongTask testowane jest, czy mblnCancel zakończyło się normalnie, czy też zostało zatrzymane, ponieważ LongTask został ustawiony na wartość mblnCancel. Procent ukończenia jest aktualizowany tylko w pierwszym przypadku.
Aby uruchomić program
Naciśnij F5, aby umieścić projekt w trybie uruchamiania.
Kliknij przycisk Uruchom zadanie . Za każdym razem gdy
PercentDonezdarzenie jest wywoływane, etykieta jest aktualizowana procentem ukończenia zadania.Kliknij przycisk Anuluj , aby zatrzymać zadanie. Zwróć uwagę, że wygląd przycisku Anuluj nie zmienia się natychmiast po kliknięciu. Zdarzenie
Clicknie może wystąpić, dopókiMy.Application.DoEventsinstrukcja nie zezwala na przetwarzanie zdarzeń.Uwaga / Notatka
Metoda
My.Application.DoEventsnie 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 umożliwić formularzowi bezpośrednią obsługę zdarzeń, możesz użyć wielowątkowości. Aby uzyskać więcej informacji, zobacz Managed Threading (Zarządzanie wątkami).
Może się okazać, że uruchomienie programu za pomocą F11 i przechodzenie przez kod linia po linii jest pouczające. Możesz wyraźnie zobaczyć, jak wykonanie wchodzi do LongTask, a następnie ponownie wchodzi do Form1 za każdym razem gdy zdarzenie PercentDone jest wywoływane.
Co by się stało, gdyby wykonanie wróciło do kodu Form1, a metoda LongTask została wywołana ponownie? Najgorszym scenariuszem byłoby przepełnienie stosu, które może wystąpić, jeśli LongTask byłoby wywoływane za każdym razem, gdy zdarzenie wystąpi.
Zmienna mWidget może obsługiwać zdarzenia dla innego obiektu Widget przez przypisanie referencji do nowego Widget do mWidget. W rzeczywistości możesz sprawić, że kod w Button1_Click będzie wykonywany za każdym razem, gdy klikniesz przycisk.
Aby obsługiwać zdarzenia dla innego widżetu
Dodaj następujący wiersz kodu do procedury
Button1_Click, bezpośrednio poprzedzając wiersz, który czytamWidget.LongTask(12.2, 0.33).mWidget = New Widget ' Create a new Widget object.
Powyższy kod tworzy nowy Widget przy każdym kliknięciu przycisku. Gdy tylko metoda LongTask zakończy się, odwołanie do elementu Widget zostanie zwolnione, a Widget zniszczone.
Zmienna WithEvents może zawierać tylko jedno odwołanie do obiektu w danym momencie, więc w przypadku przypisania innego Widget obiektu do mWidgetobiektu zdarzenia poprzedniego Widget obiektu nie będą już obsługiwane. Jeśli mWidget jest jedyną zmienną obiektu zawierającą odwołanie do starego Widgetobiektu , 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 / Notatka
Można zadeklarować dowolną liczbę WithEvents zmiennych, ale tablice WithEvents zmiennych nie są obsługiwane.