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  

Części

Część Opis
attrlist Opcjonalny. Lista atrybutów, które mają zastosowanie do tego zdarzenia. Wiele atrybutów jest rozdzielonych przecinkami. Listę atrybutów należy ująć w nawiasy kątowe (" < " i " > ").
accessmodifier Opcjonalny. Określa, jaki kod może uzyskać dostęp do zdarzenia. Może być jedną z następujących czynności:

- Publiczne— każdy kod, który może uzyskać dostęp do elementu, który go deklaruje, może uzyskać do niego dostęp.
- Chronione— tylko kod w swojej klasie lub klasie pochodnej może uzyskać do niego dostęp.
- Znajomy— tylko kod w tym samym zestawie może uzyskać do niego dostęp.
- Private— tylko kod w elemencie, który deklaruje, że może uzyskać do niego dostęp.
- Chroniony kodznajomy — tylko kod w klasie zdarzenia, klasie pochodnej lub tym samym zestawie może uzyskać do niego dostęp.
- Private Protected— dostęp do niego może uzyskać tylko kod w klasie zdarzenia lub klasa pochodna w tym samym zestawie.
Shared Opcjonalny. Określa, że to zdarzenie nie jest skojarzone z określonym wystąpieniem klasy lub struktury.
Shadows Opcjonalny. Wskazuje, że to zdarzenie ponownie reklaruje i ukrywa element programistycznie o identycznej nazwie lub zestaw przeciążonych elementów w klasie bazowej. Każdy rodzaj zadeklarowanego elementu można zasłonić dowolnym innym rodzajem.

Element w tle jest niedostępny z poziomu klasy pochodnej, która go zacienia, z wyjątkiem sytuacji, w której element cieniowania jest niedostępny. Na przykład jeśli element przesłania element klasy bazowej, kod, który nie ma uprawnień dostępu do elementu, zamiast tego uzyskuje dostęp do Private Private elementu klasy bazowej.
eventname Wymagane. Nazwa zdarzenia; jest zgodna ze standardowymi konwencjami nazewnictwa zmiennych.
parameterlist Opcjonalny. Lista zmiennych lokalnych reprezentujących parametry tego zdarzenia. Listę parametrów należy ująć w nawiasy.
Implements Opcjonalny. Wskazuje, że to zdarzenie implementuje zdarzenie interfejsu.
implementslist Wymagane, Implements jeśli jest podany. Lista Sub wdrażanych procedur. Wiele procedur jest rozdzielonych przecinkami:

implementedprocedure [ , implementedprocedure ... ]

Każda implementedprocedure z nich 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 jest zdefiniowana procedura w interface . Nie musi być taka sama jak nazwa , która jest używana w tej procedurze do name zaimplementowania zdefiniowanej procedury.
Custom Wymagane. Zdarzenia zadeklarowane jako Custom muszą definiować AddHandler niestandardowe , i RemoveHandler RaiseEvent accessors.
delegatename Opcjonalny. Nazwa delegata, który określa sygnaturę procedury obsługi zdarzeń.
AddHandler Wymagane. Deklaruje dostęp, który określa instrukcje do wykonania po dodaniu procedury obsługi zdarzeń, jawnie przy użyciu instrukcji lub niejawnie przy AddHandler AddHandler użyciu Handles klauzuli .
End AddHandler Wymagane. Kończy AddHandler blok.
value Wymagane. Nazwa parametru.
RemoveHandler Wymagane. Deklaruje dostęp, który określa instrukcje do wykonania po usunięciu procedury obsługi zdarzeń RemoveHandler przy użyciu RemoveHandler instrukcji .
End RemoveHandler Wymagane. Kończy RemoveHandler blok.
RaiseEvent Wymagane. Deklaruje RaiseEvent dostęp, który określa instrukcje do wykonania, gdy zdarzenie zostanie podniesione przy użyciu RaiseEvent instrukcji . Zwykle wywołuje to listę delegatów utrzymywanych przez metody AddHandler dostępu RemoveHandler i .
End RaiseEvent Wymagane. Kończy RaiseEvent blok.
delegatesignature Wymagane. Lista parametrów, które pasuje do parametrów wymaganych przez delegatename delegata. Listę parametrów należy ująć w nawiasy.
statements Opcjonalny. Instrukcje zawierające treści AddHandler metod RemoveHandler , RaiseEvent i .
End Event Wymagane. Kończy Event blok.

Uwagi

Po zadeklarowania zdarzenia użyj instrukcji RaiseEvent , aby je podnieść. Typowe zdarzenie może być zadeklarowane i zgłoszone, 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 ParamArray argumentów, argumentów ani Optional argumentów. Zdarzenia nie mają wartości zwracanych.

Aby obsłużyć zdarzenie, należy skojarzyć je z podroutine procedury obsługi zdarzeń przy użyciu instrukcji Handles lub AddHandler . Podpisy podprogramu i zdarzenia muszą być zgodne. Aby obsłużyć zdarzenie udostępnione, należy użyć AddHandler instrukcji .

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

W większości przypadków do deklarowania zdarzeń można użyć pierwszej składni w sekcji Składnia tego tematu. Jednak niektóre scenariusze wymagają większej kontroli nad szczegółowym zachowaniem zdarzenia. Ostatnia składnia w sekcji Składnia w tym temacie, która używa słowa kluczowego , zapewnia tę kontrolę, umożliwiając Custom definiowanie zdarzeń niestandardowych. W przypadku zdarzenia niestandardowego określasz dokładnie, co się dzieje, 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 tematach How to: Declare Custom Events To Conserve Memory (Jak zadeklarować zdarzenia niestandardowe w celu oszczędzania pamięci) i How to: Declare Custom Events To Avoid Blocking (Jak zadeklarować zdarzenia niestandardowe w celu uniknięcia blokowania).

Przykład

W poniższym przykładzie użyto zdarzeń do odliczania sekund z 10 do 0. Kod ilustruje kilka metod, właściwości i instrukcji związanych ze zdarzeniami. Obejmuje to RaiseEvent instrukcje .

Klasa, która wywołuje zdarzenie, jest źródłem zdarzeń, a metody, które przetwarzają zdarzenie, są programami obsługi zdarzeń. Źródło zdarzeń może mieć wiele programów obsługi dla generowanych zdarzeń. Gdy klasa zgłasza zdarzenie, to zdarzenie jest wywoływane dla każdej klasy, która została wybrana do obsługi zdarzeń dla tego wystąpienia obiektu.

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

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

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

Dodaj WithEvents zmienną do sekcji deklaracji Form1 klasy :

Private WithEvents mText As TimerState

Dodaj następujący kod do kodu dla Form1 . Zastąp wszelkie istniejące zduplikowane procedury, 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 komunikat "Gotowe".

Uwaga

Metoda My.Application.DoEvents nie przetwarza zdarzeń w taki sam sposób, jak formularz. Aby umożliwić formularzowi bezpośrednią obsługę zdarzeń, można użyć wielowątkowania. Aby uzyskać więcej informacji, zobacz Managed Threading.

Zobacz też