关于函数参数中byval的问题

realmayer7903 2004-05-11 10:47:20
我写了一个函数
原型如下
abc(byval rs as adodb.recordset)

原打算递归使用解决问题
但是在实际使用中发现
当rs中的游标发生变化时,传递到递归展开的函数中的rs的副本的游标居然也发生了改变,而且如果中使rs副本的游标变化后,原rs的游标也发生了相应变化,这也就意味着所有的rs及其副本使用同一个游标,这样也失去了我使用byval传递参数的本意.
是不是byval在传递对象时失效呢?

不知道谁能给我解释解释?
...全文
179 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryuginka 2004-05-13
  • 打赏
  • 举报
回复
up
lilaclone 2004-05-12
  • 打赏
  • 举报
回复
byval为传值引用,你在函数内容不要直接使用传入的Recordset 对象,而是在函数体中另定义一个Recordset,将其赋值后使用
null1027 2004-05-12
  • 打赏
  • 举报
回复
学习ing
胖河马 2004-05-12
  • 打赏
  • 举报
回复
private sub abc(byref rs as adodb.recordset)
……
end sub

call abc(rs.clone)

这样你可以得到一个独立的游标,但是对记录集的改动还是会反映到原纪录集中
realmayer7903 2004-05-12
  • 打赏
  • 举报
回复
果然对象是需要new以后才能用的
realmayer7903 2004-05-12
  • 打赏
  • 举报
回复
引用次数是不是只在最后销毁对象的时候起作用呢
supergreenbean 2004-05-12
  • 打赏
  • 举报
回复
你来看看这样行不行
Private Sub Command1_Click()
Dim oRst As Recordset

dev.cmd
Set dg.DataSource = dev.rscmd

Set oRst = CloneRecordset(dev.rscmd)
Set DataGrid1.DataSource = oRst

With dev.rscmd
.MoveNext
Debug.Print .Fields(0)
End With

With oRst
.Move 2
Debug.Print .Fields(0)
End With

End Sub

Function CloneRecordset(oRst As Recordset) As Recordset
On Error GoTo ErrHandler
If oRst Is Nothing Then Exit Function

Dim oStream As Stream
Set oStream = New Stream

oRst.Save oStream

Set CloneRecordset = New Recordset

CloneRecordset.Open oStream

Set oStream = Nothing
Exit Function
ErrHandler:
Set CloneRecordset = Nothing
Set oStream = Nothing
End Function

flyingZFX 2004-05-12
  • 打赏
  • 举报
回复
那怎么做呀?
pigpag 2004-05-12
  • 打赏
  • 举报
回复
//对对象使用ByVal是没有用的,ByVal只是把对象引用次数加了个1

想要有ByVal的效果,一定要自己New一个新的实例,然后把属性都搬过去才行。注意,搬属性的时候不能Set,否则前功尽弃 :)
supergreenbean 2004-05-11
  • 打赏
  • 举报
回复
对对象使用ByVal是没有用的,ByVal只是把对象引用次数加了个1

743

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧