Фильтрация в t*dropdown*

Вопросы программирования и использования MSEide + MSEgui.

Модератор: Модераторы

t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Фильтрация в t*dropdown*

Сообщение t-ea »

Как в полях, имеющих выпадающий список (tdropdownlisteditdb, tenumeditdb и т.п.), при вводе символов отфильтровывать значение выпадающего списка?

На примере приложенного изображения:
Как сделать чтобы при вводе в tdropdownlisteditdb символов "Мос" из выпадающего списка исчезала строчка с Ярославлем?
Вложения
dropdown-need.png
dropdown-need.png (4.38 КБ) 37113 просмотров
dropdown.png
dropdown.png (3.75 КБ) 37113 просмотров
Последний раз редактировалось t-ea 24.08.2013 12:17:47, всего редактировалось 2 раза.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Легко делается на списках, увязанных на LOOKUPBUFFERы. Тогда можно назначить коллбэк на DROPDOWN.OnFilter, ниже - пример кода такого обработчика :

Код: Выделить всё

procedure tform6editfo.officecodefilter(const sender: tcustomlookupbuffer;
               const physindex: Integer; var valid: Boolean);
begin
 if form6viewfo.fldOfficeType.isnull
  then valid:= false
 else
  valid:= sender.integervalue[0,physindex] = form6viewfo.fldOfficeType.value;
end;


Методы лукап-буфферов подробно расписаны (Вашим покорным слугой) в MSEUNIVERSE :

Код: Выделить всё

mseuniverse\attic\msedocumenting\mse\trunk\help\doc\msehelp.txt
mse
новенький
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Сообщение mse »

Another possibility is to use TDataset.OnFilterRecord with t*editdb. Though using t*editlb.onfilter and a tdblookupbuffer or a tsqllookupbuffer as debi12345 writes is more recommended.
t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Сообщение t-ea »

От меня что-то скрывают. :lol:

Я пробовал, и c lookupbuffer, и с OnFilter, но ничего не получалось.
Сейчас ещё раз попробовал, и опять не фильтрует так, как я хочу.

Вот прикладываю, то на чём тренируюсь. Можете подсказать, где и что надо дописать?
Вложения
test.zip
(8.39 КБ) 839 скачиваний
mse
новенький
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Сообщение mse »

I don't understand the example, sorry. Can you write what you want to achieve, maybe there is a better solution?
Some comments:
- You use ddLB1.Text. Maybe you should use t*edit.value instead? t*edit.text changes by every key stroke so the filter condition changes while the dropdownlist already has been showed, that probably will not work reliable.
- You use ddDB1.ontextedited to switch dataset.filtered state. ontextedited fires by every keystroke so the filtered state changes while the dropdownlist already has been showed, that probably will not work reliable.
- You use the deprecated tmsememdataset, please use tlocaldataset instead.
t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Сообщение t-ea »

mse писал(а):- You use the deprecated tmsememdataset, please use tlocaldataset instead.

Это только для этого примера, для своей программы я использую tsqlquery.

mse писал(а):- You use ddDB1.ontextedited to switch dataset.filtered state. ontextedited fires by every keystroke so the filtered state changes while the dropdownlist already has been showed, that probably will not work reliable.

Вот-вот, а мне и надо, чтобы dropdownlist сокращался по мере ввода. То есть, на каждый ввод символа dropdownlist фильтровался.

Я ввёл 'м', dropdownlist = ['москва', 'мурманск']
Я ввёл 'а' (ddDB1.Text = 'ма'), dropdonwlist сократился до ['мурманск'].
mse
новенький
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Сообщение mse »

Ouch, this is complicated. Do you really need it? Did you notice that the row cursor in the dropdownlist automatically follows the entered text?
t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Сообщение t-ea »

mse писал(а):Do you really need it?

Да.

Например, в моём списке находятся:

"Отдел УФМС России по Волгоградской области в Кировском районе …"
"Отдел УФМС России по Волгоградской области в Тракторозаводском районе …"
"Отдел УФМС России по Воронежской области в Россошанском районе …"

То же самое с "Территориальный пункт ОУФМС России по …".
Различия между ними начинаются только с 20-го, 30-го, 50-го символов. И таких "Отделов УФМС…", "ОУФМС…" очень много, они не все даже помещаются в dropdownlist.

Также, в базу могут занести "ОВД" вместо "Отдел внутренних дел", "гор." вместо "г." и наоборот.
В итоге между возможными правильными наименованиями может быть много лишних записей.

А так я ввёл "мур" и в списке у меня остались только "ОУФМС Мурманска", "Мурманский ОУФМС" и ещё какой-нибудь "Муром".
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

It seems that T-e-a wants automatic fultering as well, not only the selection adjustment.
mse
новенький
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Сообщение mse »

Then probably it is better to use a tdropdownwidgetedit and to implement the searching and filtering independent of the existing left to right character locating in tdropdownlistcontroller. I'll try to make an example.
Последний раз редактировалось mse 22.08.2013 14:39:22, всего редактировалось 1 раз.
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Will it be applicable for DB-supplied datasets ?
mse
новенький
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

Сообщение mse »

Or t*lookupbuffer.
t-ea
новенький
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

Сообщение t-ea »

А если просто добавить какую-нибудь процедуру которая позволяла бы заново вызывать OnFilter ?
То есть, у меня был бы обработчик

Код: Выделить всё

procedure tmainfo.OnTextEditedDropdownListEditLB(const sender: tcustomedit;
               var atext: msestring);
begin

 DoAgainOnFilter;
end;
Аватара пользователя
debi12345
долгожитель
Сообщения: 5761
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Сообщение debi12345 »

Мартин умеет находить идеальные (а не компромиссные) решения - и сейчас как всегда придумает что нибудь убивающее всех "зайцев" :)
Аватара пользователя
amateur
энтузиаст
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Сообщение amateur »

есть делфи вариант http://stackoverflow.com/questions/6667054/how-can-i-filter-the-contents-of-a-combo-box-based-on-whats-been-typed

Что мешает Вам самим организовать подобный фильтр. Ведь смысл прост. Держим два списка. Из одного тянем что надо, второй показывает.
Ответить