2013-07-04 5 views
5

Penso di avere una buona idea quale sia la differenza tra ByVal e ByRef in VB, ma il mio problema è quando provo ad usarlo in congiunzione con un membro che è dichiarato con WithEvents.Perché ByRef non funziona insieme a WithEvents?

Ho il seguente metodo:

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 

Se ho un membro di classe dichiarata come tale:

Private WithEvents Connection As ADODB.Connection 

Allora voglio chiudere la connessione e quindi chiamare come tale:

SafeCloseAndDeRefConnection Connection 

Ma dopo la chiamata a SafeCloseAndDeRefConnection la variabile Connection è non impostato su Nothing e ha ancora il suo riferimento originale.

Se rimuovo la parola WithEvents la chiamata a SafeCloseAndDeRefConnection funziona come previsto (ma ovviamente gli eventi non possono quindi essere gestiti)

qualcuno può spiegare a me perché questo sta accadendo?

P.S. Ho trovato un simile question elsewhere, ma la soluzione alternativa non funziona nel mio scenario.

+3

Un oggetto 'WithEvents' non può essere passato' ByRef' e se lo si tenta, una "copia" viene passata come se fosse stata dichiarata 'ByVal'. In un certo senso deve essere in questo modo gestire la connessione e la disconnessione dell'interfaccia dell'evento in uscita dell'oggetto reale e dell'oggetto sink del client. – Bob77

+1

Provare ad implementare una funzione "fluente" che è possibile utilizzare in questo modo "Imposta connessione = SafeCloseAndDeRefConnection (Connessione)" – wqw

+0

@ Bob77 Grazie per la risposta. Ha un po 'senso (tanto quanto VB può avere senso). Hai forse un riferimento dove questo è spiegato in modo più dettagliato? VB6 è un linguaggio "pre-Web 2.0", quindi l'aiuto con questo è un po 'sparpagliato e non così facilmente reperibile sul web. –

risposta

0

Forse chiamano:

Set Connection = Nothing 

Dopo SafeCloseAndDeRefConnection(Connection)

Questo costringerà la distruzione dell'oggetto e non fare affidamento su VB6 a farlo per voi!

+2

Tipo di sconfitte lo scopo perché il metodo esiste in primo luogo. –