In Visual Basic (VB.NET) wordt voor het dynamisch creëren van besturingselementen een instantie van de benodigde klasse gemaakt en toegevoegd aan de Controls-collectie. Voor het verwerken van gebeurtenissen voor dynamisch gecreëerde besturingselementen in VB.NET worden delegaten en de AddHandler operator toegepast:
Voorbeeld (VB.NET):
Dim btn As New Button() btn.Text = "Klik op mij!" 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 gemaakte knop geklikt.") End Sub
In klassiek VB6 is het dynamisch creëren en verwerken van gebeurtenissen voor besturingselementen alleen mogelijk via control arrays, waarbij de indexen de afzonderlijke elementen onderscheiden:
Voorbeeld (VB6):
' Op het formulier moet een CommandButton-element met Index = 0 zijn Load Command1(1) Command1(1).Visible = True Private Sub Command1_Click(Index As Integer) MsgBox "Knop met index " & Index & " is ingedrukt!" End Sub
Het is belangrijk om te onthouden dat er in VB.NET geen concept van control arrays is zoals in VB6 — de verwerking van gebeurtenissen bij dynamisch gecreëerde besturingselementen wordt alleen verzorgd door het mecanisme van delegaten en AddHandler/RemoveHandler.
Vraag: "Wat gebeurt er als je vergeet RemoveHandler aan te roepen voor de gebeurtenissen van een dynamisch gecreëerd besturingselement bij de vernietiging ervan? Welke gevolgen kan dit hebben?"
Antwoord: Als je vergeet RemoveHandler aan te roepen voordat je het besturingselement verwijdert, blijft de verwijzing naar de handler in het geheugen, wat leidt tot een geheugenlek (memory leak), en soms kan dit leiden tot een poging om toegang te krijgen tot een al vernietigd object of formulier, wat een uitzondering zal veroorzaken.
Voorbeeld:
' Vergeten RemoveHandler: ' AddHandler btn.Click, AddressOf SomeHandler ' Controls.Remove(btn) ' btn is er niet meer, maar de handler blijft hangen
Verhaal
In het factureringssysteem voor betalingsuitrusting werden dynamische knoppen op het paneel voor betalingsoperaties gemaakt. Na het sluiten van het venster hinderen de resterende gebeurtenishandlers de garbage collection. Gedurende een week veroorzaakte de applicatie geheugenlekken, wat leidde tot servercrashes en de behoefte om het proces handmatig opnieuw op te starten tijdens nachtelijke operaties.
Verhaal
In een medisch visualisatieproject op WinForms werden grote aantallen "image preview" PictureBox-besturingselementen gemaakt en vernietigd. De ontwikkelaar verwijderde de gebeurtenishandlers niet. Na 20-30 laden begon de applicatie te vertragen: het bleek dat duizenden verborgen handlers bleven hangen, wat de vrijgave van bronnen blokkeerde.
Verhaal
In een van de educatieve applicaties voor kinderen werden dynamisch quizknoppen gevormd en na het spelen van het spel van het formulier verwijderd, maar de gebeurtenissen werden niet afgemeld via
RemoveHandler. Hierdoor traden bij het starten van een nieuw spel "spook"-acties van de controlecode op, wat leidde tot verouderde pop-ups, bugs met het toekennen van punten en algemene verwarring.