Автоматический выбор из списка значений combobox при ручном вводе с клавиатуры - VB
Формулировка задачи:
Есть такой вопрос. У меня есть заполненный множеством значений combobox. Я хочу чтобы при вводе в ручную с клавиатуры каких-то символов, букв и т.д. содержимое combobox автоматически фильтровалось, и при вводе каждой последующей буквы кол-во вариантов сокращалось, и в конце концов останется один вариант; или если я задам слово, не имеющееся в списке комбобокса то допустимых значений для выбора совсем предложено не будет.
Например, в комбобоксе след. слова:
стол
полет
стрела
лето
кофе
Я ввожу с клавиатуры в текстовом поле комбобокса букву "о". Список значений автоматически сократится до тех слов, в которых есть буква "о", т.е. останутся:
стол
полет
лето
кофе
потом дописываю, например, буквы "л", получаем "ол" и в списке остается только
стол
Но если я стираю символ, например "о", то у меня возвращаются в комбобокс слова содержащие "л", т.е чтобы операция происходила в "обе стороны".
Например, в комбобоксе след. слова:
стол
полет
стрела
лето
кофе
Я ввожу с клавиатуры в текстовом поле комбобокса букву "о". Список значений автоматически сократится до тех слов, в которых есть буква "о", т.е. останутся:
стол
полет
лето
кофе
потом дописываю, например, буквы "л", получаем "ол" и в списке остается только
стол
Но если я стираю символ, например "о", то у меня возвращаются в комбобокс слова содержащие "л", т.е чтобы операция происходила в "обе стороны".
Решение задачи: «Автоматический выбор из списка значений combobox при ручном вводе с клавиатуры»
textual
Листинг программы
Option Explicit
Private Const CB_FINDSTRING = &H14C
Private Const CB_SHOWDROPDOWN = &H14F
Private Const LB_FINDSTRING = &H18F
Private Const CB_ERR = (-1)
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 Sub Combo1_GotFocus()
SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, 1, ByVal 0&
End Sub
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)
Else
FindString = Left$(Combo1.Text, Combo1.SelStart) & Chr$(KeyAscii)
End If
SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, 1, ByVal 0&
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
Else
Combo1.Text = FindString
Combo1.SelStart = Len(FindString)
End If
KeyAscii = 0
End Sub