Оператор Event
Обновлен: Ноябрь 2007
Объявляет определяемое пользователем событие.
[ <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
Компоненты
Часть |
Описание |
---|---|
attrlist |
Необязательно. Список атрибутов, которые применяются для данного события. Несколько атрибутов разделяются запятыми. Необходимо заключить Список атрибутов в угловые скобки ("<" и ">"). |
accessmodifier |
Необязательно. Указывает, что код может иметь доступ к событию. Может быть одно из следующих:
Можно указать Protected Friend, чтобы разрешить доступ из кода класса события, производного класса или той же сборки. |
Shared |
Необязательно. Указывает, что это событие не связано ни с каким конкретным экземпляром класса или структуры. |
Shadows |
Необязательно. Указывает, что данное событие повторно объявляет и скрывает идентично именованный программный элемент, или набор перегружаемых элементов, в базовом классе. Можно затенить любой тип объявленного элемента с помощью любого другого типа. Скрытый элемент недоступен из производного класса, в котором он скрыт, за исключением местоположений, где он является недоступным. Например, если элемент Private скрывает элемент базового класса, код, который не имеет разрешения на доступ к элементу Private, обращается к элементу базового класса. |
eventname |
Обязательно. Имя события, удовлетворяющее обычным правилам именования переменных. |
parameterlist |
Необязательно. Список локальных переменных, предоставляющих параметры данного события. Необходимо заключить Список параметров в круглые скобки. |
Implements |
Необязательно. Указывает на то, что это событие реализует событие интерфейса. |
implementslist |
Требуется, если указан Implements. Список реализуемых процедур Sub. Несколько процедур разделяются запятыми: реализуемая_процедура [ , реализуемая_процедура ... ] Каждое 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 секунд), первое текстовом поле отображает "Готово".
Код для Form1 задает начальное и конечное состояния формы. Там также содержится код, исполняемый при создании событий.
Чтобы использовать этот пример, создайте новый проект Windows Forms. Затем добавьте кнопку с именем Button1 и текстовое поле с именем TextBox1 на главную форму с именем Form1. Затем щелкните правой кнопкой мыши форму и выберите в меню пункт Просмотреть код, чтобы открыть редактор кода.
Добавьте переменную WithEvents в раздел объявления класса Form1.
Private WithEvents mText As TimerState
Добавьте следующий код в код для Form1. Замените все дубликаты процедур, которые могут существовать, такие как Form_Load или Button_Click.
Private Sub Form1_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) _
Handles MyBase.Load
Button1.Text = "Start"
mText = New TimerState
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
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 секунд), первое текстовом поле отображает "Готово".
Примечание. |
---|
Метод My.Application.DoEvents обрабатывает события не так, как форма. Чтобы разрешить форме непосредственно обрабатывать события, можно использовать многопоточность. Дополнительные сведения см. в разделе Многопотоковость в Visual Basic. |
См. также
Задачи
Практическое руководство. Добавление событий в класс
Практическое руководство. Объявление событий, которые экономят использование памяти
Практическое руководство. Объявление события, исключающего блокирование