|
- '什么是回调函数?回调函数就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就
- '是你的这个回调函数名。回调函数与普通的函数没有什么区别,其之所以称之为回调函数,是因为这个函数
- '作为另外一个函数的参数,比如有以下两个函数 CallFun是回调函数, MainFun是调用回调函数的函数
- 'Private Sub CallFun(i as Integer)
- '
- 'End Sub
- 'Private Sub MainFun(CallFun, i As Integer)
- ' CallFun i
- 'End Sub
- '不幸的是VBA中不能将函数作为参数,利用上面的代码是不可行的。下面我将介绍可行的办法。
- '首先让我们理解一下 Implements 语句
- '语法 Implements [InterfaceName | Class]
- '所需的 InterfaceName 或 Class 是类型库中的接口或类的名称,该类型库中的方法将用与 Visual Basic 类中相一致的方法来实现。
- '说明:
- '所谓接口就是代表接口封装的成员(方法以及属性)的原型集合;也就是说,它只包含成员过程的声明部分。一个类提供一个或多
- '个接口的所有方法以及属性的一种实现方案。类的控制者每次调用函数时,该函数所执行的代码由类来提供。每个类至少应实现一
- '个缺省接口。在 Visual Basic 中,一个已实现的接口中任何没有显式声明的成员都是缺省接口的隐式成员。
- '当 Visual Basic 类实现接口时,都会提供该接口的类型库中说明的所有 Public 过程的版本。除了提供接口原型与自编过程之间的
- '映射关系之外,Implements 语句还使这个类接收对指定接口 ID 的 COM QueryInterface 调用。
- '看了说明是不是还是一头雾水,好的,下面让笔者用实际的例子演示一下相信各位看官就会明白的了。
- '1.首先我们新建一个标准工程,然后在这个标准工作添加 类模块,然后把类模块的名字改为 InterFace ,意为 接口类, 根据接口定义
- '我们在这个类模块中添加函数原形(所谓接口就是代表接口封装的成员(方法以及属性)的原型集合),即是说接口只是声明一了个原形,
- '而不必有实现,可谓原形,比如一个函数原形如下:
- 'Private Sub CallFun(i as Integer)
- '
- 'End Sub
- '所谓实现如下:
- 'Private Sub CallFun(i as Integer)
- ' msgbox i
- 'End Sub
- 'InterFace 类模块的代码如下:
- 'Public Sub CallFun(i as Integer)
- '
- 'End Sub
- '接着我们添加一个实现这个接口的类,首先添加一个类模块,把名字改为Func1
- '添加以下代码:
- 'Implements InterFace
- '这一句的意思即是说这个类是要实现InterFace接口的
- '然后点击Implements InterFace上面的列表框,是不是看到了一个InterFace的项(如图1所示),我们选择这个项看看会有什么效果
- '是不是自动添加了如下代码
- 'Private Sub InterFace_CallFun(i As Integer)
- '
- 'End Sub
- '然后我们可以在这个InterFace_CallFun函数中写我们想写的实现代码,我就写一句 msgbox i 代码吧,如下所示
- 'Implements InterFace
- 'Private Sub InterFace_CallFun(i As Integer)
- ' MsgBox i
- 'End Sub
- '然后我们在Sheet1的代码区中实现MainFun函数,如下
- Private Sub MainFun(Fun As InterFace, i As Integer)
- Debug.Print "随便写的代码"
- Debug.Print "随便写的代码"
- Debug.Print "随便写的代码"
- Fun.CallFun i
- Debug.Print "随便写的代码"
- End Sub
- '接着在Sheet1的Worksheet_BeforeDoubleClick事件中调用MainFun函数,如下代码所示
- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
- MainFun New Func1, 10
- '好的,如果我们想把i的值等于99时再Msgbox出来如何是好呢?是不是得回去修改Func1类的,这当然不,而是继续添加另外一个类
- '模块,把名字改为Func2, 添加以下代码
- 'Implements InterFace
- 'Private Sub InterFace_CallFun(i As Integer)
- ' If i = 99 Then
- ' MsgBox i
- ' End If
- 'End Sub
- '好的,我们现在调用一下看看
- MainFun New Func2, 88 '这句没有满足条件没有显示结果
- MainFun New Func2, 99 '这句满足了条件从而显示了结果
- End Sub
- '本教程是一个简单的例程,如果各位看官有不明白之处请提问,本文有谬误之处亦请指出,谢谢!
复制代码
演示工程:
CallBack.rar
(11.67 KB, 下载次数: 476)
|
评分
-
3
查看全部评分
-
|