VB6.0 Event & WithEvent事件处理
Event 语句
定义用户自定义的事件。
语法
[Public] Event procedurename [(arglist)]
Event 语句包含下面部分:
部分 描述
Public 可选的。指定该 Event 在整个工程中都是可见的。缺省情况下 Events 类型是 Public。应注意,事件只能在所声明的模块中产生。
procedurename 必需的。事件的名称;遵循标准的变量命名约定。
arglist 参数的语法及语法的各个部分如下:
[ByVal | ByRef] varname[( )] [As type]
部分 描述
ByVal 可选的。表示该参数是按值传递的。
ByRef 可选的。表示该参数是按地址传递的。ByRef 是 Visual Basic 的缺省设置。
varname 必需的。代表要传递给过程的参数变量的名称;遵循标准的变量命名约定。
type 可选的。指传递给过程的参数的数据类型;可以是 Byte、布尔、Integer、Long、Currency、Single、Double、Decimal(目前尚不支持)、Date、String(只支持变长)、Object、Variant、用户定义类型或对象类型。
说明
事件被声明之后,就可以使用 RaiseEvent 语句来产生该事件。如果在标准模块中出现 Event 声明,就会产生语法错误。不能声明带返回值的事件。在下面的代码段中,给出了声明事件和产生事件的典型事件:
'在类模块的模块级中声明一个事件
Event LogonCompleted (UserName as String)
Sub
RaiseEvent LogonCompleted("AntoineJan")
End Sub
注意 可以象声明过程的参数一样来声明事件的参数,但有以下不同:事件不能有带命名参数、Optional 参数、或者 ParamArray 参数。事件没有返回值。
Event 语句示例
下面的示例是在百米赛跑演示中使用事件来计时。代码说明了所有与事件相关的方法、属性和语句,包括 Event 语句。
产生事件的类是事件源,实现该事件的类则是事件吸收。一个事件源可以有多个针对其所产生的事件的漏。事件可以被每个选定出为对象的实例吸收事件的类所触发。
该示例使用了一个窗体 (Form1),该窗体有一个按钮 (Command1),一个标签 (Label1),以及两个文本框 (Text1 和 Text2)。单击按钮后,第一个文本框显示 "From Now",第二个文本框中时钟开始计时。当经过 9.84 秒(百米记录)之后,第一个文本框显示 "Until Now",第二个则显示 "9.84"。
Form1 代码用于指定该窗体的初始状态和终止状态,也包含了事件产生后所要执行的代码。
Option Explicit
Private WithEvents mText As TimerState
Private Sub Command1_Click()
Text1.Text = "From Now"
Text1.Refresh
Text2.Text = "0"
Text2.Refresh
Call mText.TimerTask(9.84)
End Sub
Private Sub Form_Load()
Command1.Caption = "Click to Start Timer"
Text1.Text = ""
Text2.Text = ""
Label1.Caption = "The fastest 100 meter run took this long:"
Set mText = New TimerState
End Sub
Private Sub mText_ChangeText()
Text1.Text = "Until Now"
Text2.Text = "9.84"
End Sub
Private Sub mText_UpdateTime(ByVal dblJump As Double)
Text2.Text = Str(Format(dblJump, "0"))
DoEvents
End Sub
下面是 TimerState 类模块的代码。事件产生后 Event 语句声明被初始化的过程。
Option Explicit
Public Event UpdateTime(ByVal dblJump As Double)
Public Event ChangeText()
Public Sub TimerTask(ByVal Duration As Double)
Dim dblStart As Double
Dim dblSecond As Double
Dim dblSoFar As Double
dblStart = Timer
dblSoFar = dblStart
Do While Timer < dblStart + Duration
If Timer - dblSoFar >= 1 Then
dblSoFar = dblSoFar + 1
RaiseEvent UpdateTime(Timer - dblStart)
End If
Loop
RaiseEvent ChangeText
End Sub
//***************************************************************************************************
'例子:
'在类定义模块当中
Option Explicit
Public Event OnChanged()
Public Sub Refresh()
RaiseEvent OnChanged
End Sub
'以下在窗体中
Option Explicit
Private WithEvents eMyObject As Class1
Private Sub Command1_Click()
eMyObject.Refresh
End Sub
Private Sub eMyObject_OnChanged()
MsgBox "你的事件被触发了,哈哈!"
End Sub
Private Sub Form_Load()
Set eMyObject = New Class1

浙公网安备 33010602011771号