VB语句详解——Event语句
2008-06-13 22:24:14.0

作者:杜勇

描述:定义用户自定义的事件。
一、语法:
[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秒之后,第二个标签则加一。如果再次单击命令按钮后,则停止计时。这个示例只是为了说明语句,在实际运行时将占用大量的时钟周期。


文章评论
[以下网友留言只代表其个人观点,不代表中华网的观点或立场]
发表评论
昵 称:
主 页:
内 容:
表 情: