|
Es ist bestimmt nicht die feine Art, Steuerelemente, die Sie auf
einem UserControl platziert haben, einfach in einer Eigenschaft
offen zu legen. Doch wenn Sie nur "mal eben schnell" die
Fähigkeiten eines vorhandenen Steuerelements ein wenig erweitern
und sich dennoch die Mühe sparen wollen, Eigenschaften, Methoden
und Ereignisse mühsam nachzubilden und durchzuschleifen (oder sich
nicht mit dem Chaos des Schnittstellen-Assistenten herumplagen
wollen), dann kann das durchaus ein Notbehelf sein. Allerdings nur,
solange Sie erstens genau wissen was Sie tun, weil Sie ja auf diese
Weise im objektorientierten Sinne die Kapselung aufgeben. Und
zweitens sollten Sie diesen Kniff auf UserControls beschränken, die
Sie direkt als nicht-öffentliches UserControl-Modul in ein Projekt
geladen haben. Gegegebenenfalls kann das UserControl zwar auch
öffentlich sein. Aber dann sollten Sie sich sicher sein, dass die
OCX-Datei lokal auf dem gleichen Rechner ausgeführt wird, oder Sie
deklarieren die Eigenschaften zur Offenlegung als "Friend".
Enthält ein UserControl mehrere Steuerelemente, können Sie sich
sogar den Komfort gönnen, die Controls-Eigenschaft des UserControls
in einer Eigenschaft offen zu legen. Dann können Sie darüber auf
diese Steuerelemente unter ihrem Namen zugreifen und müssen nicht
jedes einzelne als Eigenschaft offen legen. Werden zur Laufzeit
dynamisch Steuerelemente zur Controls-Sammlung des UserControls
hinzugefügt, stehen diese so auch zur Verfügung.
Haben Sie zum Beispiel auf Ihrem UserControl "ucTest"
ein Label mit dem Namen "lblBeschriftung" platziert, dann
schreiben Sie eine nur lesbare Eigenschaft zum Zugriff auf das Label
so:
Public Property Get lblBeschriftung() As Label
Set lblBeschriftung = UserControl.lblBeschriftung
End Property
Nun können Sie die Caption-Eigenschaft auf die gleiche Weise
setzen, wie bei einem Label, das sich auf einem anderen Form
befindet:
ucTest.lblBeschriftung.Caption = "ABCDEFG"
Auf die Methoden des Labels greifen Sie ebenfalls wie gewohnt zu:
ucTest.lblBeschriftung.Move 0, 0
Selbst die Ereignisse des Labels können Sie direkt verarbeiten,
indem Sie außerhalb des UserControls eine entsprechende
Ereignisempfänger-Variable mit WithEvents deklarieren:
Private WithEvents elblBeschriftung As Label
und etwa im Form_Load-Ereignis das Label des UserControls
zuweisen:
Set elblBeschriftung = ucTest.lblBeschriftung
Auf gleiche Weise legen Sie die Controls-Eigenschaft des
UserControls als nur lesbare Eigenschaft offen:
Public Property Get Controls() As Controls
Set Controls = UserControl.Controls
End Property
Wie von der Controls-Sammlung eines Forms her gewohnt finden Sie
das Label des UserControls:
ucTest.Controls("lblBeschriftung").Caption = "ZYXWVUT"
Ebenso können Sie nach wie vor alle Steuerelemente auf dem
UserControl in einer Schleife durchlaufen:
Dim nControl As Control
For Each nControl in ucTest.Controls
nControl.Visible = False
Next
Oder Sie fügen der Controls-Sammlung des UserControls zur
Laufzeit ein neues Steuerelement hinzu, und zwar gleichfalls von
außerhalb inklusive Empfang der Ereignisse:
Private WithEvents eNeuesBild As PictureBox
' ...
Set eNeuesControl = ucTest.Controls.Add(VB.PictureBox, "NeuesBild")
' ...
Aber, um das Eingangs Gesagte noch einmal ganz deutlich zu
wiederholen: Eine derartige Offenlegung sollte immer nur eine
Notlösung für Ihre privaten Zwecke zur Arbeitsersparnis sein. Ein
solchermaßen ungekapseltes UserControl sollten Sie niemals
weitergeben, vor allem nicht als kompiliertes OCX öffentlich
verbreiten, auch nicht als Freeware, nicht als Shareware und erst
recht nicht kommerziell. Sie würden sich nur höchstwahrscheinlich
massive Support-Probleme und garantiert einen schlechten Ruf
einhandeln!
|