Страница 1 из 2

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

СообщениеДобавлено: 21.08.2013 17:00:09
t-ea
Как в полях, имеющих выпадающий список (tdropdownlisteditdb, tenumeditdb и т.п.), при вводе символов отфильтровывать значение выпадающего списка?

На примере приложенного изображения:
Как сделать чтобы при вводе в tdropdownlisteditdb символов "Мос" из выпадающего списка исчезала строчка с Ярославлем?

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

СообщениеДобавлено: 21.08.2013 17:37:48
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

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

СообщениеДобавлено: 21.08.2013 23:10:59
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.

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

СообщениеДобавлено: 22.08.2013 10:36:50
t-ea
От меня что-то скрывают. :lol:

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

Вот прикладываю, то на чём тренируюсь. Можете подсказать, где и что надо дописать?

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

СообщениеДобавлено: 22.08.2013 11:50:05
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.

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

СообщениеДобавлено: 22.08.2013 12:23:33
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 сократился до ['мурманск'].

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

СообщениеДобавлено: 22.08.2013 12:37:06
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?

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

СообщениеДобавлено: 22.08.2013 13:31:53
t-ea
mse писал(а):Do you really need it?

Да.

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

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

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

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

А так я ввёл "мур" и в списке у меня остались только "ОУФМС Мурманска", "Мурманский ОУФМС" и ещё какой-нибудь "Муром".

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

СообщениеДобавлено: 22.08.2013 13:56:17
debi12345
It seems that T-e-a wants automatic fultering as well, not only the selection adjustment.

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

СообщениеДобавлено: 22.08.2013 13:58:53
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.

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

СообщениеДобавлено: 22.08.2013 14:29:15
debi12345
Will it be applicable for DB-supplied datasets ?

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

СообщениеДобавлено: 22.08.2013 14:38:19
mse
Or t*lookupbuffer.

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

СообщениеДобавлено: 22.08.2013 15:02:17
t-ea
А если просто добавить какую-нибудь процедуру которая позволяла бы заново вызывать OnFilter ?
То есть, у меня был бы обработчик
Код: Выделить всё
procedure tmainfo.OnTextEditedDropdownListEditLB(const sender: tcustomedit;
               var atext: msestring);
begin

DoAgainOnFilter;
end;

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

СообщениеДобавлено: 22.08.2013 15:15:05
debi12345
Мартин умеет находить идеальные (а не компромиссные) решения - и сейчас как всегда придумает что нибудь убивающее всех "зайцев" :)

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

СообщениеДобавлено: 22.08.2013 18:37:13
amateur
есть делфи вариант http://stackoverflow.com/questions/6667054/how-can-i-filter-the-contents-of-a-combo-box-based-on-whats-been-typed

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