关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
有时候,我们很多代码结构很类似,前后都一样,就中间不一样。然而不能直接提取重复的代码为1个公共函数直接调用,不得不写成很多重复代码。
如果用回调方式就能轻松解决问题。但在vb/vba中实现回调要通过一个API函数,十分不方便。
最近研究发现,可以利用Eval函数的特性(可以执行文本表达的代码),简单实现回调机制。
优点:容易理解和使用
缺点:
窗体的函数调用不到;
调用的函数必须是公共的;
传递参数不方便;
不支持sub过程。
附上我研究的几个模型,包括有无参数和返回值等。
1、无参数,无返回值
'说明:无参数传递,没返回值' '参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号' '示例:funcEvalEasy("funcTestEasy()")' Public Function funcEvalEasy(funcName As String) '其他代码过程' '...' '回调函数部分' MsgBox "开始执行函数" & funcName Eval funcName End Function Public Function funcTestEasy() MsgBox "我是测试函数,用于测试回调" End Function
该示例是通过funcEvalEasy函数调用其他函数,只需要传递一个函数名进去即可。
2、有参数,无返回值
方法1:在funcName,函数表达式中就直接写参数
'说明:有参数传递,没返回值' '参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号' '示例:funcEvalPara1("funcTestPara(1)")' '特点:较为灵活' Public Function funcEvalPara1(funcName As String) '其他代码过程' '...' '回调函数部分' MsgBox "开始执行函数" & funcName Eval funcName End Function
方法2:在执行回调的函数里面合并一个函数表达式
'示例:funcEvalPara2(1,"funcTestPara") 为了方便合成函数表达式,就不加括号' '特点:有什么参数,一目了然,就是不灵活' Public Function funcEvalPara2(i As Integer, funcName As String) '其他代码过程' '...' '回调函数部分' MsgBox "开始执行函数" & funcName Eval funcName & "(" & i & ")" End Function Public Function funcTestPara(i As Integer) MsgBox "我是测试函数,用于测试回调" & vbCrLf & "你传进来的数字是" & i End Function
方法3:利用公共变量传递参数(这个可以参考下面的示例,一样道理,这里就不赘述)
3、有返回值
方法1:利用公共变量
Public intEvalReturn As Integer '临时变量,用于保存返回值' '说明:有返回值' '参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号' '示例:funcEvalReturn("funcTestReturn(1)")' Public Function funcEvalReturn(funcName As String) As Integer '其他代码过程' '...' '回调函数部分' MsgBox "开始执行函数" & funcName Eval funcName '获取返回值' MsgBox "返回结果" & intEvalReturn '弹窗显示' funcEvalReturn = intEvalReturn '返回结果' End Function Public Function funcTestReturn(i As Integer) MsgBox "我是测试函数,用于测试回调" & vbCrLf & "你传进来的数字是" & i & vbCrLf & "将执行计算返回一个值" '计算' i = i + 1 '返回' intEvalReturn = i End Function
方法2:直接返回,因为eval是有返回值的函数,可以直接返回表达式的结果
其实方法1比较麻烦(主要是为了综合演示一下),用方法2比较好。
'说明:有返回值' '参数:funcName,函数表达式(字符串)。要调用的函数名,函数名后一定要加括号' '示例:funcEvalReturn("funcTestReturn(1)")' Public Function funcEvalReturn(funcName As String) As Integer '其他代码过程' '...' '回调函数部分' MsgBox "开始执行函数" & funcName Dim strReturn As String strReturn = Eval(funcName) '获取返回值' MsgBox "返回结果" & strReturn '弹窗显示' funcEvalReturn = strReturn '返回结果' End Function Public Function funcTestReturn(i As Integer) MsgBox "我是测试函数,用于测试回调" & vbCrLf & "你传进来的数字是" & i & vbCrLf & "将执行计算返回一个值" '计算' i = i + 1 '返回' intEvalReturn = i End Function
这样,我们就可以用利用Eval函数实现回调机制了。