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.
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
Provare ad implementare una funzione "fluente" che è possibile utilizzare in questo modo "Imposta connessione = SafeCloseAndDeRefConnection (Connessione)" – wqw
@ 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. –