Автозаполнение в ComboBox

Здесь можно найти готовые «кирпичики» — части кода, пригодные для построения более крупных проектов, а также решения различных типовых и не очень задач на VB.

Модератор: Brickgroup

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Автозаполнение в ComboBox

Сообщение A.A.Z. » 09.02.2005 (Ср) 22:32

Код: Выделить всё
Private Const CB_FINDSTRING = &H14C&

Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

Sub AutoFillCombo(Combo As ComboBox)
Dim I&, P&
I = SendMessage(Combo.hWnd, CB_FINDSTRING, -1, ByVal Combo.Text) + 1
If I > 0 Then
P = Combo.SelStart
Combo.ListIndex = I - 1
Combo.SelStart = P
Combo.SelLength = Len(Combo.Text) - P
End If
End Sub
Пример использования (нужен ComboBox с именем Combo1):
Код: Выделить всё
Option Explicit

Private Const CB_FINDSTRING = &H14C&

Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hWnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)

Private LastComboKeyAscii&

Sub AutoFillCombo(Combo As ComboBox)
Dim I&, P&
I = SendMessage(Combo.hWnd, CB_FINDSTRING, -1, ByVal Combo.Text) + 1
If I > 0 Then
P = Combo.SelStart
Combo.ListIndex = I - 1
Combo.SelStart = P
Combo.SelLength = Len(Combo.Text) - P
End If
End Sub

Private Sub Combo1_Change()
If Not (LastComboKeyAscii = 8) And Not (LastComboKeyAscii = 46) Then AutoFillCombo Combo1
LastComboKeyAscii = 0
End Sub

Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
LastComboKeyAscii = KeyCode
End Sub

Private Sub Command1_Click()
Combo1.AddItem Text1.Text
End Sub




vbskb_combo vbskb_search vbskb_find vbskb_sample
Последний раз редактировалось A.A.Z. 03.08.2007 (Пт) 23:41, всего редактировалось 1 раз.

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 25.06.2007 (Пн) 10:45

Странно, но при большом количестве записе в БД Access начинает сильно тормозить. Секунд по 10-15 ждёшь каждой буквы...
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.06.2007 (Пн) 10:50

Потому что этот способ не рассчитан на большое количество записей.
И на самом деле крайне редко бывают ситуации, когда в ComboBox нужно загружать больше сотни-другой записей.
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.06.2007 (Пн) 10:52

Изображение

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 01.08.2007 (Ср) 11:55

Дело в том, что мне надо помещать в Combo все населенные пункты, улицы и т.д. разных городов. Их кол-во колеблется в пределах 1000 записей. Вероятно может быть и больше. Значит для этого этот способ не подойдёт?
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 03.08.2007 (Пт) 23:34

Ахренеть... Пришло уведомление на почту об ответе в этом топике... :)
Привет всем :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

:)

Сообщение Rojohn » 04.08.2007 (Сб) 11:18

Ну, пользуясь случаем, хотелось бы спросить аутора, на скольких записях в Combo тестировалось его творение? :roll: :wink:
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 04.08.2007 (Сб) 14:40

Ну, ты знаешь, только что проверил на 10000 элементах - ищет :roll: Может, от чего-то другого зависит? Я, правда, не на БД проверял, а на рандомных числах. Наверно, в этом разница...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 04.08.2007 (Сб) 18:40

Способность искать, разумеется, не теряется. Теряется скорость. Но, Rojohn, ссылку от Тёмыча прочитай.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Re: ...

Сообщение VVitafresh » 04.08.2007 (Сб) 19:02

Rojohn писал(а):Странно, но при большом количестве записе в БД Access начинает сильно тормозить. Секунд по 10-15 ждёшь каждой буквы...

Ну не знаю...
Заполнил комбо из БД фамилиями 10000 записей. Заполнение идет секунд 5-7. А вот поиск при вводе фамилии в заполненом комбо практически мгновенно, никакой потери скорости не наблюдаю.

Что-то ты не то делаешь, видать...
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 04.08.2007 (Сб) 20:08

Да, я думаю, автору вопроса нужно открыть соответствующую тему в форуме, и рассматривать уже конкретно свою проблему :)

Rojohn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 439
Зарегистрирован: 22.06.2005 (Ср) 11:00
Откуда: Moscow city

...

Сообщение Rojohn » 04.08.2007 (Сб) 21:13

Ну незнаю... Попробую проверить всё, что навесил поверх готовой функции. Может и оно тормозит. Там, кроме поиска в Combo, выполняется цепочка из 2-3-х процедур и SQL запрос на сверку с суммарной таблицей, которая может быть и в районе 20000 и больше. Наверное всё в совокупности тормозит. Придётся как-то выкручиваться... Чисто для одного Combo всё работает отлично!

З.ы.: Может позже и подниму вопрос о том, как лучше работать со словарями административно-территориального деления РФ :)
Делитесь опытом и Вам воздастся! Кто разместит полезный код - тому воздастся вдвойне! :)

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 04.08.2007 (Сб) 21:29

Ну вот и выяснили, оказывается, виноват не поиск в комбо, а
цепочка из 2-3-х процедур и SQL запрос на сверку с суммарной таблицей, которая может быть и в районе 20000 и больше
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


Вернуться в Кирпичный завод

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList