* VB-CODE (1)
Tip 115: Performing Smart Searches in Combo Box Controls

July 1, 1995

The Combo Box control in Microsoft® Visual Basic® allows your user to easily
select items by clicking the desired entry in the control. This article explains
how you can add a smart search feature to the Combo Box control.

Searching Combo Box Controls Quickly
In a Microsoft® Visual Basic® application, you can use a Combo Box control to
provide a list of items that the user can select from. If the desired item is not
in the Combo Box control, the user can also add an additional item to the list.

The drop-down style of a Combo Box control appears only as a single Text Box
control with a separate arrow button to the right of the box. Clicking the arrow
causes the box to drop down so that the user can see the actual entries stored in
the Combo Box control.
If the number of entries in the Combo Box control is relatively small, the user
is able to quickly locate the desired item. However, if there are many entries in
the list, scrolling through the entire list may not be the most efficient method
for the user to find a specific item. In this situation, it would be much quicker
to allow the user to perform a "smart search" for the desired item.

A smart search means that the user can type the first few letters of an entry,
and the first entry in the list that matches these characters will be displayed
in the edit portion of the Combo Box control.
The example program below shows how to implement a smart search routine in your
Visual Basic application . The trick to doing this search lies in the KeyPress
event of the Combo Box control.
Each time the user presses a key on the keyboard, the KeyPress event is
triggered. These keystrokes can be trapped and acted upon in whatever fashion you
want. As an example, in the smart search routine we automatically ignore all
keyboard characters that have an ASCII value of less than 32 or greater than
127. This lets us process only alphabetic characters (AZ, az), numeric characters
(09), and punctuation characters (exclamation point, comma, and so forth).

It is a simple matter to save the characters that the user types to a string
variable such as FindString and then to use the Microsoft Windows® application
programming interface (API) SendMessage function to execute a CB_FINDSTRING
message to the Combo Box control.
The CB_FINDSTRING message lets you search a Combo Box control for an entry that
matches the target string. This function requires two argumentsthe number of the
item in the control from which you want the search to start, and the string you
want to find. To search the entire Combo Box control, you set the first argument
to a value of -1.

After you have executed the CB_FINDSTRING message, it will return the number of
the matching entry. You can then use this to display the result to the user in
the edit portion of the Combo Box control.

Example Program
This program shows how to perform a "smart search" with a Combo Box control.

 1. Create a new project in Visual Basic. Form1 is created by default.
 2. Add the following Constant and Declare statements to the General Declarations
    section of Form1 (note that the Declare statement must be typed as a single
    line of code):

Private Declare Function SendMessage Lib "User" (ByVal hWnd As Integer, ByVal
   wMsg As Integer, ByVal wParam As Integer, lParam As Any) As Long
Const CB_ERR = (-1)
Const WM_USER = &H400

 3. Add the following code to the Form_Load event for Form1:

Private Sub Form_Load()
    Combo1.AddItem "French fries"
    Combo1.AddItem "Hamburgers"
    Combo1.AddItem "Milkshakes"
    Combo1.AddItem "Onion rings"
    Combo1.AddItem "Ice"
    Combo1.AddItem "Ice cream"
End Sub

 4. Add a Combo Box control to Form1. Combo1 is created by default. Set its Style
    property to 0-Dropdown.
 5. Add the following code to the KeyPress event for Combo1:

Private Sub Combo1_KeyPress(KeyAscii As Integer)
    Dim CB As Long
    Dim FindString As String

    If KeyAscii < 32 Or KeyAscii > 127 Then Exit Sub

    If Combo1.SelLength = 0 Then
        FindString = Combo1.Text & Chr$(KeyAscii)
        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

Run the example program by pressing F5. Type the text you want to find. As you
enter each character, the KeyPress event is triggered. For example, type the
letter i. The item ice appears in the Combo Box's edit window. Try again, this
time typing the word ice followed by a space character. The Combo Box displays
ice cream. Try typing a word that is not in the list, such as potato. The Combo
Box will respond by finding the closest matchin this case, the Onion rings entry.

Additional References
"Using List Boxes and Combo Boxes." (Development Library, Product Documentation,
   Languages, Visual Basic 4.0 Professional and Enterprise Editions,
   Programmer's Guide)
"SendMessage." (Development Library, Product Documentation, SDKs,
   Windows 3.1 SDK, Programmer's Reference Volume 2: Functions)