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