Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Объявляет определяемое пользователем событие.
Синтаксис
[ <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и RemoveHandlerRaiseEvent методы. |
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 и текстовое поле с именем TextBox1Form1основной формы. Затем щелкните форму правой кнопкой мыши и щелкните "Просмотреть код ", чтобы открыть редактор кода.
WithEvents Добавьте переменную в раздел объявлений Form1 класса:
Public Class TimerExample
Private WithEvents mTimer As TimerState
Добавьте следующий код в код для Form1. Замените все повторяющиеся процедуры, которые могут существовать, например Form_Load или Button_Click.
Public Sub StartCountdownExample()
mTimer = New TimerState()
mTimer.StartCountdown(10.0, 1.0)
End Sub
Private Sub mTimer_UpdateTime(ByVal Countdown As Double) Handles mTimer.UpdateTime
Console.WriteLine("Time remaining: " & Format(Countdown, "##0.0") & " seconds")
End Sub
Private Sub mTimer_Finished() Handles mTimer.Finished
Console.WriteLine("Done")
End Sub
End Class
Public Class TimerState
Public Event UpdateTime(ByVal Countdown As Double)
Public Event Finished()
Public Sub StartCountdown(ByVal Duration As Double,
ByVal Increment As Double)
Dim SoFar As Double = 0
Do While SoFar < Duration
System.Threading.Thread.Sleep(CInt(Increment * 1000))
SoFar += Increment
RaiseEvent UpdateTime(Duration - SoFar)
Loop
RaiseEvent Finished()
End Sub
End Class
Нажмите клавишу F5, чтобы запустить предыдущий пример, и нажмите кнопку " Пуск". Первое текстовое поле начинает отсчитывать секунды. Когда полный рабочий день (10 секунд) истек, в первом текстовом поле отображается "Готово".
Замечание
Метод My.Application.DoEvents не обрабатывает события таким же образом, как и форма. Чтобы форма обрабатывала события напрямую, можно использовать многопоточность. Для получения дополнительной информации см. Управляемая многозадачность.