|
Hier geht es allerdings nicht um Fliegen oder Riesen im Märchen,
sondern um eine komfortable Möglichkeit, wie Sie eine Eigenschaft
mehrerer Steuerelemente auf einmal setzen oder ändern können.
Im einfachsten Fall beispielsweise soll die Eigenschaft Enabled
eines Textfeldes und eines dazugehörenden Beschriftungsfeldes
(Label) immer zugleich geändert werden:
txtFeld.Enabled = False
lblFeld.Enabled = False
und umgekehrt:
txtFeld.Enabled = True
lblFeld.Enabled = True
Bei einem einzigen solchen Paar bereitet Ihnen das sicherlich
keine sonderliche Mühe. Enthält eine Datenmaske jede Menge solcher
Paare, wäre es doch praktischer, den Aufwand zu halbieren, erst
recht dann, wenn Sie die Enabled-Eigenschaft eines Paares sogar von
verschiedenen Stellen in Ihrem Code aus ändern wollen.
Die Aufgabe können Sie mit Hilfe eines Klassen-Moduls auf
bequeme Weise erledigen. Sie versehen die Klasse, nennen wir sie
clsStateEnabled, mit einer Enabled-Eigenschaft und der Möglichkeit,
sie mit Steuerelementen zu füllen. Dann brauchen Sie künftig nur
noch die Enabled-Eigenschaft einer Instanz dieser Klasse zu ändern
und bei allen darin aufgenommenen Steuerelementen wird deren
Enabled-Eigenschaft entsprechend gesetzt.
Private mControls() As Object
Private pEnabled As Boolean
Public Property Get Enabled() As Boolean
Enabled = pEnabled
End Property
Public Property Let Enabled(ByVal New_Enabled As Boolean)
Dim i As Integer
Dim u As Integer
pEnabled = New_Enabled
On Error GoTo LetEnabled_Error
u = UBound(mControls)
On Error Resume Next
For i = 1 To u
mControls(i).Enabled = pEnabled
Next 'i
Exit Property
LetEnabled_Error:
End Property
Public Sub AddControl(iControl As Object)
Dim u As Integer
On Error Resume Next
u = UBound(mControls)
If Err.Number = 9 Then
ReDim mControls(1 To 1)
u = 1
Else
u = u + 1
ReDim Preserve mControls(1 To u)
End If
On Error GoTo AddControl_Error
Set mControls(u) = iControl
iControl.Enabled = pEnabled
Exit Sub
AddControl_Error:
End Sub
 |
Die Klasse clsStateEnabled

|
Die Verwaltung der aufgenommenen Steuerelemente beruht auf einem
Array. Dieses wird für jedes hinzugefügte Steuerelement um ein
Element erweitert. In der Prozedur AddControl wird vor dem Einfügen
die Obergrenze des Arrays geprüft. Stellt sich heraus (der
auftretende Fehler wird abgefangen), dass das Array noch
jungfräulich ist, wird es erstmals mit 1 als Unter- und Obergrenze
initialisiert. Abschließend wird die Enabled-Eigenschaft des frisch
hinzugefügten Steuerelements entsprechend des internen Wertes von
pEnabled gesetzt.
Wird über die Property Let-Prozedur Enabled der interne Wert
pEnabled geändert, wird auch die Enabled-Eigenschaft aller in dem
Array enthaltenen Steuerelemente entsprechend gesetzt. Sollte das
Array noch leer (unitialisiert) sein, wird die Prozedur über den
abgefangenen Fehler verlassen.
Interessanter wird der Nutzen dieser Klasse, wenn Sie
beispielweise mehrere Steuerelemente auf einem Rahmen (Frame)
platziert haben und deren Enabled-Eigenschaft gleichzeitig mit dem
Rahmen setzen wollen. Das Setzen der Enabled-Eigenschaft des Rahmens
alleine sperrt zwar die darauf platzierten Steuerelemente. Da deren
Enabled-Eigenschaft jedoch nicht direkt geändert wird, ändert sich
auch nicht deren Erscheinungsbild, das dem Anwender die Sperrung
signalisiert. Nehmen Sie also den Rahmen samt den Steuerelementen
darauf in eine Instanz der clsStateEnabled-Klasse auf, erledigt
diese auf bequeme Weise die Aufgabe.
Betrifft eines dieser Steuerelemente auf dem Rahmen obendrein
noch eine Funktion Ihres Programms, das beispielsweise ebenfalls von
einem Menü-Element kontrolliert wird, ist nichts einfacher, als
auch noch das Menu-Element in die Instanz aufzunehmen.
Die beiden folgenden Abbildungen und das Beispiel-Listing zeigen
Ihnen, wie einfach und bequem das auf diese Weise wird.
Option Explicit
Private mFelder As clsStateEnabled
Private Sub chkEnableFelder_Click()
mFelder.Enabled = CBool(chkEnableFelder.Value)
End Sub
Private Sub Form_Load()
Set mFelder = New clsStateEnabled
With mFelder
.Enabled = True
.AddControl fraFelder
.AddControl lblFeld1
.AddControl txtFeld1
.AddControl lblFeld2
.AddControl txtFeld2
.AddControl mnuFelder
End With
End Sub
 |
Praktische Anwendung der Klasse
clsStateEnabled

|
Selbstverständlich können Sie auch andere Eigenschaften von
Steuerelementen auf diese Weise auf einen Streich kontrollieren. Sie
brauchen in der Klasse clsStateEnabled lediglich die
Enabled-Eigenschaft gegen eine andere Eigenschaft austauschen, wie
gegen Visible - die Klasse würde dann etwa clsStateVisible heißen.
Oder Sie erstellen eine Klasse clsStates, die Sie gleichzeitig mit
mehreren Eigenschaften versehen: Enabled, Visible, Font und mehr.
|