In Visual Basic 6 basiert der Ereignismechanismus auf dem Schlüsselwort WithEvents. Damit kann eine Variable auf ein Objekt verweisen und Ereignisse dieses Objekts automatisch an das Formular oder die Klasse, in der der Ereignis-Handler definiert ist, weiterleiten. Der Name der Handlerroutine muss einem speziellen Muster folgen: <Objektname>_<Ereignisname>. Um einen Handler festzulegen, reicht es aus, eine Variable mit WithEvents zu deklarieren und die erforderlichen Prozeduren im Code zu implementieren.
Beispiel für die Deklaration und Nutzung von WithEvents in VB6:
Private WithEvents myButton As CommandButton Private Sub Form_Load() Set myButton = Me.Controls.Add("VB.CommandButton", "btn1") myButton.Caption = "Klick mich!" End Sub Private Sub myButton_Click() MsgBox "Der Knopf wurde gedrückt!" End Sub
In VB6 erfordert die Reihenfolge der Initialisierung besondere Aufmerksamkeit, sowie das manuelle Entfernen des Objekts (über Set myButton = Nothing), um Ressourcen korrekt freizugeben und das Hängenbleiben von Handlern zu verhindern.
Frage: "Was passiert, wenn versucht wird, das Ereignis eines Objekts zu verarbeiten, wenn die WithEvents-Variable = Nothing ist, und wie wirkt sich das auf das Programmverhalten aus?"
Antwort: Wenn die WithEvents-Variable auf kein Objekt verweist (d.h. gleich Nothing ist), kann das Ereignis dieses Objekts nicht generiert und an den Handler übermittelt werden. Der Aufruf des Handlers wird nicht stattfinden: Es wird kein Fehler auftreten, aber die erwartete Programmlogik wird nicht ausgeführt, was zu 'stillen' Bugs und komplizierter Fehlersuche führen kann.
Beispiel:
Private WithEvents myObj As SomeClass ' ... Set myObj = Nothing ' Danach wird myObj_Event nicht aufgerufen
Geschichte
In einem großen Bestellsystem hat der Entwickler dynamisch Formulare erstellt und sich über WithEvents auf Ereignisse angemeldet. Nach dem programmgesteuerten Zerstören der untergeordneten Formulare wurden die Variablen nicht auf Null gesetzt - die Ereignisse blieben im Speicher "hängen", was unerwartete Nebenwirkungen verursachte und zu Speicherlecks führte. Zur Behebung musste die manuelle Abmeldung und das korrekte Freigeben von Handlern implementiert werden.
Geschichte
In einem der Module der Produktionsautomatisierung ging das Ereignis eines Objekts "verloren" - der Handler wurde nicht ausgelöst. Es stellte sich heraus, dass der WithEvents-Variablen noch vor dem Eintreten des Ereignisses Nothing zugewiesen wurde. Wir haben das behoben, indem wir den Lebenszyklus der Verbindung zwischen dem Objekt und dem Handler sorgfältig gestaltet und die Reihenfolge der Speicherfreigabe überwacht haben.
Geschichte
In einem Projekt zur medizinischen Automatisierung war die Logik der Synchronisierung mit externen Datenbanken über WithEvents mit den Button-Handlers verbunden. Bei erneutem Öffnen des Formulars wurde ein neues Objekt erstellt, während die alten Verweise nicht entfernt wurden - es kam zu konkurrierenden Handlern, die dazu führten, dass die aktualisierte Logik zweimal oder sogar dreimal ausgeführt wurde. Nach Identifizierung des Fehlers wurde eine strenge Kontrolle der Bereinigung von Handlers bei Fenster-Schließung implementiert.