2013-07-04 31 views
5

我觉得我有一个相当不错的想法,VB中的ByValByRef有什么区别,但是我的问题是,当我尝试将它与一个用WithEvents声明的成员结合使用时。为什么ByRef不能与WithEvents一起使用?

我有以下方法:

Private Sub SafeCloseAndDeRefConnection(ByRef cnx As ADODB.Connection) 
On Error GoTo ErrH 
    If Not cnx Is Nothing Then 
     If (cnx.State And adStateConnecting) = adStateConnecting Then 
      cnx.Cancel 
     End If 

     If (cnx.State And adStateOpen) = adStateOpen Then 
      cnx.Close 
     End If 

     Set cnx = Nothing 
    End If 
Exit Sub 
ErrH: 
Set cnx = Nothing 
End Sub 

如果我有一类成员宣布为:

Private WithEvents Connection As ADODB.Connection 

那么我想关闭连接,然后调用它是这样:

SafeCloseAndDeRefConnection Connection 

但是在拨打SafeCloseAndDeRefConnection之后,Connection变量是不是设置为Nothing,仍然有其原始参考。

如果我删除WithEvents关键字调用SafeCloseAndDeRefConnection按预期工作(但显然事件可以再无法处理)

谁能向我解释为什么发生这种情况?

P.S.我找到了类似question elsewhere,但解决方法在我的方案中不起作用。

+3

'WithEvents'对象不能被传递给'ByRef',如果你尝试传递一个“copy”,就好像你声明了'ByVal'一样。它必须是这种方式来管理连接和断开实际对象的传出事件接口和客户端的接收器对象。 – Bob77

+1

尝试实现一个“流利”功能,然后您可以像这样使用'Set Connection = SafeCloseAndDeRefConnection(Connection)' – wqw

+0

@ Bob77感谢您的回复。它有点意义(和VB一样合理)。你可能有更详细的解释这个参考吗? VB6是一种“Web 2.0之前”的语言,因此对此的帮助有点分散,并不容易在网络上找到。 –

回答

0

也许拨打:

Set Connection = Nothing 

SafeCloseAndDeRefConnection(Connection)

这将强制对象的破坏,而不是依靠VB6做到这一点为您服务!

+2

该方法首先存在。 –

相关问题