Оператор Event
Объявляет пользовательское событие.
Синтаксис
[ <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
Детали
Часть | Description |
---|---|
attrlist |
Необязательно. Список атрибутов, применимых к этому событию. Несколько атрибутов разделяются запятыми. Необходимо заключить список атрибутов в угловые скобки ("< " и "> "). |
accessmodifier |
Необязательно. Указывает, какой код может получать доступ к событию. Может применяться один из перечисленных ниже типов. - Общедоступный — любой код, который может получить доступ к элементу, который объявляет, что он может получить к нему доступ. - Защищенный — только код в своем классе или производный класс может получить к нему доступ. - Друг— доступ к нему может получить только код в той же сборке. - Закрытый — только код в элементе, который объявляет, что он может получить к нему доступ. - Защищенный код только для друга в классе события, производном классе или той же сборке может получить к нему доступ. - Закрытый защищенный код в классе события или производном классе в той же сборке может получить к нему доступ. |
Shared |
Необязательно. Указывает, что это событие не связано с определенным экземпляром класса или структуры. |
Shadows |
Необязательно. Указывает, что это событие повторно объявляет и скрывает программные элементы с одинаковыми именами или набор перегруженных элементов в базовом классе. Можно скрыть любой тип объявленного элемента, используя любой другой тип. Скрытый элемент недоступен из производного класса, который его скрывает, за исключением тех классов, из которых недоступен скрывающий элемент. Например, если элемент Private скрывает элемент базового класса, то код, у которого нет разрешений на доступ к элементу Private , получает доступ к элементу базового класса. |
eventname |
Обязательный. Имя события; соответствует стандартным правилам именования переменных. |
parameterlist |
Необязательно. Список локальных переменных, которые представляют параметры этого события. Необходимо заключить список параметров в скобки. |
Implements |
Необязательно. Указывает, что это событие реализует событие интерфейса. |
implementslist |
Является обязательным, если предоставлен параметр Implements . Список реализуемых процедур Sub . Несколько процедур разделяются запятыми.implementedprocedure [ , implementedprocedure ... ] Каждый элемент implementedprocedure имеет перечисленные ниже синтаксис и компоненты.interface .definedname - interface — обязательный. Имя интерфейса, реализуемого классом или структурой, содержащими эту процедуру.- Definedname — обязательный. Имя, под которым процедура определена в interface . Оно не должно совпадать с name , именем, которое эта процедура использует для реализации определенной процедуры. |
Custom |
Обязательный. События, объявленные как Custom , должны определять настраиваемые методы доступа AddHandler , RemoveHandler и RaiseEvent . |
delegatename |
Необязательно. Имя делегата, указывающего подпись обработчика событий. |
AddHandler |
Обязательный. Объявляет метод доступа AddHandler , который задает операторы, выполняемые при добавлении обработчика событий, явно с помощью оператора AddHandler или неявно с помощью предложения Handles . |
End AddHandler |
Обязательный. Завершает блок AddHandler . |
value |
Обязательный. Имя параметра. |
RemoveHandler |
Обязательный. Объявляет метод доступа RemoveHandler , который задает операторы, выполняемые при удалении обработчика событий с помощью оператора RemoveHandler . |
End RemoveHandler |
Обязательный. Завершает блок RemoveHandler . |
RaiseEvent |
Обязательный. Объявляет метод доступа RaiseEvent , который задает операторы, выполняемые при создании события с помощью оператора RaiseEvent . Как правило, при этом вызывается список делегатов, обслуживаемых методами доступа AddHandler и RemoveHandler . |
End RaiseEvent |
Обязательный. Завершает блок RaiseEvent . |
delegatesignature |
Обязательный. Список параметров, соответствующий параметрам, требуемым делегатом delegatename . Необходимо заключить список параметров в скобки. |
statements |
Необязательно. Операторы, содержащие тела методов AddHandler , RemoveHandler и RaiseEvent . |
End Event |
Обязательный. Завершает блок Event . |
Замечания
После объявления события используйте оператор RaiseEvent
для создания события. Типичные события можно объявлять и создавать, как показано в следующих фрагментах кода.
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
Примечание.
Аргументы событий можно объявлять так же, как аргументы процедур, за следующими исключениями: события не могут иметь именованные аргументы, аргументы ParamArray
и аргументы Optional
. События не имеют возвращаемых значений.
Для обработки события его необходимо связать с подпрограммой обработчика событий с помощью оператора Handles
или AddHandler
. Подписи подпрограммы и события должны совпадать. Для обработки общего события необходимо использовать оператор AddHandler
.
Event
можно использовать только на уровне модуля. Это означает, что контекст объявления для события должен быть классом, структурой, модулем или интерфейсом и не может быть исходным файлом, пространством имен, процедурой или блоком. Дополнительные сведения см. в разделе Контексты объявления и уровни доступа по умолчанию.
В большинстве случаев для объявления события можно использовать первый пример синтаксиса в разделе "Синтаксис" этой статьи. Однако в некоторых сценариях требуется контролировать поведение события более детально. Последний пример синтаксиса в разделе "Синтаксис" этой статьи, в котором используется ключевое слово Custom
, обеспечивает такие возможности, позволяя определять настраиваемые события. В настраиваемом событии можно точно указать, что происходит, когда код добавляет или удаляет обработчик события для события или когда код вызывает событие. Примеры см. в статье "Практическое руководство. Объявление настраиваемых событий для экономии памяти и практическое руководство. Объявление настраиваемых событий для предотвращения блокировки".
Пример
В следующем примере события используются для выполнения обратного отсчета от 10 до 0 секунд. Код иллюстрирует различные связанные с событиями методы, свойства и операторы. В том числе оператор RaiseEvent
.
Класс, который вызывает событие, является источником события, а методы, обрабатывающие события, — обработчиками событий. Источник события может иметь несколько обработчиков для создаваемых им событий. Когда класс создает событие, это событие создается во всех классах, выбранных для обработки событий данного экземпляра объекта.
В примере также используется форма (Form1
) с кнопкой (Button1
) и текстовым полем (TextBox1
). При нажатии кнопки в первом текстовом поле отображается обратный отсчет от 10 до 0 секунд. По истечении всего времени (10 секунд) в первом текстовом поле отображается надпись Done.
Код для Form1
указывает начальное и конечное состояния формы. Он также содержит код, выполняемый при создании событий.
Чтобы использовать этот пример, откройте новый проект Windows Forms. Затем добавьте кнопку с именем Button1
и текстовое поле с именем TextBox1
в главную форму с именем Form1
. Затем щелкните форму правой кнопкой мыши и щелкните "Просмотреть код ", чтобы открыть редактор кода.
Добавьте переменную WithEvents
в раздел объявлений класса Form1
:
Private WithEvents mText As TimerState
Добавьте следующий код в код для Form1
. Замените все повторяющиеся процедуры, которые могут существовать, такие как Form_Load
или 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
Нажмите клавишу F5, чтобы запустить предыдущий пример, и нажмите кнопку "Пуск". Первое текстовое поле начинает обратный отсчет. По истечении всего времени (10 секунд) в первом текстовом поле отображается надпись Done.
Примечание.
Способ обработки событий методом My.Application.DoEvents
отличается от обработки событий формой. Чтобы разрешить форме обрабатывать события напрямую, можно использовать многопоточность. Дополнительные сведения см. в разделе "Управляемый поток".
См. также
- Оператор RaiseEvent
- Оператор Implements
- События
- Оператор AddHandler
- Оператор RemoveHandler
- Маркеры
- Оператор Delegate
- Практическое руководство. Объявление пользовательских событий для экономии памяти
- Практическое руководство. Объявление пользовательских событий для предотвращения блокировки
- Shared
- Shadows