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

  1. Umieść następujący kod w pliku Form1:

    Private WithEvents mWidget As Widget
    Private mblnCancel As Boolean
    

    Słowo WithEvents kluczowe określa, że zmienna mWidget 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 anulowania LongTask 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 mWidgetzdarzenia 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

  1. Wybierz mWidget z listy rozwijanej po lewej stronie w Edytorze kodu.

  2. 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.

  3. 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 kontrolce Label . Metoda DoEvents umożliwia przemalować etykietę, a także daje użytkownikowi możliwość kliknięcia przycisku Anuluj .

  4. 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

  1. Wybierz pozycję (Zdarzenia formularza1) z listy rozwijanej po lewej stronie w Edytorze kodu.

  2. Load Wybierz zdarzenie z listy rozwijanej po prawej stronie. Edytor kodu otwiera procedurę Form1_Load zdarzenia.

  3. Dodaj następujący kod procedury Form1_Load zdarzeń, aby utworzyć element 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 program Visual Basic tworzy Widget obiekt i łączy swoje zdarzenia z procedurami zdarzeń skojarzonymi z mWidgetprogramem . 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 Truewartość . Procent ukończenia jest aktualizowany tylko w poprzednim przypadku.

Aby uruchomić program

  1. Naciśnij klawisz F5, aby umieścić projekt w trybie uruchamiania.

  2. Kliknij przycisk Uruchom zadanie. Za każdym razem, PercentDone gdy zdarzenie jest wywoływane, etykieta jest aktualizowana o wartość procentową ukończenia zadania.

  3. 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óki My.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 LongTaskwykonanie , 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 Form1metody , 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 odczytuje mWidget.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 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

Można zadeklarować dowolną liczbę WithEvents zmiennych, ale tablice WithEvents zmiennych nie są obsługiwane.

Zobacz też