Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Объявляет определяемое пользователем событие.
Синтаксис
[ <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 |
Необязательно. Указывает, какой код может получить доступ к событию. Может быть одним из следующих вариантов: - Общедоступный — любой код, который может получить доступ к элементу, который объявляет, что он может получить к нему доступ. - Защищенный — только код в своем классе или производный класс может получить к нему доступ. - Друг— доступ к нему может получить только код в той же сборке. - Закрытый — только код в элементе, который объявляет, что он может получить к нему доступ. - Защищенный код только для друга в классе события, производном классе или той же сборке может получить к нему доступ. - Закрытый защищенный код в классе события или производном классе в той же сборке может получить к нему доступ. |
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
аргументы. События не имеют возвращаемых значений.
Чтобы обработать событие, необходимо связать его с подпрограммой обработчика событий с помощью инструкции или AddHandler
инструкцииHandles
. Подписи подпрограммы и события должны совпадать. Для обработки общего события необходимо использовать инструкцию 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() 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 секунд) истек, в первом текстовом поле отображается "Готово".
Замечание
Метод My.Application.DoEvents
не обрабатывает события таким же образом, как и форма. Чтобы форма обрабатывала события напрямую, можно использовать многопоточность. Для получения дополнительной информации см. Управляемая многозадачность.