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