说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

判断函数调用者是否传递optional参数的方法

编辑:说三道四文库 发布时间:2018-07-23 03:55
HTML文档下载 WORD文档下载 PDF文档下载
我现在写一个公共函数,里面有一些可选参数(optional) ,我现在如何知道调用者有没有传值过来.比如:

Public Function GetSomeData(Optional Byref rsItem as ADODB.Recordset ) As Boolean
…………
…………
End Function

这个函数,我想判断一下,调用者是否传递了RS过来,以便做不同的动作。

请各位大侠帮忙了。
If rsItem Is Nothing Then
    MsgBox "nothing"
Else
    MsgBox "yes"
End If
谢谢,我试过了,如果对方用这种方法调用的话,还是不行

Dim rsItem as New ADODB.Recordset

这种声明传入参数时,tsItem就不是Nothing

只有这种定义,楼上的方法才能适用
Dim rsItem as ADODB.Recordset  (没有New)

其实这样也可以,就是对调用者多了一份限制,有时会带来麻烦。
这样呢?
Dim rsItem as ADODB.Recordset  
set rsItem =new ADODB.Recordset
实在对不起,我上面的说反了,实际情况是这样的

'假定判断是否传入的方法如下
If rsItem Is Nothing Then
    MsgBox "no"
Else
    MsgBox "yes"
End If

如果按下面二种方式方法,
1)Dim rsItem as New ADODB.Recordset

2) Dim rsItem as ADODB.Recordset  
set rsItem =new ADODB.Recordset

都会提示Yes

但如果按
Dim rsItem as ADODB.Recordset  (没有New)
提示就会变成no了,虽然我已经把这个参数传过去了.
那就再判断记录集是否有记录
如果我的RS没有OPEN 打开的话,那么就不能判断是否有记录集的,否则会出错的.
//Dim rsItem as ADODB.Recordset  (没有New)
//提示就会变成no了,虽然我已经把这个参数传过去了.
如果是这样就在你的函数体里
set rsitem = new ADODB.Recordset
并判断是否成功,如果没有成功,返回调用一个值  

Public Function GetSomeData(Optional Byref rsItem as ADODB.Recordset ) As Boolean


If rsItem Is Nothing Then set rsitem = new ADODB.Recordset
    


…………
…………
End Function
用isMissing()
1)isMissing()只能对Veriant 变量才有效,其他类型都会返回TRUE的。

2)在函数体内重新初始化并不解决我的问题,我只是想知道是否传入了参数。
关注

byref 传递一个对象,还真不知道怎么判断!
Public Function GetSomeData(Optional Byref rsItem as ADODB.Recordset=nothing )
建议使用楼上“flyingscv(zlj)”的方法为可选参数指定一个默认值。无论这个参数是什么类型,都可以使你的代码更简洁有效。
你把rsItem名字换成一个特别的,你前面没有定义过的不就得了吗??如RS
再把要传递的记录集给他,当然也可不传。

If rs Is Nothing Then
    MsgBox "no"
Else
    MsgBox "yes"
End If
为什么一定要和前面定义过的记录集一样的名字。
名字相同其实只是举个例子,实际使用是完全不一样的。

反过来,就算是相同的变量名,作用域也不相同,不会有问题的。

但不管是形参与变量名名称相同还是不相同,在变量未初始化的情况下,没有办法判断参数是否传入。
我说个想法好不好??
能不能根据产生的错误号来进行判定
根据产生的错误也可以,感觉不象正统解决之道。
Public Function GetSomeData(Optional ByRef rsItem) As Boolean
    If IsMissing(rsItem) Then
        MsgBox "no"
    Else
        MsgBox "yes"
    End If
End Function
Public Function GetSomeData(Optional ByRef rsItem) As Boolean
    Dim rsItemUse As ADODB.Recordset
    If IsMissing(rsItem) Then
        MsgBox "no"
    Else
        MsgBox "yes"
        Set rsItemUse = rsItem
        If rsItemUse Is Nothing Then
            MsgBox "nothing"
        Else
            MsgBox "yes"
        End If
    End If

End Function
还是不行,在客户端使用
Dim rs As ADODB.Recordset
时,传入RS参数,还是没有正确判断出已经传入了。

谢谢大家了,还有其他的方法吗?
Private Sub Form_Load()
aa
End Sub
Sub aa(Optional b As Integer = 1)
If b = 1 Then
Beep
End If
End Sub
Dim r As New Recordset
Private Sub Form_Load()
aa
End Sub
Sub aa(Optional b As Recordset = Nothing)
If b Is Nothing Then
Beep
End If
End Sub
还是不行,如果传入的是一个对象,而不是有关内置类型变量的话,还是没有办法判断。
Public Function GetSomeData(Optional Byref rsItem as ADODB.Recordset=nothing ) As Boolean
回复人: wfhlxl() ( ) 信誉:100  2004-12-10 10:02:00  得分: 0  
 
 
   Dim r As New Recordset
Private Sub Form_Load()
aa
End Sub
Sub aa(Optional b As Recordset = Nothing)
If b Is Nothing Then
Beep
End If
End Sub
this can do
  
 
有个专门的ismissing()函数来判断缺省参数有没有传的
//还是不行,在客户端使用
//Dim rs As ADODB.Recordset/
//时,传入RS参数,还是没有正确判断出已经传入了。

自己测试了一下 是可以的,注意是“Optional ByRef rsItem” 也就是把他做为Variant


Public Function GetSomeData(Optional ByRef rsItem as Variant ) As Boolean
    Dim rsItemUse As ADODB.Recordset
    If IsMissing(rsItem) Then
        MsgBox "no"
    Else
        MsgBox "yes"
        Set rsItemUse = rsItem
        If rsItemUse Is Nothing Then
            MsgBox "nothing"
        Else
            MsgBox "yes"
        End If
    End If

End Function

function f(optional a as recordset)
on error resume next 
dim b
b=a.fields(1).value
if err.number<>0 then
not pass the param
1. 给函数写注释,对如何传递参数做说明
2. 发现非法参数向函数外抛出错误
结贴
可以給參數一個特殊的默認值,然後在Function裡判斷是否等於默認值得,如果是的話,就沒有傳入參數。。反之則有。。
Public Function GetSomeData(Optional ByRef rsItem ="[DefaultRecordset]") As Boolean
dim rs as Recordset

if rsItem="[DefaultRecordset]" then
    msgbox "無傳入參數"
else
    set rs=rsItem
endif
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘