RSS
StartseiteKnowledge LibraryTop 10Impressum

5.1 Wie füge ich Steuerelemente zur Laufzeit hinzu?

VB4-VB6

Von: Thorsten Dörfler

Es gibt zwei Möglichkeiten, weitere Steuerelemente zur Laufzeit einem Formular hinzuzufügen. Die klassische ist ein Control-Array, Das heißt, dass zur Design-Zeit schon mindestens ein Steuerelement mit dem Index 0 auf dem Formular vorhanden sein muss. Über die Load Anweisung kann man dann zur Laufzeit weitere Steuerelemente vom gleichem Typ hinzufügen:

Load Text1(Text1.UBound + 1)

With Text1(Text1.UBound)
  .Top = Text1(Text1.UBound - 1).Top + .Height
  .Visible = True
End With

Seit VB6 bietet sich auch die Möglichkeit an, Steuerelemente völlig frei, also ohne Control-Array zu erstellen. Dazu wird die Add-Methode der Controls-Auflistung verwendet:

Dim txtMyText As TextBox

Set txtMyText = Controls.Add("VB.TextBox","txtMyText")

With txtMyText
  .Move 315, 315, 2175, 255
  .Text = "Dynamische TextBox"
  .Visible = True
End With

Der Zugriff auf die TextBox kann auch ohne eigene Variable, über die Controls- Auflistung erfolgen:

Controls("txtMyText").Text = "Neuer Text"

Einen kleinen Haken haben aber beide Möglichkeiten: Eigenschaften, die zur Laufzeit schreibgeschützt sind, können nicht verändert werden. Besonders ärgerlich bei der Erzeugung neuer Controls über Controls.Add.

Möchte man UserControls aus dem gleichen Projekt dynamisch über Controls.Add erstellen, kommt man früher oder später mit dem VBControlExtender-Objekt in Kontakt. Der VBControlExtender stellt grundsätzliche Eigenschaften und Methoden von Steuerelementen bereit, wie Visible, Height, Width und Move. Alle Steuerelemente werden bei ihrer Verwendung automatisch um diesen VBControlExtender erweitert. Bei den VB-eigenen und externen Steuerelementen werden auch die Klassen um den VBControlExtender erweitert.

Bei UserControls im gleichen Projekt allerdings, bleiben die Klassen unberührt. Sie spiegeln allein die Schnittstelle wieder, die man im UserControl definiert hat. Um beide Schnittstellen, also die eigene UserControl-Klasse und den VBControlExtender anzusprechen, kann man die Objektvariable, die die Referenz auf das neu erstellte Steuerelement aufnehmen soll, einfach 'As Object' deklarieren, womit man Zugriff auf beide Schnittstellen zugleich hat, oder man deklariert explizit die Schnittstelle, die man gerade benötigt, um auch IntelliSense Unterstützung der IDE auszukosten:

Dim lCtl As VBControlExtender

Set lCtl = Controls.Add("Projekt1.UserControl1", "User1")

lCtl.Visible = True
lCtl.Move 315, 315, 2175, 255

Die eigene UserControl-Klasse verbirgt sich dabei hinter der Object-Eigenschaft des VBControlExtender:

Dim lUser1 As UserControl1

Set lUser1= lCtl.Object
lUser1.Foo
Links zum Thema