Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0286: ComboBox mit Autocompletefunktion II

 von 

Beschreibung 

Hier ein Beispiel, wie man sehr effektiv und schnell eine Combobox mit Autocomplete versieht. Es wird nicht die ganze Liste mittels VB-Code und Instr durchsucht, sondern die interne FindString der Combobox verwendet. (Vgl. Tipp 142)

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

SendMessageA (SendMessage)

Download:

Download des Beispielprojektes [2,35 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 ComboAutoComplete.vbp  --------
'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Kombinationsliste "Combo1"

' Autor: Stefan Maag <maag@odn.de>

Option Explicit

Private Declare Function SendMessage Lib "user32" _
    Alias "SendMessageA" ( _
    ByVal hwnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, _
    lParam As Any) As Long

Private Const WM_SETREDRAW As Long = &HB&

Private Const CB_OKAY As Long = 0&
Private Const CB_ERR As Long = -1&
Private Const CB_ERRSPACE As Long = -2&

Private Const CB_FINDSTRING As Long = &H14C&
Private Const CB_SELECTSTRING As Long = &H14D&
Private Const CB_FINDSTRINGEXACT As Long = &H158&


Sub Form_load()
    Dim I As Long
    
    ' ComboBox mit Monaten fuellen
    For I = 1 To 12
        Combo1.AddItem MonthName(I)
    Next
End Sub

Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer)
   
   Dim lLen As Long
   Dim Res As Long
   
   ' Eingaben nur für Zahlen und Buchstapen prüfen
   If KeyCode >= vbKey0 And KeyCode <= vbKeyZ Then
      
      ' der ByVal Aufruf des Suchstrings ist eine Eigenheit von Windows/VB
      ' bezüglich der Stringpointer. Nur so wird ein gültiger Pointer auf den
      ' String übergeben. Ohne ByVal geht's nicht!!!
      
      With Combo1
         ' Eintrag suchen: Die CB_SELECTSTRING Message ist dafür ungeignet,
         ' da sie den String sofort einträgt und komplett markiert
         
         Res = SendMessage(.hwnd, CB_FINDSTRING, -1, ByVal .Text)
   
         If Res >= 0 Then     ' Eintrag gefunden
            'Call SendMessage(.hwnd, WM_SETREDRAW, False, 0&)
            lLen = Len(.Text)  ' Laenge des eingegeben Textes
            .ListIndex = Res   ' Listindex auf gefunden Text setzen
            .Text = .List(Res) ' gefunden Text in Textfeld eintragen
            .SelStart = lLen   ' Textende markieren, damit es bei neuer Eingabe
                               ' gleich wieder gelöscht wird
            .SelLength = Len(.Text) - lLen
            'Call SendMessage(.hwnd, WM_SETREDRAW, True, 0&)
         End If
      End With
   End If
End Sub

'---------- Ende Formular "Form1" alias Form1.frm  ----------
'--------- Ende Projektdatei ComboAutoComplete.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 1 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 Sabine am 01.03.2005 um 16:58

Genau so etwas suche ich für eine Textbox. Ich wollte eine Textbox machen und darunter eine ListBox wo alle Einträge der DB angezeigt werden. WEnn ich dann in die Textbox was eintrage, dann soll die Markierung auf solch einen Eintrag springen

Gruss