作者:杜勇
描述:定义用户自定义的事件。
一、语法:
[Public]Event procedurename[(arglist)]
Event语句的语法包含下面部分:
|
部分 |
描述 |
| public | 可选的。指定该Event是全局的(公用的),在整个工程中都是可见的。缺省情况下Events类型是Public。应注意,事件只能在所声明的模块中产生。 |
| procedurename | 必需的。事件的名称;遵循标准的变量命名约定。 |
arglist参数的语法及语法的各个部分如下:
[ByVal|ByRef]varname[()][As type]
|
部分 |
描述 |
| byVal | 可选的。表示该参数是按值传递的。 |
| byRef | 可选的,为缺省值。表示该参数是按地址传递的。 |
| varname | 必需的。代表要传递给过程的参数变量的名称;遵循标准的变量命名约定。 |
| type | 可选的。指传递给过程的参数的数据类型,可以是VB变量的各种类型、用户定义类型或对象类型,不支持定长的String。 |
二、说明:
这是一个高级话题,因为它涉及到了类模块的概念,而且由类模块产生事件,如果你不熟悉类的概念,就不要理它,因为这种情况不多见。
事件被声明之后,必须使用RaiseEvent语句才能激活该事件。
注意:
可以象声明过程的参数一样来声明事件的参数,但有以下不同:事件不能有带命名参数、Optional参数、或者ParamArray参数。事件没有返回值。
三、应用举例:
下面的示例是用事件来计算时间。建立一标准工程,在窗体(Form1)上添加一个命令按钮(Command1),两个标签(Label1)和(Label2)。第一个标签显示秒,第二个标签显示分。将下面的程序粘贴过去。
Option Explicit
Dim WithEvents TMR As TimerState '声明事件
Private Sub Command1_Click()
If Command1.Caption = "启动" Then
Command1.Caption = "停止"
TMR.StartCounting
Else
Command1.Caption = "启动"
TMR.StopCounting
End If
End Sub
Private Sub Form_Load()
Set TMR = New TimerState
Command1.Caption = "启动"
Label2.Caption = 0
Label1.Caption = 0
End Sub
Private Sub TMR_Sec(ByVal TimJump As Double)
Label1.Caption = Str(Format(TimJump, "0"))
DoEvents
End Sub
Private Sub TMR_Minute()
Label1.Caption = 0
Label2.Caption = Val(Label2.Caption) + 1
TMR.TimerTask (60)
End Sub
建立一个类模块,改名为TimerState,将下面的程序粘贴过去。
Option Explicit
Dim Counting As Boolean
Event Sec(ByVal dblJump As Double)
Event Minute()
Public Sub StartCounting()
Counting = True
TimerTask (60)
End Sub
Public Sub StopCounting()
Counting = False
TimerTask (0)
End Sub
Public Sub TimerTask(ByVal Duration As Double)
Dim TimStart As Double
Dim TimSecond As Double
Dim TimSoFar As Double
If Not Counting Then Exit Sub
TimStart = Timer
TimSoFar = TimStart
Do While Timer < TimStart + Duration
If Not Counting Then Exit Sub
If Timer - TimSoFar >= 1 Then
TimSoFar = TimSoFar + 1
RaiseEvent Sec(Timer - TimStart) '激活事件
End If
Loop
RaiseEvent Minute
End Sub
单击命令按钮后,第一个标签开始计时。每经过60秒之后,第二个标签则加一。如果再次单击命令按钮后,则停止计时。这个示例只是为了说明语句,在实际运行时将占用大量的时钟周期。