Rubrik: Controls · ComboBox | VB-Versionen: VB4, VB5, VB6 | 28.01.02 |
ComboBox laden/speichern und vervollständigen Just Explorer´s ComboBox like - Eine ComboBox, die sich Eingaben merkt, Eingaben autom. vervollständigt usw. | ||
Autor: Dieter Otter | Bewertung: | Views: 27.549 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
Jeder, der den Microsoft Internet Explorer nutzt, kennt die ComboBox aus der Adresszeile. Beim Eingeben neuer URLs in das Combo-Eingabefeld wird versucht die Eingabe autom. zu vervollständigen. Neue URLs werden automatisch in der Combo-Liste gespeichert, so dass diese jederzeit wieder aus der Liste ausgewählt werden können. Und nicht mehr benötigte Einträge lassen sich manuell per Entf-Taste aus der aufgeklappten Liste löschen.
Alle diese Funktionen lassen sich mit relativ wenig Aufwand auf eine normale Windows Standard-ComboBox übertragen. Und hier erfahren Sie, wie's geht.
Der Reihe nach...
autom. Eintragen neuer Eingaben in die ComboBox-Liste
Wird in das Combo-Eingabefeld ein neuer Eintrag eingegeben, soll dieser beim Drücken von Enter in die ComboBox-Liste aufgenommen werden. Aber nur, wenn er nicht bereits vorhanden ist. Hierzu fragen wir im KeyPress-Ereignis die Enter-Taste ab:
' Bei ENTER - aktuelle Eingabe in die ' ComboBox-Liste aufnehmen Private Sub Combo1_KeyPress(KeyAscii As Integer) ' in ComboListe aufnehmen Dim I As Integer Dim bExists As Boolean With Combo1 If KeyAscii = 13 And .Text <> "" Then ' Prüfen ob bereits vorhanden bExists = False For I = 0 To .ListCount - 1 If .List(I) = .Text Then bExists = True: Exit For End If Next I If Not bExists Then .AddItem .Text .SelStart = 0 .SelLength = 999 End If End With End Sub
Autovervollständigen
Die Autovervollständigungsfunktion haben wir bereits in einem früheren Tipp beschrieben. Hier nochmals der Code:
' Autovervollständigung... Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer) Static sTextOld As String Dim I As Integer Dim sPos As Integer With Combo1 ' nur wenn sich die Eingabe geändert hat If sTextOld <> .Text Then For I = 0 To .ListCount - 1 If .List(I) Like .Text + "*" Then sPos = .SelStart sTextOld = .Text .Text = .List(I) .SelStart = sPos .SelLength = Len(.Text) - sPos + 1 Exit For End If Next I End If End With End Sub
Einträge aus der aufgeklappten ComboBox-Liste löschen
Über die Entf-Taste soll aus der aufgeklappten ComboBox der aktuell markierte Eintrag jederzeit gelöscht werden können. Das Löschen selbst ist kein Problem (RemoveItem). Aber woher wissen wir, wann die ComboBox aufgeklappt ist und wann nicht? Hier unterstützt uns mal wieder das Windows API. Über die SendMessage-Funktion und der Konstanten CB_GETDROPPEDSTATE bekommen wir mitgeteilt, ob die ComboBox aufgeklappt ist oder nicht.
Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer) ' Per "ENTF"-Taste aktuellen Eintrag ' aus der Liste löschen If KeyCode = vbKeyDelete And Combo1.ListIndex >= 0 Then ' ENTF-Taste? ' Ist die ComboBox aufgeklappt? If CBool(SendMessage(Combo1.hwnd, CB_GETDROPPEDSTATE, _ 0, 0)) Then ' aktuellen Eintrag löschen Combo1.RemoveItem Combo1.ListIndex ' Fenster neuzeichnen Me.Refresh End If End If End Sub
Was fehlt jetzt noch? Genau! Das Speichern und Laden des ComboBox-Listinhaltes.
Speichern der ComboBox-Liste
Das Speichern der Liste erfolgt über die Prozedur Combo_Save in Verbindung mit dem Parameter sFilename.
Public Sub Combo_Save(ByVal sFilename As String) ' Inhalt der ComboBox speichern Dim F As Integer Dim I As Integer F = FreeFile Open sFilename For Output As #F With Combo1 For I = 0 To .ListCount - 1 Print #F, .List(I) Next I End With Close #F End Sub
Laden der gespeicherten Liste
Public Sub Combo_Read(ByVal sFilename As String) ' Combo-Inhalt einlesen Dim F As Integer Dim sLine As String With Combo1 ' Combo zunächst leeren .Clear If Dir(sFilename) <> "" Then F = FreeFile Open sFilename For Input As #F While Not EOF(F) Line Input #F, sLine .AddItem sLine Wend Close #F End If End With End Sub
Das war's dann auch schon
Den Aufruf Combo_Read setzt man am einfachsten in das Form_Load-Ereignis. Das Speichern erfolgt dann im Form_Unload-Ereignis.
Option Explicit Dim sFilename As String
Private Sub Form_Load() ' ComboBox-Inhalt einlesen sFilename = App.Path & "\eingabe.dat" Combo_Read sFilename End Sub
Private Sub Form_Unload(Cancel As Integer) ' ComboBox-Inhalt speichern Combo_Save sFilename End Sub