vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück
Rubrik: Controls · ComboBox   |   VB-Versionen: VB4, VB5, VB628.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 OtterBewertung:     [ Jetzt bewerten ]Views:  27.523 
www.tools4vb.deSystem:  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

Dieser Tipp wurde bereits 27.523 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
   

Druckansicht Druckansicht Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel