Страница 1 из 2
Динамическое поле со списком
Добавлено: 05 Сентябрь 2013, 23:41
Андрей
Подскажите пож-та как его реализовать ? Что нужно: в форме при раскрытии поля со списком его содержание должно быть различным в зависимости от значений предыдущих (вышележащих) полей. Решил сделать это через динам. фильтр, написал некую рутинку
DoFiltr routine
..... обработка значений влияющих полей и формирование фильтра
FDCB6.ApplyFilter()
FDCB6.Reset(1)
??? может не так надо переинициализацию делать... ?
Теперь где ее вызвать в ком месте обработки событий поля FDCB6 ? Пробовал и в Accepted и в Selected и в Selecting.... ну в общем методом тыка... не то все
Re: Динамическое поле со списком
Добавлено: 06 Сентябрь 2013, 10:18
kreator
Всё просто. Есть, например, контрол, от которого зависит комбобох - ?LOC:Mode (не важно, какой, может Entry, Spin). при его изменении, например при событии EVENT:Accepted (или EVENT:NewSelection), пишем код:
А в Embeds комбобокса в ApplyFilter после Parent Call -
Код: Выделить всё
case LOC:Mode
of 1
FDCB6::View:FileDropCombo{prop:SQLFilter} = 'a.mode=1'
of 2
FDCB6::View:FileDropCombo{prop:SQLFilter} = 'a.mode=2'
of 3
FDCB6::View:FileDropCombo{prop:SQLFilter} = 'a.mode=2'
end
Re: Динамическое поле со списком
Добавлено: 06 Сентябрь 2013, 10:29
Yufil
Самое лучшее место для обновления - Event:Selected (метод TakeSelected) на самом DropBox'е...
Вот когда надо, тогда и обновится..
А обработка примерно такая
FDB6.SetFilter(новое условие фильтра)
FDB6.ResetQueue(Reset:Queue)
Re: Динамическое поле со списком
Добавлено: 06 Сентябрь 2013, 10:48
Андрей
Самое лучшее место для обновления - Event:Selected (метод TakeSelected) на самом DropBox'е...
ммм..... не могу найти такого метода TakeSelected
может на TakeEvent, тогда что там писать
типа
Case of Event:Selected
.... ?
Re: Динамическое поле со списком
Добавлено: 06 Сентябрь 2013, 10:53
Андрей
Всё просто. Есть, например, контрол, от которого зависит комбобох - ?LOC:Mode (не важно, какой, может Entry, Spin). при его изменении, например при событии EVENT:Accepted (или EVENT:NewSelection), пишем код:
Вот тут тоже проблемка - у меня одно из влияющих полей Entry не прямо вводится, а через CallLookup и вот где запустить обновление фильтра, чтоб оно отработало после Lookup Procedure.... ?
Re: Динамическое поле со списком
Добавлено: 06 Сентябрь 2013, 11:19
kreator
Ну CallLookup - это же кнопка, там есть свои Embeds (там вызывается некая Ваша процедура и обновляется Entry поле), туда и вставляйте нужный код.
Немножко непрозрачный этот шаблон CallLookup, конечно. Я давно отказался от него. Легче на обычную кнопку навесить нужный функционал. Но если есть этот шаблон, то, наверно не проблема, надо только посмотреть куда там вставить код.
Re: Динамическое поле со списком
Добавлено: 07 Сентябрь 2013, 22:20
Андрей
ммм.... в общем заработало, но есть одна шероховатость, как бы ее убрать ?
Суть в следующем - пусть в данный момент список отображает 2 элемента. Изменяю фильтр, применяю его в Event:Selected через FDCB6.ResetQueue(True).
Теперь должен отображать 3 элемента, на на самом деле отображает 2 (3-й через прокрутку доступен).
Наоборот, меняю фильтр с 3-х элементов на 2. Отображает 2, но видно что размер списка оценивает в 3 элемента (3-й недоступен). Ежели же не меняя фильтра еще раз комбо выбрать, то размер списка уже правильно оценивается.
В общем при изменении фильтра и первом выборе комбо, содержимое списка меняется, но размер списка остается прежним и меняется только при повторном выборе.
Re: Динамическое поле со списком
Добавлено: 07 Сентябрь 2013, 23:03
Yufil
Угу, есть такое дело, сталкивался.
Попробуй после обновления поменять свойство Prop:Drop для комбобокса после обновления.
Если не сработает, в понедельник скажу точнее.
Re: Динамическое поле со списком
Добавлено: 08 Сентябрь 2013, 0:15
Андрей
Yufil писал(а):Угу, есть такое дело, сталкивался.
Попробуй после обновления поменять свойство Prop:Drop для комбобокса после обновления.
Если не сработает, в понедельник скажу точнее.
что-то не нашел такого свойства
Re: Динамическое поле со списком
Добавлено: 08 Сентябрь 2013, 10:49
Дед Пахом
?Combo{prop:drop} = NumberOfItems
Re: Динамическое поле со списком
Добавлено: 09 Сентябрь 2013, 9:49
Yufil
Ну да, вот нашёл в действующей программе. Очередь, правда, ручками формируется...
DecQ - очередь, а Loc:Field - номер поля комбобокса, по умолчанию выпадает 15 строк
if Records(DecQ)<15
Loc:Field{Prop:Drop,1} = Records(DecQ)
Else
Loc:Field{Prop:Drop,1} = 15
End
Re: Динамическое поле со списком
Добавлено: 09 Сентябрь 2013, 14:26
Андрей
А куда ставить ?
Я и до FDCB6.ResetQueue(True) ставил и после....
l_NameUsl{PROP:Drop}=5 для пробы - не работает....
Re: Динамическое поле со списком
Добавлено: 09 Сентябрь 2013, 16:32
Shur
Андрей писал(а):l_NameUsl{PROP:Drop}=5 для пробы - не работает....
Для пробы-то лучше ?l_NameUsl{PROP:Drop}=5 или ?l_NameUsl{PROP:Drop,1}=5
Я использовал так:
Код: Выделить всё
CASE ACCEPTED()
OF ?LOC:EnumField_3
FDB13.ResetQueue(1)
?LOC:EnumField_6{PROP:Drop}=5
Стало быть после ресета
Re: Динамическое поле со списком
Добавлено: 09 Сентябрь 2013, 23:45
Yufil
Всё-таки, лучше обновить список на событие Event:Selected для ComboBox. Пока не надо выбирать из списка, нефига и очередь формировать
И ?Combo{Prop:Drop,1} не должен быть больше, чем количество записей в очереди, чревато некрасивыми графическими артефактами...
Re: Динамическое поле со списком
Добавлено: 10 Сентябрь 2013, 10:01
kreator
Всё равно по Accepted нужно поле комбобокса обнулять. А может есть смысл сразу вытянуть (первое) значение из вновь сформированного комбобокса, тем более, что стандартно комбобокс может так работать. Считаю, чем меньше юзер делает движений, тем он благодарнее. Вообще, надо смотреть по схеме работы, если поле с комбобоксом в форме обязательное, то, может, не заставлять юзера принудительно выбирать что-то из комбобокса?