Udostępnij za pomocą


Przewodnik: 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, 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

  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 w Form1, dlatego że zmienne WithEvents 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 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

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

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

  1. Wybierz (Zdarzenia Form1) 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 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

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

  2. Kliknij przycisk Uruchom zadanie . Za każdym razem gdy PercentDone zdarzenie jest wywoływane, etykieta jest aktualizowana procentem 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 / Notatka

    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 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 czyta mWidget.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.

Zobacz także