Eine endlose Liste im wirklichen Sinne gibt es sicher nicht. Aber Sie können die Markierung bzw. Auswahl in ListBoxen oder ComboBoxen endlos umlaufen lassen, sowohl abwärts als auch aufwärts.
Es gibt prinzipiell zwei Wege, auf denen Sie dies erreichen können. Der nahe liegende Weg etwa beim Aufwärtslauf wäre, den Wert des ListIndex um 1 zu erhöhen und zu prüfen, ob der neue Wert den höchstmöglichen Wert (ListCount - 1) übersteigt. Ist dies der Fall wird der ListIndex auf 0 zurückgesetzt - ein Umlauf findet statt. Natürlich ist diese Operation nur sinnvoll, wenn überhaupt Elemente in der Liste existieren (ListCount > 0).
Dim nNewListIndex As Long
With ListBox
If .ListCount Then
nNewListIndex = .ListIndex + 1
If nNewListIndex > .ListCount - 1 Then
.ListIndex = 0
Else
.ListIndex = nNewListIndex
End If
End If
End With
Umgekehrt, für die Abwärtsrichtung, würde auf ähnliche Weise der ListIndex um eins vermindert und es würde geprüft, ob die Untergrenze 0 unterschritten wird. Ist nun dies der Fall, wird der ListIndex auf den höchstmöglichen Wert gesetzt.
Viel einfacher ist das in der folgenden Funktion LBRotateIncrListIndex verwendete Verfahren. Es kommt ohne Bedingungsprüfungen aus (außer der Prüfung, ob überhaupt Elemente vorhanden sind). Auch hier wird der ListIndex zunächst erhöht. Aber es erfolgt sogleich eine Modula-Division durch die Anzahl der Elemente (ListCount). Die Modula-Division liefert nur den Rest der Division, der hier genau dann 0 ist, wenn die Erhöhung der Anzahl der Elemente und damit zugleich dem niedrigsten ListIndex entspricht. Auch der Ausnahmefall, dass noch gar kein Element ausgewählt sein könnte und der ListIndex noch -1 wäre, wird problemlos aufgefangen. Die erste Erhöhung um 1 ergäbe ja 0 - und damit bereits einen gültigen, nämlich den niedrigsten ListIndex.
Public Sub LBRotateIncrListIndex(ListBox As ListBox)
With ListBox
If .ListCount Then
.ListIndex = (.ListIndex + 1) Mod .ListCount
End If
End With
End Sub
Die Umkehrung sieht ähnlich aus. Der Unterschied ist der, dass nach der Verminderung des ListIndex erst einmal die Anzahl der Elemente addiert wird, bevor die Modula-Division erfolgt, um das Unterschreiten der 0-Grenze zu kompensieren. Der Fall, dass noch kein Element gewählt ist (ListIndex = -1) muss hier auch separat behandelt werden - der ListIndex wird hier auf das höchstmögliche Element gesetzt.
Public Sub LBRotateDecrListIndex(ListBox As ListBox)
With ListBox
If .ListCount Then
If .ListIndex >= 0 Then
.ListIndex = (.ListIndex - 1 + .ListCount) Mod .ListCount
Else
.ListIndex = .ListCount - 1
End If
End If
End With
End Sub
Das Umlaufen des ListIndex bei einer ComboBox ist völlig identisch. bei den folgenden beiden Funktionen ist lediglich der Parameter zur Übergabe des betreffenden Steuerelements entsprechend anders deklariert.
Public Sub CBRotateIncrListIndex(ComboBox As ComboBox)
With ComboBox
If .ListCount Then
.ListIndex = (.ListIndex + 1) Mod .ListCount
End If
End With
End Sub
Public Sub CBRotateDecrListIndex(ComboBox As ComboBox)
With ComboBox
If .ListIndex >= 0 Then
.ListIndex = (.ListIndex - 1 + .ListCount) Mod .ListCount
Else
.ListIndex = .ListCount - 1
End If
End With
End Sub
|