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 Widget
metody "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
Otwórz nowy projekt aplikacji systemu Windows w języku Visual Basic i utwórz formularz o nazwie
Form1
.Dodaj dwa przyciski i etykietę do
Form1
elementu .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 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 wWidget
klasie. Należy pamiętać, że zdarzenie może miećByVal
argumenty iByRef
, jakPercentDone
Widget
pokazuje 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ę LongTask
Widget
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
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 instrukcjiClass Widget
.Imports Microsoft.VisualBasic.DateAndTime
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 True
wartość .
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
.