Оператор RaiseEvent
Запускает событие, объявленное на уровне модуля в классе, форме или документе.
Синтаксис
Имя события RaiseEvent [ ( argumentlist ) ]
Обязательный элемент eventname — название события, объявленного в модуле, соответствующее правилам именования переменных в Basic.
Синтаксис оператора RaiseEvent состоит из таких частей:
Part | Описание |
---|---|
eventname | Обязательно. Название вызываемого события. |
список аргументов | Необязательный параметр. Список переменных, массивов или выражений с разделителями-запятыми. Список аргументов должен быть заключен в круглые скобки. Если аргументы отсутствуют, скобки должны быть опущены. |
Замечания
Если событие не было объявлено в модуле, в котором оно вызывается, возникает ошибка. В следующем примере показано объявление переменной и процедура, в которой вызывается событие.
' Declare an event at module level of a class module
Event LogonCompleted (UserName as String)
Sub Demo()
' Raise the event.
RaiseEvent LogonCompleted ("AntoineJan")
End Sub
Если у события нет аргументов, включая пустые скобки в вызове RaiseEvent события, возникает ошибка. RaiseEvent невозможно использовать для вызова событий, которые не были явно объявлены в модуле.
Например, если в форме есть событие Click , ее событие Click можно запустить с помощью RaiseEvent. Если объявить событие Click в модуле формы, оно затеняет собственное событие Click формы. По-прежнему можно вызвать событие Click формы, используя обычный синтаксис для вызова события, но не с помощью инструкции RaiseEvent .
Вызов события осуществляется в порядке установления связей. Так как события могут иметь параметры ByRef , процесс, который подключается поздно, может получать параметры, которые были изменены более ранним обработчиком событий.
Пример
В следующем примере события используются для отсчета секунд во время демонстрации самой быстрой гонки на 100 метров. Код показывает все методы, свойства и операторы, связанные с событиями, в том числе оператор RaiseEvent.
Класс, породивший событие, является источником этого события, а классы, реализовавшие событие, являются приемниками. У источника события может быть несколько приемников для созданных им событий. Когда класс порождает событие, это событие запускается в каждом классе, выбранном для приема событий для этого экземпляра объекта.
В примере также используется форма (Form1
) с кнопкой (Command1
), меткой (Label1
) и двумя текстовыми полями (Text1
и Text2
). При нажатии кнопки в первом текстовом поле отображается значение От сейчас , а второе начинает отсчитывать секунды. По истечении полного времени (9,58 секунды) в первом текстовом поле отображается значение "До сих пор ", а во втором — 9,58.
Код задает начальное и конечное состояния формы. Он также содержит код, выполняемый при порождении события.
Option Explicit
Private WithEvents ts As TimerState
Private Const FinalTime As Double = 9.58
Private Sub UserForm_Initialize()
Command1.Caption = "Click to start timer"
Text1.Text = vbNullString
Text2.Text = vbNullString
Label1.Caption = "The fastest 100 meters ever run took this long:"
Set ts = New TimerState
End Sub
Private Sub Command1_Click()
Text1.Text = "From Now"
Text2.Text = "0"
ts.TimerTask FinalTime
End Sub
Private Sub ts_UpdateElapsedTime(ByVal elapsedTime As Double)
Text2.Text = CStr(Format(elapsedTime, "0.00"))
End Sub
Private Sub ts_DisplayFinalTime()
Text1.Text = "Until now"
Text2.Text = CStr(FinalTime)
End Sub
Остальной код содержится в модуле класса, названном TimerState. Помимо команд в код включены операторы Raise Event.
Option Explicit
Public Event UpdateElapsedTime(ByVal elapsedTime As Double)
Public Event DisplayFinalTime()
Private Const delta As Double = 0.01
Public Sub TimerTask(ByVal duration As Double)
Dim startTime As Double
startTime = Timer
Dim timeElapsedSoFar As Double
timeElapsedSoFar = startTime
Do While Timer < startTime + duration
If Timer - timeElapsedSoFar >= delta Then
timeElapsedSoFar = timeElapsedSoFar + delta
RaiseEvent UpdateElapsedTime(Timer - startTime)
DoEvents
End If
Loop
RaiseEvent DisplayFinalTime
End Sub
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.