Achtung, was hier als Beispiel gezeigt ist, ist keine Visual Basic-ComboBox, sie sieht nur so aus, man kann nicht hineinschreiben!
Ein Listenfeld-Steuerelement (ListBox) zeigt eine Liste mit Elementen an, aus der der Benutzer ein oder mehrere Elemente auswählen kann. Wenn die Anzahl der Elemente größer ist als die Anzahl der Elemente, die dargestellt werden können, wird automatisch eine Bildlaufleiste zum Listenfeld-Steuerelement hinzugefügt.
Das Listenfeldsteuerelement kann einzeilig angezeigt werden, dann enthält es (bei mehr als einem Eintrag) rechts solch albernen Doppelpfeil für das Blättern nach oben und unten, den man mit der Maus nur dann sicher bedienen kann, wenn man Zielwasser getrunken hat.
Achtung:
Zur Laufzeit wird beim Listenfeld-Steuerelement standardgemäß das Click-Ereignis ausgewertet. Bei einzeiliger Ausführung der Listbox tritt dieses erst ein, wenn nach der Auswahl durch Scrollen zusätzlich auf einen Eintrag geklickt wird. Deshalb sollte es generell mehrzeilig angezeigt werden, weil die Auswahl dann wie eine Auswahl aussieht und wie eine Auswahl (nämlich durch ordentlichen Klick) stattfindet. Wenn Mehrfachauswahl gewünscht wird, geht es ja ohnehin nur so.
Es gibt zwei durch die Style-Eigenschaft unterschiedene Listenfelder.
Alle Einträge gehören zur Eigenschaft List. Sie können zur Entwurfszeit im Eigenschaftenfenster unter List eingetragen werden (neue Zeile mit <Str>+<Return>).
Mit den Methoden AddItem und RemoveItem kann man zur Laufzeit Elemente hinzufügen oder löschen. Das geschieht meist beim Öffnen des Formulars (Form_Load) oder natürlich auf ein geeignet ausgewähltes Ereignis hin (z. B. _Click auf einen Button "Neue Auswahl").
Bei der ComboBox (Style=0) können die Einträge auch von Hand erfolgen. Dazu später ein Beispiel. Die Übernahme in die Liste der Einträge erfolgt nach Fertigstellung des Textes auch dabei mit AddItem.
Das erste Element in der Liste hat den ListIndex-Wert 0, und der Wert der ListCount-Eigenschaft (Zahl der Einträge) ist immer um eins höher als der größte ListIndex-Wert. Wenn kein Element ausgewählt ist, hat die ListIndex-Eigenschaft den Wert -1.
Wann immer man eine Auswahl anbieten will, sollte man es tun und nicht etwa eine ComboBox leer in der Gegend rumstehen lassen. Dazu setzt man sie mittels Combo1.ListIndex = 0 etwa auf den ersten Eintrag oder mit einer geeigneten Zahl auf den Lieblingseintrag. Das Listenfeldsteuerelement zeigt automatisch den Beginn der Einträge.
Das Auswählen eines Elements in einem Kombinationsfeld- oder Listenfeld-Steuerelement (ComboBox oder ListBox) erfolgt entweder durch Klicken mit der Maustaste oder durch Drücken der Pfeiltasten.
Dabei tritt das Click-Ereignis auf.
Bei der Programmierung ist das Kombinationssteuerelement ein wenig tückisch. Auf den Doppelklick hin, der den häufigsten Aufruf des Steuerelements im Codeteil öffnet, erscheint hier nämlich "Sub ComboName_Change()", und das betrifft nur einen speziellen Fall der Anwendung, denjenigen nämlich, bei dem in die Combobox hinein geschrieben wurde, die ComboBox also als Textfeld genutzt wurde.
Bei einem Textfeld wertet man "_Change" aus, um z.B. die Zulässigkeit eingegebener Zeichen zu prüfen (vgl. als Programmierbeispiel dazu den Währungsrechner).
Wenn dagegen nur eine einfache Auswahl getroffen wurde dann muß die Auswertung mit "_Click" erfolgen.
Über die Eigenschaften ListIndex bzw. ListCount greift man auf die Zählung der Einträge zu. Das ist sinnvoll, wenn man zum Beispiel 24 Werkstoffe mit ihren Namen anzeigt, unter denen man auch wählt, im Programm aber ihre Dichten braucht. Dann verwaltet man zweckmäßigerweise zwei Arrays, etwa WStoff(i) und Dichte(i), über die im Auswahlfeld ermittelte Nummer.
Anders, wenn man etwa 324 Städtenamen zur Auswahl anbietet und nur diese im Programm braucht.
Diesmal gibt es mehrere Möglichkeiten. Mit Name = Combo1.Text erhält man den gewählten Texteintrag ebenso wie mit (was viel fachmännischer aussieht) Name = Combo1.List(Combo1.ListIndex).
Wenn das Listenfeld die Mehrfachauswahl zuläßt (MultiSelect = 1), gilt für das Auswerten der selektierten Zeilen eine besondere Syntax. In diesem speziellen Fall sind die Listeneinträge mit einem Index adressierbar; dazu ein Beispiel:
Abfrage ob selektiert
| Schritt 1: Einträge in die ListBox vornehmen, Beispiel zur Vorbereitung der Auswahl eines Ortsnamens: ... Private Sub Form_Load() Dim i As Integer For i = 1 To Angebot List1.AddItem (Ortsnamen(i)) Next End SubSchritt 2: Auswertung der vorgenommenen Auswahl, hier nur Zählung: ... Ortszahl = 0 For i = 1 To Angebot If List1.Selected(i - 1) Then Ortszahl = Ortszahl + 1 End If Next |

dasselbe zur Laufzeit:

| Option Explicit Private Sub Form_Load() Dim i% Combo1.AddItem "Russen" 'Kombinationsfeld 1 wird vor Öffnung des Formulars Combo1.AddItem "Inder" 'beschrieben, die anderen Combos über das Combo1.AddItem "Chinesen" 'Eigenschaftsfenster Combo1.ListIndex = 0 'alle Combos auf ersten Eintrag setzen Combo2.ListIndex = 0 Combo3.ListIndex = 0 For i = 1 To 100 'Listenfelder mit Programmschleife füllen List1.AddItem "Liste " & i List2.AddItem "Feld " & i Next End SubList1.ListIndex = 0 'Listenfelder auf ersten Eintrag setzen List2.ListIndex = 0 Private Sub Combo1_Change()'Es wurde im Fenster etwas verändert Label5.caption=Combo1.Text 'die Veränderung wird angezeigt End SubAnmerkung: Es wird jede Veränderung ausgewertet, beim Schreiben eines Wortes also jeder Buchstabe einzeln. Wenn ein neuer Text komplett geschrieben worden ist, muß irgendwie der Schluß markiert werden. Dazu könnte, (es gibt da so bestimmte Gebräuche!) ein Return ausgewertet werden. Danach muß etwas mit dem neuen Text passieren, z.B. soll er in der Combo-Liste wählbar verbleiben. Das machen wir jetzt! Dazu müssen Tastendrücke überwacht werden: Private Sub Combo1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Combo1.AddItem Combo1.Text 'Return beendet Texteingabe End Sub'und fügt der Auswahlliste den neuen Eintrag hinzu Noch eine Anmerkung: Die Ergänzung der ComboBox hat (neudeutsch: macht) eigentlich nur dann Sinn, wenn solche ergänzten Einträge abgespeichert werden und beim Neustart des Programms zur Verfügung stehen. Das muß man natürlich eigens programmieren. Man kann dazu eine Ini-Datei nutzen oder eigens angelegte Datenfiles. Letztere können freier organisiert werden. Private Sub Combo1_Click() 'Beispiele: Auslesen einer Auswahl, Index und Text Label5.Caption = Combo1.ListIndex & " " & Combo1.Text End SubPrivate Sub Combo2_Click() Label5.Caption = Combo2.ListIndex & " " & Combo2.Text End SubPrivate Sub Combo3_Click() Label5.Caption = Combo3.ListIndex & " " & Combo3.Text End SubPrivate Sub List1_Click() Label5.Caption = List1.ListIndex & " " & List1.Text End SubPrivate Sub List2_Click() Label5.Caption = List2.ListIndex &" " & List2.Text End SubPrivate Sub Command1_Click()'genug ausgelesen, Ende! End End Sub |