2013-07-04 6 views
5

Myślę, że mam dość dobry pomysł, jaka jest różnica między ByVal i ByRef w VB, ale mój problem jest, gdy próbuję używać go w połączeniu z członkiem, który jest zadeklarowany z WithEvents.Dlaczego usługa ByRef nie działa w połączeniu z WithEvents?

Mam następujący sposób:

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 

Jeśli mam członkiem klasy zadeklarowane jako takie:

Private WithEvents Connection As ADODB.Connection 

Następnie chcę, aby zamknąć połączenie, a następnie wywołać go jako takie:

SafeCloseAndDeRefConnection Connection 

Ale po wywołaniu SafeCloseAndDeRefConnection zmienna Connection jest nie ustawiona na Nothing i nadal ma swoje oryginalne odniesienie.

Jeśli usunąć słowa kluczowego WithEvents wezwanie do SafeCloseAndDeRefConnection działa zgodnie z oczekiwaniami (ale oczywiście nie wtedy wydarzenia mogą być obsługiwane)

Czy ktoś może mi wyjaśnić, dlaczego tak się dzieje?

P.S. Znalazłem podobny question elsewhere, ale obejście to nie działa w moim scenariuszu.

+3

Obiekt 'WithEvents' nie może być przekazany' ByRef', a jeśli spróbujesz, to "kopia" jest przekazywana tak, jakbyś zadeklarował ją jako "ByVal". To musi być taki sposób zarządzania łączeniem i rozłączaniem interfejsu zdarzeń wychodzących rzeczywistego obiektu i obiektu sink klienta. – Bob77

+1

Spróbuj wprowadzić funkcję "płynną", którą możesz następnie użyć w następujący sposób: 'Set Connection = SafeCloseAndDeRefConnection (Connection) ' – wqw

+0

@ Bob77 Dziękuję za odpowiedź. Ma trochę sensu (tyle, ile VB może mieć sens). Czy może masz odniesienie, gdzie jest to wyjaśnione bardziej szczegółowo? VB6 jest językiem "pre-Web 2.0", więc pomoc w tym jest nieco rozproszona i nie tak łatwo znaleźć w sieci. –

Odpowiedz

0

Może zadzwonić:

Set Connection = Nothing 

Po SafeCloseAndDeRefConnection(Connection)

To zmusi zniszczenie obiektu, a nie polegać na VB6 zrobi to za Ciebie!

+2

Rodzaj pokonuje cel, dlaczego metoda istnieje w pierwszej kolejności. –

Powiązane problemy