|
Wenn die Eigenschaft ControlContainer
eines UserControls auf True gesetzt ist, können auf ihm in einem
Form wie auf einer PictureBox oder einem Frame-Element andere
Steuerelemente platziert werden. Das UserControl dient dann als
Container und liefert in seiner internen Eigenschaft ContainedControls
eine Auflistung (Collection) der auf ihm platzierten Steuerelemente.
Wenn Sie diese Eigenschaft an eine öffentliche Property
Get-Prozedur weiterreichen, kann auch von außen her auf diese
Auflistung ähnlich wie auf die Controls-Eigenschaft
eines Forms zugegriffen werden:
Public Property Get Controls() As Object
Set Controls = UserControl.ContainedControls
End Property
Diese Eigenschaft muss allerdings als vom Datentyp Object
deklariert werden, da Visual Basic es nicht zulässt, VB-eigene
Objekttypen wie Control, Controls u.a. öffentlich zu verwenden.
Die Vorbilder für diese Container-Fähigkeit des UserControls,
nämlich die PictureBox und das Frame-Element kennen jedoch leider
keine solche Auflistung. Sie können nur über die
Controls-Eigenschaft eines Forms ermitteln, welche Steuerelemente
auf einem solchen Container platziert sind. Dazu gehen Sie alle in
der Controls-Auflistung enthaltenen Steuerelemente durch und prüfen
Sie bei jedem, ob sein Container mit dem gegebenen Container
übereinstimmt, beispielsweise für MeinePictureBox:
Dim nControl As Control
For Each nControl In FormXY.Controls
If nControl.Container Is MeinePictureBox Then
' ... nControl ist auf MeinePictureBox platziert
End If
Next
Sie können die so ermittelten Steuerelemente in einer eigenen
Collection zusammenfassen, um diese Suche nicht immer wieder aufs
Neue durchführen zu müssen. Während jedoch die
ContainedControls-Auflistung eines UserControls und die
Controls-Auflistung eines Forms automatisch aktualisiert werden,
wenn Steuerelemente hinzukommen sollten (etwa nachgeladen in einem
Control-Array, oder durch nachträgliche Zuweisung des Containers),
müssen Sie diese eigene Collection selbst aktuell halten. Sie
können die neu hinzugekommenen Steuerelemente selbst hinzufügen
bzw. gegebenenfalls wieder entfernen. Oder Sie stellen die
Collection erneut zusammen. Verwenden Sie als Schlüssel beim
Einfügen in die Collection den Namen des Steuerelements. Da bei
Steuerelementen aus einem Control-Array der Name kein eindeutiger
Schlüssel wäre, müssen Sie dann den Index hinzufügen. wenn es
einem Control-Array angehört, können Sie den Index aus der
Index-Eigenschaft des Steuerelements auslesen. Gehört es jedoch
keinem Control-Array an, wird der Laufzeitfehler 343 ausgelöst, den
Sie allerdings mit einem vorhergehenden On Error Resume Next
abfangen und auswerten können, um einen Schlüssel mit dem Index in
Klammern zu generieren, wie er zum Beispiel im
VB-Eigenschaftenfenster angezeigt wird.
Verpacken Sie dieses Zusammenstellen der Bequemlichkeit halber am
besten in eine eigene Funktion:
Public Function ContainedControls(Container As Control) _
As Collection
Dim nCollection As Collection
Dim nControl As Control
Dim nIndex As Integer
Set nCollection = New Collection
With nCollection
On Error Resume Next
For Each nControl In Container.Parent.Controls
If nControl.Container Is Container Then
nIndex = nControl.Index
If Err.Number Then
Err.Clear
.Add nControl, nControl.Name
Else
.Add nControl, nControl.Name & "(" & nControl.Index & ")"
End If
End If
Next
End With
Set ContainedControls = nCollection
End Function

|