Obtendo busca automática em uma combobox usando API ( SendMessage)


Que tal obter o mesmo efeito da ajuda do Windows: uma busca automática a medida que o texto procurado esta sendo digitado. Vamos mostrar como é fácil obter este resultando para um controle Combobox.

1- Inicie um novo projeto no VB e insira um módulo no seu projeto. Neste módulo inclua o seguinte código. (não esqueça de salvar o módulo)::

Seção General Declarations:

#If Win32 Then
    Declare Function SendMessage Lib "User32" Alias "SendMessageA" _
        (ByVal hWnd As Long, ByVal wMsg As Long, _
         ByVal wParam As Long, lParam As Any) As Long
#Else
    Declare Function SendMessage Lib "User" _
        (ByVal hWnd As Integer, ByVal wMsg As Integer, _
         ByVal wParam As Integer, lParam As Any) As Long
#End If

No formulário do seu projeto inclua um controle combobox (Sorted = True), e um controle commandButton como na figura abaixo. (as labels apenas explicam o projeto)

projeto para para busca automática em uma Combobox

No evento Load do formulário , vamos preencher a combo com alguns nomes aleatórios.

Private Sub Form_Load()
   Combo1.AddItem "Ana Lima"
   Combo1.AddItem "Araujo Duarte"
   Combo1.AddItem "Bruno Ribeiro"
   Combo1.AddItem "Carlos Santos"
   Combo1.AddItem "Carlito Maia"
   Combo1.AddItem "Jussara Barbosa"
   Combo1.AddItem "Jeremias Bueno"
   Combo1.AddItem "Anadir Ribeiro Lima"
   Combo1.AddItem "Arnaldo Soares Duarte"
   Combo1.AddItem "Breno Eduardo Ribeiro"
   Combo1.AddItem "Cinira Lima Santos"
   Combo1.AddItem "Paulo Joghin"
   Combo1.AddItem "Tarcisio Tavares"
   Combo1.AddItem "Jessica Naara"
   Combo1.ListIndex = 0
End Sub

A seguir no evento Keypress da combobox insira o seguinte código:

Private Sub Combo1_KeyPress(KeyAscii As Integer)
    Dim CB As Long
    Dim FindString As String
    Const CB_ERR = (-1)
    Const CB_FINDSTRING = &H14C
    
    If KeyAscii < 32 Or KeyAscii > 127 Then Exit Sub
    
    If Combo1.SelLength = 0 Then
        FindString = Combo1.Text & Chr$(KeyAscii)
    Else
        FindString = Left$(Combo1.Text, Combo1.SelStart) & Chr$(KeyAscii)
    End If
    
    CB = SendMessage(Combo1.hWnd, CB_FINDSTRING, -1, ByVal FindString)
    
    If CB <> CB_ERR Then
        Combo1.ListIndex = CB
        Combo1.SelStart = Len(FindString)
        Combo1.SelLength = Len(Combo1.Text) - Combo1.SelStart
    End If
    KeyAscii = 0
End Sub

O evento click do botão de comando insira o código;

Private Sub Command1_Click()
  Unload Me
  End
End Sub

Ao executar o projeto e digitar os caracteres referentes ao nome que desejamos encontrar é feita uma busca automática na qual é exibida o nome que contém os caracteres digitados. Algo como;

O projeto em tempo de execução

O que uma API não faz . Até a próxima dica...