Динамическое поле со списком

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Динамическое поле со списком

Сообщение Андрей »

Подскажите пож-та как его реализовать ? Что нужно: в форме при раскрытии поля со списком его содержание должно быть различным в зависимости от значений предыдущих (вышележащих) полей. Решил сделать это через динам. фильтр, написал некую рутинку

DoFiltr routine
..... обработка значений влияющих полей и формирование фильтра
FDCB6.ApplyFilter()
FDCB6.Reset(1)
??? может не так надо переинициализацию делать... ?

Теперь где ее вызвать в ком месте обработки событий поля FDCB6 ? Пробовал и в Accepted и в Selected и в Selecting.... ну в общем методом тыка... не то все
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Динамическое поле со списком

Сообщение kreator »

Всё просто. Есть, например, контрол, от которого зависит комбобох - ?LOC:Mode (не важно, какой, может Entry, Spin). при его изменении, например при событии EVENT:Accepted (или EVENT:NewSelection), пишем код:

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

FDCB6.ResetQueue(Reset:Queue)

А в 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
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Динамическое поле со списком

Сообщение Yufil »

Самое лучшее место для обновления - Event:Selected (метод TakeSelected) на самом DropBox'е...
Вот когда надо, тогда и обновится..

А обработка примерно такая
FDB6.SetFilter(новое условие фильтра)
FDB6.ResetQueue(Reset:Queue)
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Динамическое поле со списком

Сообщение Андрей »

Самое лучшее место для обновления - Event:Selected (метод TakeSelected) на самом DropBox'е...
ммм..... не могу найти такого метода TakeSelected
может на TakeEvent, тогда что там писать
типа
Case of Event:Selected
.... ?
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Динамическое поле со списком

Сообщение Андрей »

Всё просто. Есть, например, контрол, от которого зависит комбобох - ?LOC:Mode (не важно, какой, может Entry, Spin). при его изменении, например при событии EVENT:Accepted (или EVENT:NewSelection), пишем код:
Вот тут тоже проблемка - у меня одно из влияющих полей Entry не прямо вводится, а через CallLookup и вот где запустить обновление фильтра, чтоб оно отработало после Lookup Procedure.... ?
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Динамическое поле со списком

Сообщение kreator »

Ну CallLookup - это же кнопка, там есть свои Embeds (там вызывается некая Ваша процедура и обновляется Entry поле), туда и вставляйте нужный код.
Немножко непрозрачный этот шаблон CallLookup, конечно. Я давно отказался от него. Легче на обычную кнопку навесить нужный функционал. Но если есть этот шаблон, то, наверно не проблема, надо только посмотреть куда там вставить код.
We are hard at work… for you. :)
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Динамическое поле со списком

Сообщение Андрей »

ммм.... в общем заработало, но есть одна шероховатость, как бы ее убрать ?
Суть в следующем - пусть в данный момент список отображает 2 элемента. Изменяю фильтр, применяю его в Event:Selected через FDCB6.ResetQueue(True).
Теперь должен отображать 3 элемента, на на самом деле отображает 2 (3-й через прокрутку доступен).
Наоборот, меняю фильтр с 3-х элементов на 2. Отображает 2, но видно что размер списка оценивает в 3 элемента (3-й недоступен). Ежели же не меняя фильтра еще раз комбо выбрать, то размер списка уже правильно оценивается.
В общем при изменении фильтра и первом выборе комбо, содержимое списка меняется, но размер списка остается прежним и меняется только при повторном выборе.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Динамическое поле со списком

Сообщение Yufil »

Угу, есть такое дело, сталкивался.
Попробуй после обновления поменять свойство Prop:Drop для комбобокса после обновления.
Если не сработает, в понедельник скажу точнее.
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Динамическое поле со списком

Сообщение Андрей »

Yufil писал(а):Угу, есть такое дело, сталкивался.
Попробуй после обновления поменять свойство Prop:Drop для комбобокса после обновления.
Если не сработает, в понедельник скажу точнее.
что-то не нашел такого свойства
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

Re: Динамическое поле со списком

Сообщение Дед Пахом »

?Combo{prop:drop} = NumberOfItems
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Динамическое поле со списком

Сообщение Yufil »

Ну да, вот нашёл в действующей программе. Очередь, правда, ручками формируется...
DecQ - очередь, а Loc:Field - номер поля комбобокса, по умолчанию выпадает 15 строк

if Records(DecQ)<15
Loc:Field{Prop:Drop,1} = Records(DecQ)
Else
Loc:Field{Prop:Drop,1} = 15
End
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Re: Динамическое поле со списком

Сообщение Андрей »

А куда ставить ?
Я и до FDCB6.ResetQueue(True) ставил и после....
l_NameUsl{PROP:Drop}=5 для пробы - не работает....
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 18:49

Re: Динамическое поле со списком

Сообщение 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
Стало быть после ресета
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Re: Динамическое поле со списком

Сообщение Yufil »

Всё-таки, лучше обновить список на событие Event:Selected для ComboBox. Пока не надо выбирать из списка, нефига и очередь формировать
И ?Combo{Prop:Drop,1} не должен быть больше, чем количество записей в очереди, чревато некрасивыми графическими артефактами...
kreator
✯ Ветеран ✯
Сообщения: 5161
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Re: Динамическое поле со списком

Сообщение kreator »

Всё равно по Accepted нужно поле комбобокса обнулять. А может есть смысл сразу вытянуть (первое) значение из вновь сформированного комбобокса, тем более, что стандартно комбобокс может так работать. Считаю, чем меньше юзер делает движений, тем он благодарнее. Вообще, надо смотреть по схеме работы, если поле с комбобоксом в форме обязательное, то, может, не заставлять юзера принудительно выбирать что-то из комбобокса?
We are hard at work… for you. :)
Ответить