FoxPro Club Главная

Конференция Решения Фотоальбом Сайт М.Дроздова Статьи Файловый архив Книга Visual FoxPro 9.0 Русский Help для Visual FoxPro
Пользователей: 9173
Вход
Поиск в ComboBox

Очень часто ипользуется выбор значения из справочника с помощью ComboBox, но инкрементный поиск позволяет перейти к нужному значению по первой букве или буквам. Я хочу предложить другое решение поиск по любому сочетанию букв по первым, по вхождению с выводом списка удовлетворяющих значений в выпадающем списке.


 
Прислал: Vanka   Категория: Интерфейс


Поиск в ComboBox

Идею по созданию данного класса подсказал Internet Explorer.При наборе адреса
сайта Explorer выдает список совпадающий по первым с вводимым адресом. Идея
была хорошая и решил я ее применить в своих проектах для выбора значений из
справочников.
И вот просмотрев всю документацию по Combobox я создал данный класс.

Для его использования необходимо определить следующие свойства:

IncrementalSearch - определяет возможность поиска (.T. - поиск разрешен, .F. -
поиск запрещен)
RowSource - определяет источник данных. Источником данных всегда является SQl
команда которая выбирает значения для выбора их из Combo.
cNmTexAlias - определяет наименование курсора в которое выбираются данные с
помощью SQL-Select'а, чтобы при закрытии Destroy объекта закрыть
открытый в данный момент курсор (т.е. убираем мусор за собой)
сSrchRowSource - данное свойство управляет поиском, здесь и можно определить
как искать введенное выражение по первым буквам или любое
совпадение символов. Поиск построен с использованием LIKE
SELECT-SQL поэтому действуют все правила для LIKE.

Примеры значений свойств:
1. Поиск по первым символам

RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR
TexSrch"
сSrchRowSource="THIS.cOldRowSource+' WHERE UPPER(name) LIKE ['+;
UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;
THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"
cNmTexAlias="TexSrch"

2. Любое совпадение символов

RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR
TexSrch"
сSrchRowSource="THIS.cOldRowSource+' WHERE UPPER(name) LIKE [%'+;
UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;
THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"
cNmTexAlias="TexSrch"

3. Выбор значений из основной таблицы по определенным условиям.

RowSource="SELECT name, id, UPPER(name) FROM S_pred ORDER BY 3 INTO CURSOR
TexSrch WHERE Group="1""
сSrchRowSource="THIS.cOldRowSource+' AND UPPER(name) LIKE [%'+;
UPPER(THIS.cLocateExpression)+'%] UNION SELECT ['+;
THIS.DisplayValue+'], ['+THIS.Value+'], CHR(0) FROM TexCboSearch '"
cNmTexAlias="TexSrch"
** Следует обратить внимание что WHERE располагается в конце SELECT-SQL, а
всвойстве WHERE заменяется на AND. Будьте внимательны, т.к. используется в
коде макроподстановка.

P.S. И еще одно замечание, если необходимо из основной таблицы выбирать больше
полей то в свойство cSrchRowSource необходимо указать CHR(0) или другое
выражение чтобы правильно работал UNION.
Ну и последнее обязательно определяйте ORDER BY по отдельной строке иначе
введенное поисковое выражение не будет располагаться в верхней строке.

Все замечания, пожелания и вопросы присылайте на E-mail.

С наилучшими пожеланиями.

Иван Олейник.
E-mail: oleynik99@mail.ru

 
Сделайте оценку этого решения Плохо Удовлетворительно Так себе Хорошо Отлично Текущая оценка: (4.764) Вложение [107.43]kb
Дополнения пользователей
Поиск в ComboBox
[+][?]
Kaiser
13.04.06 14:47:30

Немного изменил под себя, но в целом мне понравилось решение, простое и удобное.
Спасибо.
Kaiser
13.04.06 15:27:15

Немного изменил под себя, но в целом мне понравилось решение, простое и удобное.
Спасибо.
Kaiser
13.04.06 15:27:26

Немного изменил под себя, но в целом мне понравилось решение, простое и удобное.
Спасибо.
serjo123
15.06.06 16:45:50

Изумительная штука, действительно то что надо, без лишних контролов и т.п. Большое спасибо автору,
решение выручило в минуту когда действительно было срочно надо а своё писать нет времени.
Для большего удобства в классе cbosearch  метод KeyPress  вынес в отдельный новый метод
NewKeyPress, а в KeyPress вызов NewKeyPress, дабы если понадобится добавить что-то своё конкретное
для текущего объекта, то переопределённый метод уже не вызовется, а вынесев это сделать можно ИМХО
Автору творческих успехов и удачи по жизни :-)
serjo123
16.06.06 15:28:56

Изумительная штука, действительно то что надо, без лишних контролов и т.п. Большое спасибо автору,
решение выручило в минуту когда действительно было срочно надо а своё писать нет времени.
Для большего удобства в классе cbosearch  метод KeyPress  вынес в отдельный новый метод
NewKeyPress, а в KeyPress вызов NewKeyPress, дабы если понадобится добавить что-то своё конкретное
для текущего объекта, то переопределённый метод уже не вызовется, а вынесев это сделать можно ИМХО
Автору творческих успехов и удачи по жизни :-)
serjo123
16.06.06 15:29:05

Изумительная штука, действительно то что надо, без лишних контролов и т.п. Большое спасибо автору,
решение выручило в минуту когда действительно было срочно надо а своё писать нет времени.
Для большего удобства в классе cbosearch  метод KeyPress  вынес в отдельный новый метод
NewKeyPress, а в KeyPress вызов NewKeyPress, дабы если понадобится добавить что-то своё конкретное
для текущего объекта, то переопределённый метод уже не вызовется, а вынесев это сделать можно ИМХО
Автору творческих успехов и удачи по жизни :-)
[Дополнить]



© 2000-2017 Fox Club 
При размещении любых материалов с сайта на других ресурсах- прямая ссылка на www.foxclub.ru обязательна
Яндекс.Метрика