Автоматический выбор из списка значений 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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.333 из 5
Похожие ответы