powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ComboBox + поиск
7 сообщений из 7, страница 1 из 1
ComboBox + поиск
    #36030966
Nuss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!
Есть ComboBox достаточно длинный, не удобно его весь листать в поисках нужной записи, хотелось бы, чтобы при получении им фокуса и вводе данных с клавиатуры он сам начинал искать с начала последовательность вводимых букв. Как это реализовать?

Спасибо
...
Рейтинг: 0 / 0
ComboBox + поиск
    #36031012
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только создав свой контрол Combobox ты сможешь сделать что-то, а стандартный Combo ни хрена не делает, он очень скромный.
...
Рейтинг: 0 / 0
ComboBox + поиск
    #36031100
FAndrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не фига не скромный. У стандартного комбобокса есть режим при котором он осуществляет поиск по первым вводимым буквам.
MSDN в руки.
...
Рейтинг: 0 / 0
ComboBox + поиск
    #36031140
Фотография fortibransa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FAndrew,

Ну попробуй, по одной вводимой еще как-то прет а дальше уже ...
...
Рейтинг: 0 / 0
ComboBox + поиск
    #36031275
Фотография VladConn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nuss,

ComboBox
...
Рейтинг: 0 / 0
ComboBox + поиск
    #36048561
Быстрый поиск строки в Combo Box

Для быстрого поиска нужной строки в списке, в частности в элементе управления Combo Box, можно использовать функцию API SendMessage() (вариант для 16-разрядных приложений), обеспечивающую более эффективное выполнение программы, чем аналогичный код на VB. Для этого можно, например, прибегнуть к процедуре CBFindString:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Declare Function SendMessage Lib "User" _
  (ByVal hWnd As Integer, ByVal wMsg As Integer, _
  ByVal wParam As Integer, lParam As Any) As Long

Sub CBFindString(ctlEdit As Control, sSearch As String)
  Dim lPos As Long
  Const CB_FINDSTRING = &H40C
  lPos = SendMessage(ctlEdit.hWnd, CB_FINDSTRING,  0 , ByVal sSearch)
  If lPos >= 0  Then ctlEdit.ListIndex = lPos
End Sub
________________________________________________________________________

Создание "автоматического" поля текста

С помощью приведенной здесь программы вы можете создать поле текста (TextBox), аналогичное тем, которые реализованы в последних версиях Microsoft Excel или Internet Explorer. Иными словами, каждый раз, когда вы будете вводить какой-либо текст в это поле, первые буквы строки будут сравниваться с элементами невидимого списка, а затем программа сама определит, как следует дописать данную строку, и сделает это за вас.

Для реализации такого поля текста вначале добавьте окно списка к своей форме и установите его свойство Visible как False. В событии Form_Load заполним это окно списка некоторыми элементами. В реальном приложении добавление новых элементов списка следует осуществлять каждый раз, когда пользователь закончит ввод строки. Поместите на форму элемент управления TextBox и введите следующий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
Option Explicit
 #If Win32 Then  ' 32-разрядная версия VB
   Private Const LB_FINDSTRING = &H18F
   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
 #Else  ' 16-разрядная версия VB
   Private Const WM_USER = &H400
   Private Const LB_FINDSTRING = (WM_USER +  16 )
   Private Declare Function SendMessage Lib _
     "User" (ByVal hWnd As Integer, ByVal wMsg _
     As Integer,  ByVal wParam As Integer, lParam _
     As Any) As Long
 #End If

Private Sub Form_Load()
  List1.AddItem "Апельсин"
  List1.AddItem "Банан"
  List1.AddItem "Яблоко"
  List1.AddItem "Персик"
  List1.AddItem "Ананас"
  List1.AddItem "Авокадо"
End Sub

Private Sub Text1_Change()
  Dim pos As Long
  List1.ListIndex = SendMessage(List1.hWnd, _
    LB_FINDSTRING, - 1 , ByVal CStr(Text1.Text))
  If List1.ListIndex = - 1  Then
    pos = Text1.SelStart
  Else
    pos = Text1.SelStart
    Text1.Text = List1
    Text1.SelStart = pos
    Text1.SelLength = Len(Text1.Text) - pos End If
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
  '
  On Error Resume Next
  If KeyCode =  8  Then ' Backspace
    If Text1.SelLength <>  0  Then
      Text1.Text = Mid$(Text1,  1 , Text1.SelStart -  1 )
      KeyCode =  0 
    End If
  ElseIf KeyCode =  46  Then ' Del
     If Text1.SelLength <>  0  And _
       Text1.SelStart <>  0  Then
       KeyCode =  0 
    End If
  End If
End Sub
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ComboBox + поиск
    #38118358
Kontugenyi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил не создавать новую тему, так название одно и тоже.

Задача у меня такая: Есть combobox, элементами списка которого служит список слов на листе Excel. Но список более 500 слов и листать его весь очень неудобно. Поэтому возникла мысль добавить в combobox поиск: Пользователь набирает часть слова и в выпадающем списке видит все слова, которые содержат введенный им с клавиатуры набор символов. При выборе соответствующего слова данное слово записывается в соответствующую ячейку. В идеале, чтобы комбо-бокс открывался только в каждой 7-й строке первого столбца (там значение для выбора)

Я не программер и с VBA знаком всего 1.5 месяца, поэтому не совсем понимаю как это можно сделать.

У меня получилось что-то типа этого, но работает совсем не так как нужно:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub ComboBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 'процедура срабатывает событие нажатия клавиши с клавиатуры
 Dim n As Integer, str1, str2 As String, a As Integer 'str1 - строка в которой ищем; str2 - искомый набор символов; n - количество строк в списке слов
 ComboBox1.Clear 'очищаем комбо-бокс
 Application.ScreenUpdating = False
 ComboBox1.Text = str2 'сохраняем введенное значение в комбо-бокс в переменную
 For n = 2 To 7 'цикл проверки введенных в комбо-бокс значений на наличие в списке слов. Если слово содержит введенные символы - слово добавляется в список значений комбо-бокс
   str1 = Cells(n, 1).Text
   If InStr(1, str1, str2, vbTextCompare) <> 0 Then ComboBox1.AddItem str1
   Next n
 Application.ScreenUpdating = True
 ComboBox1.DropDown 'открываем список найденных значений в комбо-бокс
End Sub


Модератор: Учимся использовать тэги оформления кода - FAQ , а не вручную код раскрашивать

Проблемы которые вылезли:
1. При вводе части текста для поиска автоматически подставляется предлагаемый вариант в текстовое поле комбо-бокса. Мне этого не нужно.
2. Выпадающий список иногда показывается как одно значение и полоса прокрутки. Нужно чтобы выпадающий список был не более 10 значений, а если более появлялся бы скролл.
3. Поиск работает криво.

Подскажите где у меня недоработки?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ComboBox + поиск
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]