Skip to content

RaiseEvent

在类、窗体或文档中触发在模块级声明的事件。

语法:

RaiseEvent eventname [ ( argumentlist ) ]

eventname
要触发的事件名称。必须是在同一模块中声明的Event的名称。
argumentlist
可选 以逗号分隔的变量、数组或表达式列表,作为事件参数传递。argumentlist必须用括号括起。如果事件没有参数,则必须省略括号。

如果事件未在引发它的模块中声明,则产生错误。如果事件没有参数,在RaiseEvent调用中包含空括号会导致错误。

RaiseEvent不能触发未在模块中显式声明的事件。例如,即使窗体有内置的Click事件,RaiseEvent也不能触发它。在窗体模块中声明Click事件会遮蔽窗体自身的Click事件。

事件触发按连接建立的顺序进行。因为事件可以有ByRef参数,较晚连接的进程可能接收到已被先前事件处理程序更改的参数。

示例

以下代码片段在类模块的模块级声明一个事件,并从过程中引发它:

vb
' In a class module:
Public Event LogonCompleted(UserName As String)

Sub Demo()
    RaiseEvent LogonCompleted("AntoineJan")
End Sub

一个更完整的示例展示事件源/接收器的连接。引发事件的类是事件源,处理事件的类是接收器。一个事件源可以有多个接收器;当源引发事件时,每个接收器都会收到。

源类声明两个事件并从工作过程中引发它们:

vb
Class TimerState
    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, timeElapsedSoFar As Double
        startTime = Timer
        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
End Class

接收器通过使用WithEvents字段并提供名为<field>_<EventName>的处理程序过程来订阅:

vb
Class Form1
    Private WithEvents ts As TimerState

    Private Sub UserForm_Initialize()
        Set ts = New TimerState
    End Sub

    Private Sub Command1_Click()
        ts.TimerTask 9.58
    End Sub

    Private Sub ts_UpdateElapsedTime(ByVal elapsedTime As Double)
        Text2.Text = Format(elapsedTime, "0.00")
    End Sub

    Private Sub ts_DisplayFinalTime()
        Text1.Text = "Until Now"
        Text2.Text = "9.58"
    End Sub
End Class

另请参阅

twinBASIC及其LOGO版权为作者"韦恩"所有