Wskazówki: deklarowanie i wywoływanie zdarzeń (Visual Basic)

W tym przewodniku pokazano, jak zadeklarować i zgłosić zdarzenia dla klasy o nazwie Widget. Po wykonaniu tych kroków możesz przeczytać temat towarzyszący, Przewodnik: obsługa zdarzeń, który pokazuje, jak używać zdarzeń z Widget obiektów w celu udostępnienia informacji o stanie w aplikacji.

Klasa widżetu

Załóżmy na chwilę, że masz klasę Widget . Klasa Widget ma metodę, która może zająć dużo czasu, i chcesz, aby aplikacja mogła umieścić jakiś wskaźnik ukończenia.

Oczywiście można sprawić, że Widget obiekt pokaże okno dialogowe procentu, ale następnie utkniesz z tym oknem dialogowym w każdym projekcie, w którym użyto Widget klasy. Dobrą zasadą projektowania obiektu jest pozwolić aplikacji, która używa obiektu do obsługi interfejsu użytkownika — chyba że cały cel obiektu jest zarządzanie formularzem lub oknom dialogowym.

Widget Celem programu jest wykonanie innych zadań, dlatego lepiej jest dodać PercentDone zdarzenie i umożliwić procedurę, która wywołuje Widgetmetody "obsługują to zdarzenie i wyświetlają aktualizacje stanu. Zdarzenie PercentDone może również zapewnić mechanizm anulowania zadania.

Aby skompilować przykład kodu dla tego tematu

  1. Otwórz nowy projekt aplikacji systemu Windows w języku Visual Basic i utwórz formularz o nazwie Form1.

  2. Dodaj dwa przyciski i etykietę do Form1elementu .

  3. Nadaj obiektom nazwę, jak pokazano w poniższej tabeli.

    Objekt Właściwości Ustawienie
    Button1 Text Zadanie podrzędne uruchamiania
    Button2 Text Anuluj
    Label (Name), Text lblPercentDone, 0
  4. W menu Projekt wybierz pozycję Dodaj klasę, aby dodać klasę o nazwie Widget.vb do projektu.

Aby zadeklarować zdarzenie dla klasy Widget

  • Użyj słowa kluczowego Event , aby zadeklarować zdarzenie w Widget klasie. Należy pamiętać, że zdarzenie może mieć ByVal argumenty iByRef, jak PercentDoneWidgetpokazuje zdarzenie:

    Public Event PercentDone(ByVal Percent As Single,
                             ByRef Cancel As Boolean)
    

Gdy obiekt wywołujący odbiera PercentDone zdarzenie, Percent argument zawiera wartość procentową ukończenia zadania. Argument Cancel można ustawić na wartość True , aby anulować metodę, która wywołała zdarzenie.

Uwaga

Argumenty zdarzeń można zadeklarować tak samo jak argumenty procedur, z następującymi wyjątkami: Zdarzenia nie mogą mieć Optional argumentów lub ParamArray nie mają zwracanych wartości.

Zdarzenie PercentDone jest wywoływane przez metodę LongTaskWidget klasy . LongTask przyjmuje dwa argumenty: czas, przez który metoda udaje, że wykonuje pracę, oraz minimalny interwał czasu przed wstrzymaniem LongTask w PercentDone celu podniesienia zdarzenia.

Aby podnieść zdarzenie PercentDone

  1. Aby uprościć dostęp do właściwości używanej Timer przez tę klasę, dodaj instrukcję Imports na początku sekcji deklaracji modułu klasy powyżej instrukcji Class Widget .

    Imports Microsoft.VisualBasic.DateAndTime
    
  2. Dodaj następujący kod do Widget klasy:

    Public Sub LongTask(ByVal Duration As Single,
                        ByVal MinimumInterval As Single)
        Dim Threshold As Single
        Dim Start As Single
        Dim blnCancel As Boolean
    
        ' The Timer property of the DateAndTime object returns the seconds
        ' and milliseconds that have passed since midnight.
        Start = CSng(Timer)
        Threshold = MinimumInterval
    
        Do While CSng(Timer) < (Start + Duration)
            ' In a real application, some unit of work would
            ' be done here each time through the loop.
            If CSng(Timer) > (Start + Threshold) Then
                RaiseEvent PercentDone(
                Threshold / Duration, blnCancel)
                ' Check to see if the operation was canceled.
                If blnCancel Then Exit Sub
                Threshold = Threshold + MinimumInterval
            End If
        Loop
    End Sub
    

Gdy aplikacja wywołuje metodęLongTask, Widget klasa zgłasza zdarzenie co MinimumInterval sekundyPercentDone. Po powrocie zdarzenia sprawdza, LongTask czy Cancel argument został ustawiony na Truewartość .

W tym miejscu konieczne jest kilka zastrzeżeń. Dla uproszczenia procedura zakłada, LongTask że wiesz z wyprzedzeniem, jak długo będzie trwać zadanie. To prawie nigdy nie jest tak. Dzielenie zadań na fragmenty o równomiernym rozmiarze może być trudne, a często to, co ma największe znaczenie dla użytkowników, to po prostu ilość czasu, który przechodzi, zanim otrzymają wskazanie, że coś się dzieje.

Być może w tym przykładzie wykryto kolejną wadę. Właściwość Timer zwraca liczbę sekund, które przeszły od północy, w związku z czym aplikacja utknie, jeśli jest uruchomiona tuż przed północą. Bardziej ostrożne podejście do pomiaru czasu wymagałoby warunków granic, takich jak to, lub całkowicie ich unikać przy użyciu właściwości, takich jak Now.

Teraz, gdy Widget klasa może zgłaszać zdarzenia, możesz przejść do następnego przewodnika. Przewodnik: Obsługa zdarzeń pokazuje, jak używać WithEvents programu obsługi zdarzeń do skojarzenia programu obsługi zdarzeń z zdarzeniem PercentDone .

Zobacz też