Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0142: ComboBox mit Autocompletefunktion

 von 

Beschreibung 

Hier wird gezeigt sich die Texteingabe einer ComboBox, bekannt z.B. aus der IE-Adressleiste, aus einer vorgebenen Liste selbst vervollständigt.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

keine

Download:

Download des Beispielprojektes [2,07 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Project1.vbp -------------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Kombinationsliste "Combo1"
' Steuerelement: Beschriftungsfeld "Label1"

Option Explicit

Dim Backspaced As Boolean

Private Sub Form_Load()
  Dim X%
  
    With Combo1
      .AddItem "Achim"
      .AddItem "Adelheid"
      .AddItem "Adolf"
      .AddItem "Alfred"
      .AddItem "Anette"
      .AddItem "Anika"
      .AddItem "Anke"
      .AddItem "Anne"
      .AddItem "Anton"
      .AddItem "Arabella"
      .AddItem "Armin"
      .AddItem "Arne"
      .AddItem "August"
    End With
    
    With Label1
      .Caption = "Zur Auswahl stehende Namen:" & vbCrLf
      .Caption = .Caption & String$(50, "-") & vbCrLf
      For X = 0 To Combo1.ListCount - 1
        .Caption = .Caption & Combo1.List(X) & vbCrLf
      Next X
    End With
End Sub

Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
  If KeyCode = vbKeyBack Or KeyCode = vbKeyDelete Then
    If Combo1.Text <> "" Then Backspaced = True
  End If
End Sub

Private Sub Combo1_Change()
  Dim X%, Pos&
  
    With Combo1
      If Backspaced = True Or .Text = "" Then
        Backspaced = False
      Else
        For X = 0 To .ListCount - 1
          If InStr(1, .List(X), .Text) <> 0 Then
            Pos = .SelStart
            .Text = .List(X)
            .SelStart = Pos
            .SelLength = Len(.Text) - Pos
            Exit For
          End If
        Next X
      End If
    End With
End Sub
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Project1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 10 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von GDMaster am 14.01.2010 um 13:18

Bei mir funktioniert der code einwandfrei.
Des einzigste ist, dass ich empfehle die globale Variable backspaced zu ersetzen und zwar durch die Eigenschaft Tag.
Am besten, ihr schreibt in eure Combobox in den Tag False. Dann müsst ihr noch die Deklaration entfernen und alle backspaced durch combo1.Tag ersetzen. Natürlich müss combo1 eure Combobox sein:-)

Kommentar von Frank Vosseler am 28.12.2002 um 10:40

Hab grad zwei Fehler gesehen ;-)

If Index = 0 Then geaendert(4) = "Sie haben den Lieferant geändert."

Diese Zeile gehört natürlich nicht dazu!

Außerdem habe ich hier Indexfelder verwendet was Ihr hier nicht habt!
SORRY! Einfach nur die Zeile austauschen und gut iss.
Statt:
If InStr(1, .List(X), .Text) <> 0 Then

diese hier:
If Left$(UCase(.List(X)), Len(.Text)) = Left$(UCase(.Text), Len(.Text)) Then

einfügen.

Have fun!

Kommentar von Frank Vosseler am 28.12.2002 um 10:37

HI! Wenn Ihr folgende Combo_Change verwendet (es wurde nur eine Zeile geändert, aber so ist es halt einfacher einzufügen und zu verwenden) dann funktioniert die sofrtierung (siehe Matthias Thelker, 22.1.2001) und es wird bei meiner Änderung auch nciht zwischen klein/Großbuchstaben Unterschieden.
Die geänderte Zeile ist:

If Left$(UCase(.List(X)), Len(.Text)) = Left$(UCase(.Text), Len(.Text)) Then

Oder hier nochmal alles.

Have fun!
mfg Frank Vosseler


Private Sub Combo1_Change(Index As Integer)
If Index = 0 Then geaendert(4) = "Sie haben den Lieferant geändert."
Dim X%, Pos&
With Combo1(0)
If backspaced = True Or .Text = "" Then
backspaced = False
Else
For X = 0 To .ListCount - 1
If Left$(UCase(.List(X)), Len(.Text)) = Left$(UCase(.Text), Len(.Text)) Then
Pos = .SelStart
.Text = .List(X)
.SelStart = Pos
.SelLength = Len(.Text) - Pos
Exit For
End If
Next X
End If
End With

End Sub

Kommentar von NSchmidi am 13.12.2002 um 13:15

Hallo,
dieser Tip fkt. ja super, wenn nur Namen mit dem Anfangsbuchstabe "A" im Combo sind.
Probleme gibts aber, wenn auch z.B. Namen mit "B" im Combo sind.
Dann tritt folgendes Problem auf:
Also, wenn ich dann als 1. Buchstaben B eintippe, dann stellt das Programm den Index des Combo auf den ersten Text im Combo in dem ein "B" enthalten ist.

Kommentar von Sven Reinert am 16.10.2002 um 11:11

Also.. Ich habe das jetzt so gemacht und es funktioniert einwndfrei.. ich habe jetzt aber noch einn kleinen Verbesserungsvorschlag... Es wäre sehr geschickt wenn das Feld auch vervollständigt werden würde unabhängig von groß und klein Schreibung..

Kommentar von Jürgen am 24.05.2002 um 05:26

Funktioniert nicht bei Style = 2-Dropdown-Liste unter VB5

Kommentar von Claudio am 06.05.2002 um 00:11

Hallo, hier eine Alternativversion mit SendMessage aus der API.
Sub AutoComplete(cbo As VB.ComboBox)
Dim back As Variant
Dim intPos As Integer
With cbo
intPos = .SelStart
back = SendMessage(.hwnd, CB_FINDSTRING, 0, ByVal .Text)
If back -1 Then
.Text = .List(back)
.SelStart = intPos
.SelLength = Len(.Text) - intPos
End If
End With
End Sub
PS. Ich glaube, ihr könnt euch die erste If-Verzweigung in Combo1_Change-Prozedur schenken, wenn ihr die Key_Down-Prozedur so fasst:
m_blnBackspace = (KeyCode = vbKeyBack) Or (KeyCode = vbKeyDelete)

Kommentar von Thomas am 11.12.2001 um 00:25

Es gibt ein Problem bei diesem Programm. Und zwar, dass die Change Funktion 2x ausgeführt wird. Das ist nicht gut! Wie kann man das unterdrücken? Gibt es ein gegenstück zu RaiseEvent?
MfG
Thomas

Kommentar von Humbrie am 04.06.2001 um 18:09

Also, das was mathias da schreibt stimmt.So wie der Tip da steht, funktioniert er nicht richtig. Aber wenn man die Zeile ersetzt klappts!

Kommentar von Mathias Thelker am 22.01.2001 um 08:36

Hallo,
ich programmiere zwar noch nicht lange in VB, aber mir ist aufgefallen, daß, wenn die ComboBox unsortiert gefüllt wird und sie die Eigenschaft "sorted=treu" besitzt, der "Autocomplete"-Tip nicht funktioniert. Warum aber nicht die Zeile
If InStr(1, .List(X), .Text) 0 Then
durch
If Left$(.List(X), Len(.Text)) = Left$(.Text, Len(.Text)) Then
ersetzen ?
Ich hoffe, ich habe da alles bedacht, aber es scheint zu klappen...
MfG
Mathias