2013-07-04 88 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

該方法首先存在。 –

相關問題