In Visual Basic (VB.NET) wird zur dynamischen Erstellung von Steuerelementen eine Instanz der benötigten Klasse erstellt und dieser zur Controls-Sammlung hinzugefügt. Zur Ereignisbehandlung für dynamisch erstellte Steuerelemente in VB.NET werden Delegaten und der Operator AddHandler verwendet:
Beispiel (VB.NET):
Dim btn As New Button() btn.Text = "Klicke mich!" btn.Location = New Point(40, 40) Me.Controls.Add(btn) AddHandler btn.Click, AddressOf Button_Click Private Sub Button_Click(sender As Object, e As EventArgs) MessageBox.Show("Dynamisch erstellter Button geklickt.") End Sub
Im klassischen VB6 ist es möglich, Steuerelemente dynamisch zu erstellen und Ereignisse nur über Steuerelement-Arrays (Control Arrays) zu verarbeiten, bei denen die Indizes verschiedene Elemente unterscheiden:
Beispiel (VB6):
' Auf dem Formular muss ein CommandButton mit Index = 0 vorhanden sein Load Command1(1) Command1(1).Visible = True Private Sub Command1_Click(Index As Integer) MsgBox "Taste mit Index " & Index & " gedrückt!" End Sub
Es ist zu beachten, dass es in VB.NET kein Konzept der Steuerelement-Arrays wie in VB6 gibt — die Ereignisbehandlung von dynamisch erstellten Steuerelementen erfolgt nur über das Delegaten-System und AddHandler/RemoveHandler.
Frage: "Was passiert, wenn man vergisst, RemoveHandler für die Ereignisse eines dynamisch erstellten Steuerelements bei dessen Zerstörung aufzurufen? Welche Konsequenzen kann das haben?"
Antwort: Wenn man vergisst, RemoveHandler vor dem Entfernen des Steuerelements aufzurufen, bleibt der Verweis auf den Handler im Speicher, was zu einem Speicherleck (memory leak) führt und manchmal auch zu einem Versuch, auf ein bereits zerstörtes Objekt oder Formular zuzugreifen, was eine Ausnahme auslösen kann.
Beispiel:
' Vergessenes RemoveHandler: ' AddHandler btn.Click, AddressOf SomeHandler ' Controls.Remove(btn) ' btn existiert nicht mehr, aber der Handler bleibt
Geschichte
In einem Abrechnungssystem für Zahlungsterminals wurden dynamische Buttons auf der Leiste für Zahlungsoperationen erstellt. Nach dem Schließen des Fensters hinderten die verbleibenden Ereignishandler die Müllsammlung (Garbage Collection). Im Laufe einer Woche verursachte die Anwendung Speicherlecks, was zum Absturz von Servern führte und die Notwendigkeit mit sich brachte, den Prozess manuell über Nachtoperationen neu zu starten.
Geschichte
In einem medizinischen Visualisierungsprojekt auf WinForms wurden zur Generierung einer großen Anzahl von "Bildvorschauen" PictureBoxes erstellt und zerstört. Der Entwickler entfernte keine Ereignishandler. Nach 20-30 Ladevorgängen begann die Anwendung zu stocken: Es stellte sich heraus, dass Tausende von verborgenen Handlern weiterhin vorhanden waren, was die Freigabe von Ressourcen blockierte.
Geschichte
In einer der Bildungsanwendungen für Kinder wurden dynamisch Quiz-Buttons erstellt und nach dem Ende des Spiels vom Formular entfernt, aber die Ereignisse wurden nicht über RemoveHandler abgemeldet. Dadurch kam es beim Start eines neuen Spiels zu "Gespenster"-Auslösungen von Prüfcode, was zu veralteten Popups, Punktabrechnungsfehlern und allgemeiner Verwirrung führte.