2013-07-04 14 views
5

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.

+3

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

+1

Versuchen Sie, eine "fließende" Funktion zu implementieren, die Sie dann wie folgt verwenden können: Set Connection = SafeCloseAndDeRefConnection (Verbindung) ' – wqw

+0

@ 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. –

Antwort

0

Vielleicht nennen:

Set Connection = Nothing 

Nach SafeCloseAndDeRefConnection(Connection)

Diese Zerstörung des Objekts zwingen wird, und verlassen sich nicht auf VB6 es für Sie zu tun!

+2

Art von besiegt den Zweck warum Die Methode existiert an erster Stelle. –