|
Sie können zwar ein Form, genauer gesagt, eine Form-Klasse, mit zusätzlichen Eigenschaften versehen. Doch diese tauchen im Eigenschaften-Fenster nicht auf. Dort werden Ihnen nur die Standard-Eigenschaften eines Forms präsentiert, die Sie zur Design-Zeit bearbeiten können. Natürlich könnten Sie irgend welche Werte, die zur Laufzeit benötigt werden, auch als Konstanten im Code des betreffenden Forms anlegen, oder einfach direkt als Wert irgendwo im Code an Ort und Stelle einfügen. Doch dann fehlt Ihnen die "visuelle" Bearbeitung im Eigenschaftenfenster. Und wenn Sie ein Form-Modul als Vorlage (Template) ständig wieder verwenden oder es an Kollegen oder Mitarbeiter weiterreichen wollen, wäre eine Bearbeitung im Eigenschaftenfenster sicher auch nicht ganz unpraktisch.
Eine einfache Lösung bieten fensterlose UserControls (Eigenschaft Windowless = True), die zur Laufzeit erst gar nicht angezeigt werden (Eigenschaft InvisibleAtRuntime = True), sondern nur als Träger für eine Eigenschaft dienen. Diese Eigenschaft, beispielsweise "Value" genannt, wird als Standard-Eigenschaft festgelegt, so dass der Zugriff auf sie direkt über den Namen der auf einem Form platzierten Instanz des UserControls erfolgen kann. Wird das UserControl dort etwa "MyProperty" genannt, sähe der Zugriff vielleicht so aus, von innen oder von außen:
MsgBox Me.MyProperty
MsgBox Form1.Property
Die vollständige Schreibweise für den Zugriff sähe natürlich jeweils so aus:
MsgBox Me.MyProperty.Value
MsgBox Form1.Property.Value
Das UserControl selbst zeigt seinen Namen als Namen der Eigenschaft direkt an (siehe "DisplayName im Blick"). Der Wert der Eigenschaft "Value" wird wie gewohnt über Eigenschaftenprozeduren (Get und Let) offen gelegt und in den UserControl-Ereignissen WriteProperties und ReadProperties abgelegt bzw. zur Laufzeit wieder eingelesen. Das folgende Beispiel zeigt den Code für eine Eigenschaft des Datentyps Variant. Selbstverständlich können Sie nach diesem Muster Eigenschaften jedes möglichen Datentyps einrichten.
Private pValue As Variant
Public Property Get Value() As Variant
Value = pValue
End Property
Public Property Let Value(New_Value As Variant)
pValue = New_Value
PropertyChanged "Value"
End Property
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
pValue = PropBag.ReadProperty("Value", Empty)
End Sub
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
PropBag.WriteProperty "Value", pValue, Empty
End Sub
Private Sub UserControl_AmbientChanged(PropertyName As String)
Select Case LCase$(PropertyName)
Case "displayname"
UserControl_Show
End Select
End Sub
Private Sub UserControl_Show()
lblName.Caption = Ambient.DisplayName
UserControl_Resize
End Sub
Private Sub UserControl_Resize()
On Error Resume Next
With lblName
UserControl.Size (.Width + 2) * Screen.TwipsPerPixelX, _
(.Height + 1) * Screen.TwipsPerPixelY
End With
End Sub
Sie können ein solches UserControl auch mit mehreren verschieden benannten und gegebenenfalls spezialisierten Eigenschaften bestücken. Allerdings kann nur eine dieser Eigenschaften wie beschrieben als Standard-Eigenschaft verwendet werden und den Bezug zum Namen des platzierten UserControls aufgreifen.
|