Ich denke, ich habe eine ziemlich gute Idee, was der Unterschied zwischen ByVal
und ByRef
in VB ist, aber mein Problem ist, wenn ich es in Verbindung mit einem Mitglied verwenden, das mit WithEvents
deklariert ist.Warum funktioniert ByRef nicht in Verbindung mit WithEvents?
Ich habe die folgende Methode:
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
Wenn ich ein Klassenmitglied erklärt haben als solche:
Private WithEvents Connection As ADODB.Connection
Ich möchte dann die Verbindung schließen und es dann rufen als solche:
SafeCloseAndDeRefConnection Connection
Aber nach dem Anruf SafeCloseAndDeRefConnection
die Connection
Variable ist nicht eingestellt auf Nothing
und hat immer noch seine ursprüngliche Referenz.
Wenn ich das WithEvents
Schlüsselwort um den Anruf zu SafeCloseAndDeRefConnection
Werken zu entfernen, wie erwartet (aber natürlich können Ereignisse dann nicht behandelt werden)
Kann jemand mir erklären, warum dies geschieht?
P.S. Ich habe eine ähnliche question elsewhere gefunden, aber die Problemumgehung funktioniert nicht in meinem Szenario.
Ein 'WithEvents' -Objekt kann nicht' ByRef' übergeben werden und wenn Sie es versuchen, wird eine "Kopie" übergeben, so als ob Sie es 'ByVal' deklariert hätten. Es muss auf diese Weise so gehandhabt werden, dass das Verbinden und Trennen der ausgehenden Ereignisschnittstelle des tatsächlichen Objekts und des Senke-Objekts des Clients verwaltet wird. – Bob77
Versuchen Sie, eine "fließende" Funktion zu implementieren, die Sie dann wie folgt verwenden können: Set Connection = SafeCloseAndDeRefConnection (Verbindung) ' – wqw
@ Bob77 Vielen Dank für Ihre Antwort. Es macht ein bisschen Sinn (so viel wie VB sinnvoll sein kann). Haben Sie vielleicht einen Hinweis, wo dies näher erläutert wird? VB6 ist eine "Pre-Web 2.0" -Sprache, daher ist die Hilfe etwas verstreut und nicht so einfach im Internet zu finden. –