|
Es gibt mehrere Möglichkeiten festzustellen, welches Element aus
einer Gruppe von Options-Steuerelementen
aktuell gewählt ist.
Wenn auf die Wahl gleich bei einer Änderung reagiert werden
soll, ist die Auswertung kein großes Problem. Sie können in den
Click-Ereignissen der Options-Steuerelemente direkt feststellen,
welches Element nun das aktuell Gewählte ist und dementsprechend
weiteren Code ausführen. Haben Sie die Options-Steuerelemente als
Control-Array angelegt, haben alle Elemente das gleiche
Click-Ereignis - Sie können anhand des übergebenen Index-Wertes
die Wahl erkennen:
Private Sub Option_Click(Index As Integer)
Select Case Index
Case 0
' Aktion 1
Case 1
' Aktion 2
...
Case x
' Aktion x
End Select
End Sub
Schwieriger wird es, wenn Sie die Wahl an einer anderen Stelle
auswerten möchten. Etwa wenn der Anwender seine Auswahl anhand der
Options-Elemente seine Auswahl treffen, aber dann erst über eine
bestimmte Schaltfläche die eigentliche Aktion starten soll, wobei
die zuvor erfolgte Auswahl berücksichtigt wird.
Eine Möglichkeit, wenn auch eine recht wenig elegante, wäre die
Zwischenspeicherung der Auswahl in einer modul-weit gültigen
Variablen:
Private mWahl As Integer
Private Sub Option_Click(Index As Integer)
mWahl = Index
End Sub
Wenn eine Schaltfläche betätigt wird, sieht die Auswertung dann
im Prinzip genau so wie oben aus:
Private Sub Command_Click()
Select Case mWahl
Case 0
' Aktion 1
Case 1
' Aktion 2
...
Case x
' Aktion x
End Select
End Sub
Warum ich diese Möglichkeit als "wenig elegant"
betrachte? Weil sie im Grunde genommen redundant ist
("redundant" heißt so viel wie "doppelt gemoppelt"...).
Die Information über die aktuelle Auswahl wird ja nach wie vor von
den Options-Elementen selbst repräsentiert (die Value-Eigenschaft
des gewählten Options-Elements ist gleich True). Außerdem birgt
eine solche zusätzliche Variable die Gefahr, dass ihr Wert -
vielleicht unbeabsichtigt - verändert werden könnte, ohne dass
sich die Auswahl in den Options-Elementen geändert hätte, oder
diese die Änderung widerspiegeln würden. Besser wäre es also, die
Options-Elemente selbst als Informationslieferant an der Stelle
heranzuziehen, an der die Information benötigt wird.
Einen offensichtlichen direkten Weg gibt es nicht, um in
Erfahrung zu bringen, welches Options-Element gewählt ist. Es gibt
keine gemeinsame Eigenschaft, aus der sich die aktuelle Wahl kurz
und bündig auslesen ließe. Eine weit verbreitete Technik ist, in
einer Schleife jedes Element einer Options-Gruppe der Reihe nach
darauf hin zu prüfen, ob es gewählt ist oder nicht, und
entsprechend zu reagieren:
Private Sub Command_Click()
Dim nIndex As Integer
For nIndex = Option.lbound To Option.ubound
If Option(nIndex).Value Then
Select Case nWahl
Case 0
' Aktion 1
Case 1
' Aktion 2
...
Case x
' Aktion x
End Select
Exit For
End If
Next ' nIndex
End Sub
Eine Options-Gruppe wird sicher nicht so viele Elemente
enthalten, als dass der Schleifendurchlauf Performance-Probleme mit
sich bringen würde, selbst wenn sich erst das letzte Element als
das Gewählte herausstellen sollte. Aber für meinen Geschmack sieht
das mit der voranstehenden Schleife immer noch wenig elegant aus -
ich würde eine schlichte, alleinige Select Case...-Verzweigung
allemal bevorzugen. Doch welcher Wert sollte darin zur Prüfung
verglichen werden können?
Eigentlich ist die Antwort ganz einfach: Der zu vergleichende
Wert ist "True". Das Select Case...-Prinzip
lässt sich nämlich auch umkehren. Anstelle den variablen Wert
obenan dem "Select Case" zuzuordnen und mit den möglichen
"fixen" Werten in den Case-Verzweigungen zu vergleichen,
können Sie auch den fixen Wert obenan stellen und die
veränderbaren, variablen Werte den Case-Verzweigungen zuordnen:
Private Sub Command_Click()
Select Case True
Case Option(0).Value
' Aktion 1
Case Option(1).Value
' Aktion 2
...
Case Option(x).Value
' Aktion x
End Select
End Sub
Das sieht etwas ungewöhnlich und befremdend aus, nicht wahr?
Aber diese Umkehrung funktioniert klaglos - und kann auch in ganz
anderen Situationen hilfreich sein...
|