Newsgroup: it.comp.lang.visual-basic
Titolo: Combobox con autocomplete. Possibile?

Vorrei fare una combobox con autocomplete.
Ossia, man mano che digito caratteri nella combobox, le voci in elenco 
devono essere filtrate in modo che mi rimangono solo quelle che 
contengono quello che io digito.
So scrivere la routine per filtrare le voci, ma non capisco come 
digitare caratteri nella combobox senza che questa mi sposti il cursore!
Ho provato con gli eventi Combo_keydown, Combo_Keyup, Combo_change, ma 
niente.
Qualcuno ha un'idea?
Ho trovato anche un articolo che lo spiega, ma non ho capito come funziona.
Uso VB6!
Grazie

John ha scritto:

Ho dimenticato l'indirizzo dell'articolo
http://www.developer.com/net/vb/article.php/10926_1572321_4

 Uso VB6!
Non vedi che l'esempio è per 
VB.NET
 e che quindi non funziona su vb6?

In un modulo metti questo codice
Public Sub AutoCompleteCombo(Combo1 As ComboBox, KeyAscii As Integer)
    Dim lCnt       As Long 'Generic long counter
    Dim lMax       As Long
    Dim sComboItem As String
    Dim sComboText As String 'Text currently in combobox
    Dim sText      As String 'Text after keypressed
    Dim miSelStart As Integer
    On Error GoTo errore
    miSelStart = Combo1.SelStart 'Set the entry point of the selected text
    If KeyAscii = 13 Or KeyAscii = 27 Then Exit Sub 'Charage Return or
escape
    With Combo1
        lMax = .ListCount - 1 'The number of values in the list
        sComboText = .Text 'The current text in the list
        '**********************************************
        'This block either removes or adds a character
        '***********************************************
        If KeyAscii = 8 Then 'Backspace
            'If there is one character left, remove the text
            If Len(Combo1.Text) = 1 Or Len(Combo1.Text) = 0 Then
                Combo1.Text = ""
                miSelStart = 0
                Exit Sub
            'There is one character and seltext (our matched text)
            ElseIf Len(Combo1.Text) - (Len(Combo1.Text) - miSelStart) = 1
Then
                Combo1.Text = ""
                miSelStart = 0
                Exit Sub
            End If
            'An ordinary backspace, decrement 1 character
            Combo1.Text = Left(sComboText, miSelStart - 1)
            sText = Left(sComboText, miSelStart - 1) 'reset our sText var
sText = combo1.text??
        Else
            'A char other than backspace, return or escape was pressed
            sText = Left(sComboText, miSelStart) & Chr(KeyAscii) 'Increment
our string with the new char
        End If
        KeyAscii = 0 'Reset key pressed
        '**********************************************
        'This block performs our lookup
        '**********************************************
        For lCnt = 0 To lMax
            sComboItem = .List(lCnt) 'Current item
            If UCase(sText) = UCase(Left(sComboItem, _
                                         Len(sText))) Then 'A match was
found
                '.ListIndex = lCnt 'Not sure why this is needed
                .Text = sComboItem
                .SelStart = Len(sText) 'Start the highlighting after
manually entered text
                .SelLength = Len(sComboItem) - (Len(sText)) 'Highlight to
the end of the text
                Exit For
            Else
                .Text = sText 'Set the text value = the new text
                .SelStart = Len(.Text) 'Set selstart to the end of the
string
            End If
        Next 'lCnt
    End With
Exit Sub
errore:
    If Err.Number <> 5 Then
        msgbox "E' avvenuto un errore: " & Err.Number & " " &
Err.Description
    End If
End Sub
E lo richiami con:
Private Sub Combo1_KeyPress(KeyAscii As Integer)
 Call AutoCompleteCombo(Combo1, KeyAscii)
End Sub
bye
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
Gestione Ottica - Gestionale per Ottici e Programmi Gratuiti su:
http://www.nicolaottomano.it

 Vorrei fare una combobox con autocomplete.
Dai un occhio a questo
http://support.microsoft.com/default.aspx?scid=kb;en-us;154076
Ciao
--
Math Parser : 
http://www.neodatatype.net
FlowChart   : 
http://www.neodatatype.net/dump/flowchart/dir.asp
Sito Comune : 
http://www.it-lang-vb.net

Zanna ha scritto:
Vorrei fare una combobox con autocomplete, uguale a quella della 
finestra Start/Esegui,
cioè man mano che si digitano i caratteri, in elenco devono comparire 
solo gli elementi
che contengono quello che io ho digitato.
Finora quello che ho trovato in rete non è soddisfacente, perchè in 
nessun esempio c'è il filtro, ma nella combo resta sempre l'intero elenco.
E' possibile filtrare questo benedetto elenco?
Grazie


 Grazie
Ho scritto questo, ma ancora manca qualcosa e cioè che quando io clicco 
per fare il dropdown il Combo1.text mi cambia con il primo elemento 
dell'elenco invece di rimanere quello che io avevo digitato.
Come si fa a riportare il Combo1.text come prima?
Grazie
Dim A(20) As String
Private Sub Combo1_DropDown()
For P = 1 To Combo1.ListCount: Combo1.RemoveItem (Combo1.ListCount - 1): 
Next P
For P = 1 To List1.ListCount: Combo1.AddItem List1.List(P - 1): Next P
End Sub
Private Sub Combo1_KeyUp(KeyCode As Integer, Shift As Integer)
List1.Clear: For P = 1 To 11
If Left(A(P), Len(Combo1.Text)) = Combo1.Text Then List1.AddItem A(P)
Next P
End Sub
Private Sub Form_Load()
A(1) = "ciao"
A(2) = "ciccao"
A(3) = "cssiao"
A(4) = "acgiao"
A(5) = "cfiao"
A(6) = "ciggao"
A(7) = "cikkao"
A(8) = "caciao"
A(9) = "deiao"
A(10) = "weiao"
A(11) = "dao"
End Sub