События (Visual Basic)
Хотя можно представить проект Visual Studio как набор процедур, выполняемых в определенной последовательности, на самом деле, большинство программ управляются событиями, то есть поток выполнения определяется внешними воздействиями, называемыми событиями.
Под событием в данном случае подразумевается сигнал, сообщающий приложению, что произошло нечто важное. Например, когда пользователь щелкает элемент управления на форме, форма может инициировать событие Click и вызывать процедуру, обрабатывающую событие. События также допускают взаимодействие отдельных задач. Например, пользовательское приложение выполняет задачу по сортировке отдельно от основного приложения. Если пользователь отменяет сортировку, то приложение может послать событие отмены, которое остановит процесс сортировки.
Термины и основные понятия для событий
В этом разделе описываются термины и понятия, связанные с использованием событий в Visual Basic.
Объявление событий
События в классах, структурах, модулях и интерфейсах объявляются с помощью ключевого слова Event, как показано в следующем примере.
Event AnEvent(ByVal EventNumber As Integer)
Создание событий
Событие похоже на сообщение о том, что случилось что-то важное. Рассылка сообщения называется созданием события. В Visual Basic события вызываются с помощью инструкции RaiseEvent, как в следующем примере:
RaiseEvent AnEvent(EventNumber)
События должны вызываться в рамках класса, модуля или структуры, где они объявлены. Например, производный класс не может вызывать события, унаследованные из базового класса.
Отправители событий
Любой объект, способный вызывать события, является отправителем событий, также называемым источником событий. Формы, элементы управления и пользовательские объекты являются примерами отправителей событий.
Обработчики событий
Обработчики событий — это процедуры, вызываемые при возникновении соответствующего события. Можно использовать любые допустимые подпрограммы с соответствующей сигнатурой в качестве обработчика событий. Функция, тем не менее, не может быть использована в качестве обработчика событий, так как возвращение значения в источник события с ее помощью невозможно.
В Visual Basic используется стандартное положение об именовании обработчиков событий. Имя должно состоять из имени отправителя события, знака подчеркивания и имени события. Например, событие Click кнопки с именем button1 будет иметь имя Sub button1_Click.
Примечание
Рекомендуется следовать положению об именовании при определении обработчиков событий для пользовательских событий, но это необязательно, можно использовать любое допустимое имя подпрограммы.
Связывание событий с их обработчиками
Для того, чтобы обработчик событий был готов к использованию, его необходимо связать с событием посредством оператора Handles или AddHandler.
Оператор WithEvents и предложение Clause
Инструкция WithEvents и условие Handles предоставляют декларативный способ задания обработчиков событий. Событие, инициированное объектом, который объявлен с помощью ключевого слова WithEvents, могут обрабатываться любой процедурой с оператором Handles для данного события, как показано в следующем примере:
' Declare a WithEvents variable.
Dim WithEvents EClass As New EventClass
' Call the method that raises the object's events.
Sub TestEvents()
EClass.RaiseEvents()
End Sub
' Declare an event handler that handles multiple events.
Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent
MsgBox("Received Event.")
End Sub
Class EventClass
Public Event XEvent()
Public Event YEvent()
' RaiseEvents raises both events.
Sub RaiseEvents()
RaiseEvent XEvent()
RaiseEvent YEvent()
End Sub
End Class
Применение оператора WithEvents и предложения Handles часто является лучшим вариантом для обработчиков событий, поскольку используемый ими декларативный синтаксис делает обработку события проще для кодирования, чтения и отладки. Однако при использовании переменных WithEvents необходимо помнить о следующих ограничениях:
Нельзя использовать переменную WithEvents как объектную переменную. То есть ее невозможно объявить как Object — при объявлении переменной необходимо указать имя класса.
Поскольку общие события не связываются с экземплярами класса, нельзя использовать WithEvents для декларативной обработки общих событий. Нельзя также использовать WithEvents или Handles для обработки событий из Structure. В обоих случаях для обработки этих событий можно использовать оператор AddHandler.
Невозможно создать массивы переменных WithEvents.
Переменные WithEvents позволяют одному обработчику событий обрабатывать один или несколько видов событий или нескольким обработчикам событий обрабатывать один вид событий.
Хотя условие Handles является стандартным способом связывания события с обработчиком, связь посредством него может осуществляться только во время компиляции.
В некоторых случаях, например, когда события связаны с формами или элементами управления, Visual Basic автоматически задействует пустой обработчик событий и сопоставляет его с событием. Например, при двойном щелчке мышью командной кнопки на форме в режиме разработки Visual Basic создает пустой обработчик событий и переменную WithEvents для командной кнопки, как в следующем коде:
Friend WithEvents Button1 As System.Windows.Forms.Button
Protected Sub Button1_Click() Handles Button1.Click
End Sub
Операторы AddHandler и RemoveHandler
Оператор AddHandler аналогичен условию Handles в том, что оба позволяют задавать обработчик события. Однако AddHandler, использованный с RemoveHandler, обеспечивает большую гибкость, чем условие Handles,и позволяет динамически добавлять, удалять и изменять обработчик событий, связанный с событием. Если необходимо обработать общие события или события из структуры, следует использовать AddHandler.
AddHandler принимает два аргумента: имя события от отправителя событий, например элемента управления, и выражение, определяющее делегат. Не требуется явного определения класса делегата при использовании AddHandler, так как оператор AddressOf всегда возвращает ссылку на делегат. В следующем примере обработчик событий связывается с событием, вызванным объектом.
AddHandler Obj.XEvent, AddressOf Me.XEventHandler
RemoveHandler, отсоединяет событие от обработчика событий, используя при этом тот же синтаксис, что и AddHandler. Пример:
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler
В следующем примере обработчик событий связывается с событием, событие происходит. Обработчик событий перехватывает событие и выводит сообщение.
Затем первый обработчик событий удаляется и с событием сопоставляется другой обработчик событий. Когда событие происходит во второй раз, выводится другое сообщение.
Наконец, второй обработчик событий удаляется, а событие происходит в третий раз. Поскольку теперь нет связанного с событием обработчика событий, ничего не происходит.
Module Module1
Sub Main()
Dim c1 As New Class1
' Associate an event handler with an event.
AddHandler c1.AnEvent, AddressOf EventHandler1
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler1
' Now associate a different event handler with the event.
AddHandler c1.AnEvent, AddressOf EventHandler2
' Call a method to raise the event.
c1.CauseTheEvent()
' Stop handling the event.
RemoveHandler c1.AnEvent, AddressOf EventHandler2
' This event will not be handled.
c1.CauseTheEvent()
End Sub
Sub EventHandler1()
' Handle the event.
MsgBox("EventHandler1 caught event.")
End Sub
Sub EventHandler2()
' Handle the event.
MsgBox("EventHandler2 caught event.")
End Sub
Public Class Class1
' Declare an event.
Public Event AnEvent()
Sub CauseTheEvent()
' Raise an event.
RaiseEvent AnEvent()
End Sub
End Class
End Module
Обработка событий, унаследованных из базового класса
Производные классы — это классы, которые наследуют характеристики из базового класса и могут обрабатывать события, инициированные их базовым классом, при помощи оператора Handles MyBase.
Обработка событий базового класса
Объявите обработчик событий в производном классе путем добавления оператора Handles MyBase.имя_события в строку объявления процедуры обработчика события, где имя_события является именем события в обрабатываемом базовом классе. Пример.
Public Class BaseClass Public Event BaseEvent(ByVal i As Integer) ' Place methods and properties here. End Class Public Class DerivedClass Inherits BaseClass Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent ' Place code to handle events from BaseClass here. End Sub End Class
Связанные разделы
Заголовок |
Описание |
---|---|
Пошаговое руководство. Объявление и создание событий (Visual Basic) |
Предоставляет пошаговое описание объявления и возникновения событий для класса. |
Описание процесса создания процедуры обработчика событий. |
|
Показано, как определить пользовательское событие, позволяющее его обработчикам событий вызываться асинхронно. |
|
Практическое руководство. Объявление пользовательских событий для экономии памяти (Visual Basic) |
Показано, как определить пользовательское событие, которое использует память только при обработке события. |
Устранение неполадок, связанных с унаследованными обработчиками событий, в Visual Basic |
Список общих вопросов, связанных с обработчиками событий в унаследованных компонентах. |
Содержит общие сведения о модели событий в .NET Framework. |
|
Описывает приемы работы с событиями, связанными с объектами Windows Forms. |
|
Содержит общие сведения о делегатах в Visual Basic. |