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

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

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

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

Сообщение t-ea » 21.08.2013 17:00:09

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

На примере приложенного изображения:
Как сделать чтобы при вводе в tdropdownlisteditdb символов "Мос" из выпадающего списка исчезала строчка с Ярославлем?
Вложения
dropdown-need.png
dropdown-need.png (4.38 КБ) Просмотров: 20376
dropdown.png
dropdown.png (3.75 КБ) Просмотров: 20376
Последний раз редактировалось t-ea 24.08.2013 12:17:47, всего редактировалось 2 раз(а).
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

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

Сообщение debi12345 » 21.08.2013 17:37:48

Легко делается на списках, увязанных на 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
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение mse » 21.08.2013 23:10:59

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.
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

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

Сообщение t-ea » 22.08.2013 10:36:50

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

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

Вот прикладываю, то на чём тренируюсь. Можете подсказать, где и что надо дописать?
Вложения
test.zip
(8.39 КБ) Скачиваний: 688
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

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

Сообщение mse » 22.08.2013 11:50:05

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.
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

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

Сообщение t-ea » 22.08.2013 12:23:33

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 сократился до ['мурманск'].
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

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

Сообщение mse » 22.08.2013 12:37:06

Ouch, this is complicated. Do you really need it? Did you notice that the row cursor in the dropdownlist automatically follows the entered text?
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

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

Сообщение t-ea » 22.08.2013 13:31:53

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

Да.

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

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

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

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

А так я ввёл "мур" и в списке у меня остались только "ОУФМС Мурманска", "Мурманский ОУФМС" и ещё какой-нибудь "Муром".
t-ea
новенький
 
Сообщения: 98
Зарегистрирован: 22.09.2006 00:22:34

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

Сообщение debi12345 » 22.08.2013 13:56:17

It seems that T-e-a wants automatic fultering as well, not only the selection adjustment.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение mse » 22.08.2013 13:58:53

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 раз.
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

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

Сообщение debi12345 » 22.08.2013 14:29:15

Will it be applicable for DB-supplied datasets ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение mse » 22.08.2013 14:38:19

Or t*lookupbuffer.
mse
новенький
 
Сообщения: 68
Зарегистрирован: 08.08.2013 15:40:31

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

Сообщение t-ea » 22.08.2013 15:02:17

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

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

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

Сообщение debi12345 » 22.08.2013 15:15:05

Мартин умеет находить идеальные (а не компромиссные) решения - и сейчас как всегда придумает что нибудь убивающее всех "зайцев" :)
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5752
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

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

Сообщение amateur » 22.08.2013 18:37:13

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

Что мешает Вам самим организовать подобный фильтр. Ведь смысл прост. Держим два списка. Из одного тянем что надо, второй показывает.
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

След.

Вернуться в MSEide + MSEgui

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

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

Рейтинг@Mail.ru