Newsgroup: it.comp.lang.visual-basic
Titolo: [vb6] Problemi con autocomplete

salve a tutti, mi sono creato questa funzione che mi fa l'autocomplete 
ad una datacombo..
carico questa funzione all'evento change della datacombo ma mi da una 
serie di bug:
primo fra tutti la funzione me la richiama una volta si e una no e 
così via via..
L'altro grosso problema è che quando scrivo nella datacombo mi 
sparisce il puntatore, lampeggia ogni volta che digito nella combo, se 
scrivo una parola lunga addirittura mi si toglie il block num dalla 
tastiera.. è dovuto al continuo cambio di source??
Ecco la funzione:
Public Function AutoComplete(RecordSet As ADODB.RecordSet, Connection_ 
_As ADODB.Connection, Combo As DataCombo, Colonna As String)
With Form1
Lunghezza = Len(Combo.Text)
Testo = UCase(Trim(Combo.Text))
     If Lunghezza <> 0 Then
        RecordSet.Close
        Source = "SELECT * FROM " & Colonna & " WHERE " & Colonna & " 
LIKE UCASE('" & Testo & "%') ORDER BY " & Colonna
        RecordSet.Open Source, Connection, 1, 3
        Set Combo.RowSource = RecordSet
 
        If Not (RecordSet.BOF And RecordSet.EOF) Then
                SendKeys "%{DOWN}"
            Else
                SendKeys "{ESC}"
        End If
        Combo.SelStart = Len(Combo)
    Else
        RecordSet.Close
        Source = "SELECT * FROM " & Colonna & " ORDER BY " & Colonna
        RecordSet.Open Source, Connection, 1, 3
        Set Combo.RowSource = RecordSet
    End If
End With
End Function
Grazie mille ragazzi.. sto sclerando dietro questa funzione..
Inviato da 
www.mynewsgate.net

 tastiera.. č dovuto al continuo cambio di source??

Io faccio cosě:
Sub PuntaComboBox(cbo As ComboBox, KeyAscii As Integer)
Dim sBuffer As String
Dim lRetVal As Long
sBuffer = Left(cbo.Text, cbo.SelStart) & Chr(KeyAscii)
lRetVal = SendMessage((cbo.hwnd), CB_FINDSTRING, -1, ByVal sBuffer)
If lRetVal <> CB_ERR Then
  cbo.ListIndex = lRetVal
  cbo.Text = cbo.List(lRetVal)
  cbo.SelStart = Len(sBuffer)
  cbo.SelLength = Len(cbo.Text)
  KeyAscii = 0
End If
End Sub
Questa funzione la devi richiamare dall'evento KeyPress della combo dove hai
precedentemente caricato tutti i dati.
Ciao
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

ho fatto così ma mi da errore nel sendmessage:
Dim sBuffer As String
Dim lRetVal As Long
sBuffer = Left(cbo.Text, cbo.SelStart) & Chr(KeyAscii)
lRetVal = SendMessage((cbo.hWnd), CB_FINDSTRING, -1, ByVal sBuffer)
If lRetVal <> CB_ERR Then
  cbo.ListIndex = lRetVal
  cbo.Text = cbo.List(lRetVal)
  cbo.SelStart = Len(sBuffer)
  cbo.SelLength = Len(cbo.Text)
  KeyAscii = 0
End If
grazie
Inviato da 
www.mynewsgate.net

ops era così:
Private Sub DataCombo1_KeyPress(KeyAscii As Integer)
Dim sBuffer As String
Dim lRetVal As Long
sBuffer = Left(DataCombo1.Text, DataCombo1.SelStart) & Chr(KeyAscii)
lRetVal = SendMessage((DataCombo1.hWnd), CB_FINDSTRING, -1, ByVal sBuffer)
If lRetVal <> CB_ERR Then
  DataCombo1.ListIndex = lRetVal
  DataCombo1.Text = DataCombo1.List(lRetVal)
  DataCombo1.SelStart = Len(sBuffer)
  DataCombo1.SelLength = Len(DataCombo1.Text)
  KeyAscii = 0
End If
End Sub
 mi da errore nel sendmessage
Inviato da 
www.mynewsgate.net

solo adesso ho visto che stai usando una combo..
Inviato da 
www.mynewsgate.net

 tastiera.. è dovuto al continuo cambio di source??
Checchè ne dica la MS, è un bug conosciuto di SendKeys.
Se appena puoi evitalo.
Bye, G.

persiste l'errore nel sendmessage.. te la sei create te la funzione 
sendmessage? (mai usata)
Private Sub Combo1_KeyPress(KeyAscii As Integer)
Dim sBuffer As String
Dim lRetVal As Long
sBuffer = Left(cbo.Text, cbo.SelStart) & Chr(KeyAscii)
lRetVal = SendMessage((cbo.hWnd), CB_FINDSTRING, -1, ByVal sBuffer)
If lRetVal <> CB_ERR Then
  cbo.ListIndex = lRetVal
  cbo.Text = cbo.List(lRetVal)
  cbo.SelStart = Len(sBuffer)
  cbo.SelLength = Len(cbo.Text)
  KeyAscii = 0
End If
End Sub
Inviato da 
www.mynewsgate.net

grazie mille, non la sapevo questa.. conosci un altro metodo per aprirmi 
la datacombo??
Inviato da 
www.mynewsgate.net


La SendMessage č una funzione delle API di Windows
In un modulo devi dichiarare:
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As
Long
' Costanti per puntare ComboBox
Public Const CB_ERR = -1
Public Const CB_FINDSTRING = &H14C


ok. grazie.. non funge ma è lo stesso.. così ero gia in grado di farla.. io 
volevo farla con la datacombo che si aprisse e tutto proprio come 
l'autocomplete dell'explorer
ciao
Inviato da 
www.mynewsgate.net