Event — Instrukcja

Deklaruje zdarzenie zdefiniowane przez użytkownika.

Składnia

[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _  
[ Implements implementslist ]  
' -or-  
[ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Event eventname As delegatename _  
[ Implements implementslist ]  
' -or-  
 [ <attrlist> ] [ accessmodifier ] _  
[ Shared ] [ Shadows ] Custom Event eventname As delegatename _  
[ Implements implementslist ]  
   [ <attrlist> ] AddHandler(ByVal value As delegatename)  
      [ statements ]  
   End AddHandler  
   [ <attrlist> ] RemoveHandler(ByVal value As delegatename)  
      [ statements ]  
   End RemoveHandler  
   [ <attrlist> ] RaiseEvent(delegatesignature)  
      [ statements ]  
   End RaiseEvent  
End Event  

generatora

Element opis
attrlist Opcjonalny. Lista atrybutów, które mają zastosowanie do tego zdarzenia. Wiele atrybutów jest rozdzielonych przecinkami. Należy ująć listę atrybutów w nawiasach kątowych ("<" i ">").
accessmodifier Opcjonalny. Określa, jaki kod może uzyskać dostęp do zdarzenia. Może być jednym z następujących elementów:

- Publiczny — dowolny kod, który może uzyskać dostęp do elementu, który deklaruje, że może uzyskać do niego dostęp.
- Chronione — tylko kod w swojej klasie lub klasie pochodnej może uzyskać do niego dostęp.
- Przyjaciel — tylko kod w tym samym zestawie może uzyskać do niego dostęp.
- Prywatny — tylko kod w elemecie, który deklaruje, że może uzyskać do niego dostęp.
- Chroniony kod tylko zaprzyjaźniony w klasie zdarzenia, klasie pochodnej lub ten sam zestaw może uzyskać do niego dostęp.
- Prywatny kod chroniony tylko w klasie zdarzenia lub klasie pochodnej w tym samym zestawie może uzyskać do niego dostęp.
Shared Opcjonalny. Określa, że to zdarzenie nie jest skojarzone z określonym wystąpieniem klasy lub struktury.
Shadows Opcjonalny. Wskazuje, że to zdarzenie redecyduje i ukrywa identycznie nazwany element programowania lub zestaw przeciążonych elementów w klasie bazowej. Możesz cieniować dowolny rodzaj zadeklarowanego elementu z dowolnym innym rodzajem.

Element w tle jest niedostępny z klasy pochodnej, która go zaciemnia, z wyjątkiem tego, gdzie element cieniowania jest niedostępny. Jeśli na przykład Private element w tle element klasy bazowej, kod, który nie ma uprawnień dostępu do elementu, uzyskuje dostęp Private do elementu klasy bazowej zamiast tego.
eventname Wymagany. Nazwa zdarzenia; jest zgodna ze standardową konwencją nazewnictwa zmiennych.
parameterlist Opcjonalny. Lista zmiennych lokalnych reprezentujących parametry tego zdarzenia. Należy ująć listę parametrów w nawiasy.
Implements Opcjonalny. Wskazuje, że to zdarzenie implementuje zdarzenie interfejsu.
implementslist Wymagane w przypadku Implements dostarczenia. Sub Lista wdrożonych procedur. Wiele procedur jest rozdzielonych przecinkami:

implementprocedure [ , implementprocedure ... ]

Każda z nich implementedprocedure ma następującą składnię i części:

interface.definedname

- interface -Wymagane. Nazwa interfejsu, który implementuje ta procedura zawierająca klasę lub strukturę.
- Definedname -Wymagane. Nazwa, za pomocą której procedura jest zdefiniowana w pliku interface. Nie musi to być takie samo jak name, nazwa, której używa ta procedura do zaimplementowania zdefiniowanej procedury.
Custom Wymagany. Zdarzenia zadeklarowane jako Custom muszą definiować niestandardowe AddHandlermetody dostępu , RemoveHandleri RaiseEvent .
delegatename Opcjonalny. Nazwa delegata, który określa sygnaturę programu obsługi zdarzeń.
AddHandler Wymagany. Deklaruje metodę AddHandler dostępu, która określa instrukcje do wykonania po dodaniu programu obsługi zdarzeń, jawnie przy użyciu instrukcji lub niejawnie przy użyciu AddHandler klauzuli Handles .
End AddHandler Wymagany. AddHandler Przerywa blok.
value Wymagany. Nazwa parametru.
RemoveHandler Wymagany. Deklaruje metodę RemoveHandler dostępu, która określa instrukcje do wykonania po usunięciu programu obsługi zdarzeń przy użyciu instrukcji RemoveHandler .
End RemoveHandler Wymagany. RemoveHandler Przerywa blok.
RaiseEvent Wymagany. Deklaruje metodę RaiseEvent dostępu, która określa instrukcje do wykonania po wystąpieniu zdarzenia przy użyciu instrukcji RaiseEvent . Zazwyczaj wywołuje to listę delegatów obsługiwanych przez AddHandler metody i RemoveHandler .
End RaiseEvent Wymagany. RaiseEvent Przerywa blok.
delegatesignature Wymagany. Lista parametrów pasujących do parametrów wymaganych przez delegata delegatename . Należy ująć listę parametrów w nawiasy.
statements Opcjonalny. Instrukcje zawierające elementy AddHandlermetod , RemoveHandleri RaiseEvent .
End Event Wymagany. Event Przerywa blok.

Uwagi

Po zadeklarowaniu zdarzenia użyj instrukcji RaiseEvent , aby zgłosić zdarzenie. Typowe zdarzenie może zostać zadeklarowane i podniesione, jak pokazano w następujących fragmentach:

Public Class EventSource
    ' Declare an event.
    Public Event LogonCompleted(ByVal UserName As String)
    Sub CauseEvent()
        ' Raise an event on successful logon.
        RaiseEvent LogonCompleted("AustinSteele")
    End Sub
End Class

Uwaga

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

Aby obsłużyć zdarzenie, należy skojarzyć je z podroutyną obsługi zdarzeń przy użyciu instrukcji Handles or AddHandler . Podpisy podrouty i zdarzenie muszą być zgodne. Aby obsłużyć zdarzenie udostępnione, należy użyć instrukcji AddHandler .

Można używać Event tylko na poziomie modułu. Oznacza to, że kontekst deklaracji zdarzenia musi być klasą, strukturą, modułem lub interfejsem i nie może być plikiem źródłowym, przestrzenią nazw, procedurą lub blokiem. Aby uzyskać więcej informacji, zobacz Konteksty deklaracji i Domyślne poziomy dostępu.

W większości przypadków można użyć pierwszej składni w sekcji Składnia tego tematu do deklarowania zdarzeń. Jednak niektóre scenariusze wymagają większej kontroli nad szczegółowym zachowaniem zdarzenia. Ostatnia składnia w sekcji Składnia tego tematu, która używa Custom słowa kluczowego, zapewnia tę kontrolkę, umożliwiając definiowanie zdarzeń niestandardowych. W przypadku zdarzenia niestandardowego określasz dokładnie, co ma miejsce, gdy kod dodaje lub usuwa program obsługi zdarzeń do lub ze zdarzenia albo gdy kod zgłasza zdarzenie. Przykłady można znaleźć w temacie How to: Declare Custom Events To Conserve Memory ( Instrukcje: deklarowanie zdarzeń niestandardowych w celu uniknięcia blokowania).

Przykład

W poniższym przykładzie użyto zdarzeń, aby odliczyć sekundy z zakresu od 10 do 0. Kod ilustruje kilka metod, właściwości i instrukcji związanych z zdarzeniami. Obejmuje to instrukcję RaiseEvent .

Klasa, która zgłasza zdarzenie, jest źródłem zdarzeń, a metody przetwarzania zdarzenia to programy obsługi zdarzeń. Źródło zdarzeń może mieć wiele procedur obsługi dla generowanych zdarzeń. Gdy klasa zgłasza zdarzenie, to zdarzenie jest wywoływane w każdej klasie, która wybrała obsługę zdarzeń dla tego wystąpienia obiektu.

W przykładzie użyto również formularza (Form1) z przyciskiem (Button1) i polem tekstowym (TextBox1). Po kliknięciu przycisku pierwsze pole tekstowe wyświetla odliczanie z zakresu od 10 do 0 sekund. Po upływie pełnego czasu (10 sekund) pierwsze pole tekstowe wyświetla tekst "Gotowe".

Kod dla Form1 określa początkowe i końcowe stany formularza. Zawiera również kod wykonywany podczas wywoływanych zdarzeń.

Aby użyć tego przykładu, otwórz nowy projekt Windows Forms. Następnie dodaj przycisk o nazwie i pole tekstowe o nazwie Button1TextBox1 do formularza głównego o nazwie Form1. Następnie kliknij prawym przyciskiem myszy formularz i kliknij polecenie Wyświetl kod , aby otworzyć edytor kodu.

Dodaj zmienną WithEvents do sekcji Form1 deklaracji klasy:

Private WithEvents mText As TimerState

Dodaj następujący kod do kodu dla elementu Form1. Zastąp wszelkie zduplikowane procedury, które mogą istnieć, takie jak Form_Load lub Button_Click.

Private Sub Form1_Load() Handles MyBase.Load
    Button1.Text = "Start"
    mText = New TimerState
End Sub
Private Sub Button1_Click() Handles Button1.Click
    mText.StartCountdown(10.0, 0.1)
End Sub

Private Sub mText_ChangeText() Handles mText.Finished
    TextBox1.Text = "Done"
End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double
  ) Handles mText.UpdateTime

    TextBox1.Text = Format(Countdown, "##0.0")
    ' Use DoEvents to allow the display to refresh.
    My.Application.DoEvents()
End Sub

Class TimerState
    Public Event UpdateTime(ByVal Countdown As Double)
    Public Event Finished()
    Public Sub StartCountdown(ByVal Duration As Double,
                              ByVal Increment As Double)
        Dim Start As Double = DateAndTime.Timer
        Dim ElapsedTime As Double = 0

        Dim SoFar As Double = 0
        Do While ElapsedTime < Duration
            If ElapsedTime > SoFar + Increment Then
                SoFar += Increment
                RaiseEvent UpdateTime(Duration - SoFar)
            End If
            ElapsedTime = DateAndTime.Timer - Start
        Loop
        RaiseEvent Finished()
    End Sub
End Class

Naciśnij klawisz F5, aby uruchomić poprzedni przykład, a następnie kliknij przycisk z etykietą Uruchom. Pierwsze pole tekstowe zaczyna odliczać sekundy. Po upływie pełnego czasu (10 sekund) pierwsze pole tekstowe wyświetla tekst "Gotowe".

Uwaga

Metoda My.Application.DoEvents nie przetwarza zdarzeń w taki sam sposób, jak formularz. Aby umożliwić formularzowi obsługę zdarzeń bezpośrednio, możesz użyć wielowątkowość. Aby uzyskać więcej informacji, zobacz Managed Threading (Zarządzanie wątkami).

Zobacz też