高手请进:函数间传递ParamArray参数数组的问题
我写的一个小程序中需要在函数间传递用ParamArray指定的参数数组,而且被调用的函数也使用ParamArray来指定参数,但现在被两个问题难住了,希望各位高手能够指点迷津。
示例代码在下面。
- VB code
Private Function MyFunc(ParamArray a()) If a()为空 Then '<--这里应该怎么写? MyFunc = SubFunc1() Else '不为空 If a()包含结构体 Then '<--这里应该怎么写? MyFunc = SubFunc2(a) '<--怎么写才能将包含结构体的数组正确传递到被调用的函数? Else MyFunc = SubFunc3(a) End If End IfEnd FunctionPrivate Function SubFunc1() '代码略End FunctionPrivate Function SubFunc2(ParamArray SomeParam()) '代码略End FunctionPrivate Function SubFunc3(ParamArray SomeParam()) '代码略End Function
1. 参数数组为空,也就是不指定参数的情况下:
(1) 如果能够在数组为空的时候将空数组传递给被调用的函数,是最理想的(直接传递参数到SubFunc2)。但如果不能,则——
(2) 我想用判断数组是否为空的方法来分别调用SubFunc1和SubFunc2。此时,如何判断数组是否为空?
2. 参数中可能包含结构体,如何能够将包含结构体的参数数组准确传递给被调用的函数?
第一次提问,分不是很多,希望大家多多帮助,谢谢!
[解决办法]
判断的方法:
1.可以判断参数的个数
2.判断参数名称所在位置的类型
判断出来以后,分别执行对应的函数
不过我的意见在做实际做的时候,不用这么写,要我的话:
1. Call MyFunc()
2. Call MyFunc(i, l, s)
3. Call MyFunc(l, s, varTest,i)
改为:
SubFunc1
SubFunc2 i,l,s
SubFunc3 l, s, varTest,i
[解决办法]
我来说一说呵呵呵。
1、ParamArray中,不支持结构型参数传递。
2、ParamArray参数,是一定会被初始化的。如果外部没有传参数,那么Ubound为-1.一般用Ubound +1可以获得外界传递的参数个数。
3、Paramarray参数,不能作为参数传递给另一个函数。
有关如何传递ParamArray,可以参考VBCorlib代码中有关Helper.Swap的用法。很有借鉴意义。
[解决办法]
结构,不支持后期绑定的。所以不能给ParamArray赋值。ParamArray的实质就是Variant型数组。并且VB运行时在传出前做了锁定。
[解决办法]
同一个方法执行不同的代码嘛,多态
- VB code
'------------------------------------Form1代码-------------------------'全都调用Execute方法来执行不同的操作Public Sub Execute(obj As IExecute) obj.ExecuteEnd Sub'也可以这样写,就可以不用iExecute.cls了,也不用Implements 它了'Public Sub Execute(obj As object)' obj.IExecute_Execute'End SubPrivate Sub 执行方法1_Click() Execute New cExecuteAEnd SubPrivate Sub 执行方法2_Click() Dim x As New cExecuteB x.ParamA = 10 Execute xEnd SubPrivate Sub 执行方法3_Click() Dim x As New cExecuteC x.x = 100 x.y = 100 Execute xEnd Sub'-----------------------------Moudle.bas代码 定义一个结构----------------Public Type Point x As Long y As LongEnd Type'--------------------------------------cExecuteA.cls代码-------------------------Implements IExecute'这个类执行不需要参数Public Sub IExecute_execute() MsgBox "这个类执行不需要参数"End Sub'cExecuteB代码Implements IExecutePublic ParamA As Long'这个类执行需要一个参数Public Sub IExecute_execute() MsgBox "这个类执行需要一个参数" & ParamAEnd Sub'----------------------------cExecuteC.cls代码------------------------Implements IExecutePrivate typeA As Point Public Property Let x(value As Long) typeA.x = valueEnd PropertyPublic Property Let y(value As Long) typeA.y = valueEnd Property'这个类执行需要一个结构Public Sub IExecute_execute() MsgBox "这个类执行需要一个结构" & "x=" & typeA.x & ",y=" & typeA.yEnd Sub'----------------------------------------IExecute.cls代码-------------------------Public Sub Execute()End Sub