1.第一步:使用Event语句声明事件 看一下类模块中现在的代码: Option Explicit Public Event Change(ByRef Cancel As Boolean) Private s$ Public Property Get Value() As String Value = s End Property Public Property Let Value(ByVal c As String) s = c End Property Private Sub Class_Initialize() s = "abc" ‘初始值 End Sub 和前面的代码比较,多出了一句: Public Event Change(ByRef Cancel As Boolean) 这就是Event语句,只此一句,我们已经为我们的类声明(我想使用“注册”一词是不是更妥切)了一个事件Change。在看Event语句产生的效果前,先来看它的特性: (1)为了声明事件,Event总是Public的,这好理解吧。 (2)事件可以不带参数,如Public Event Change(),也可以带参数,如我们上面给出的,但参数不能是命名参数,可选参数或数组参数。这里我只解释一下命名参数的含义。我们知道,事件可以因特定的用户事件而触发,也可以在代码中象方法一样指定执行,如下面的CommandButton1_Click: Private Sub CommandButton2_Click() CommandButton1_Click End Sub 但在调用对象的方法时我们通常喜欢这样的方式: Selection.Sort Key1:=Range("A2"), Order1:=xlAscending 这里Key1、Order1就是命名参数,命名参数的好处是我们不必记住它们的次序,调用时直接以名称和冒号后加等于号指定它的值,但对事件的调用却不允许这样。 (3)事件没有返回值。 现在我们看一下,Event为我们做了什么。 建立一窗体UserForm1,添加一个TextBox控件(名称为TextBox1),两个CommandButton控件(名称为CommandButton1和CommandButton2),CommandButton1的Caption设置为“赋值”,CommandButton2的Caption设置为“读值”,窗体的代码如下: Option Explicit Dim WithEvents mc As MyClass Private Sub CommandButton1_Click() mc.Value = TextBox1 '赋值 End Sub Private Sub CommandButton2_Click() MsgBox "mc当前的值为" & mc.Value '读值 End Sub Private Sub UserForm_Initialize() Set mc = New MyClass End Sub 上面这段代码实现的是,当点击CommandButton1时便会将TextBox1的值赋给mc的Value,当点击CommandButton2时便会显示mc当前的Value值。 来运行一下这个窗体,先点击CommandButton2,此时显示“abc”,是mc的初始值,然后在TextBox1输入“123”,点击CommandButton1,再点击CommandButton2,显示“123”,说明赋值成功了。 呵呵,忘了,我们要做什么了!现在,请从UserForm1代码窗口的“通用”框中选择mc,哇!我们声明的事件在右边“声明”框中已经出现了! 我们定义这个事件是希望当mc的值改变时响应的,现在就迫不及待地给它写一句代码吧: Private Sub mc_Change(ByRef Cancel As Boolean) If MsgBox("要改变mc的值吗?", vbYesNo) = vbNo Then Cancel = True End Sub 上面这句代码你不会陌生吧,希望当用户选择了在改变时给用户一个确认的机会。 但是,现在点击CommandButton1,却不会给你选择的机会,我们还有一步没有做。
[此贴子已经被作者于2007-3-27 23:28:08编辑过] |