Динамическое поле со списком
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Динамическое поле со списком
Подскажите пож-та как его реализовать ? Что нужно: в форме при раскрытии поля со списком его содержание должно быть различным в зависимости от значений предыдущих (вышележащих) полей. Решил сделать это через динам. фильтр, написал некую рутинку
DoFiltr routine
..... обработка значений влияющих полей и формирование фильтра
FDCB6.ApplyFilter()
FDCB6.Reset(1)
??? может не так надо переинициализацию делать... ?
Теперь где ее вызвать в ком месте обработки событий поля FDCB6 ? Пробовал и в Accepted и в Selected и в Selecting.... ну в общем методом тыка... не то все
DoFiltr routine
..... обработка значений влияющих полей и формирование фильтра
FDCB6.ApplyFilter()
FDCB6.Reset(1)
??? может не так надо переинициализацию делать... ?
Теперь где ее вызвать в ком месте обработки событий поля FDCB6 ? Пробовал и в Accepted и в Selected и в Selecting.... ну в общем методом тыка... не то все
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Динамическое поле со списком
Всё просто. Есть, например, контрол, от которого зависит комбобох - ?LOC:Mode (не важно, какой, может Entry, Spin). при его изменении, например при событии EVENT:Accepted (или EVENT:NewSelection), пишем код:
А в Embeds комбобокса в ApplyFilter после Parent Call -
Код: Выделить всё
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. 

Re: Динамическое поле со списком
Самое лучшее место для обновления - Event:Selected (метод TakeSelected) на самом DropBox'е...
Вот когда надо, тогда и обновится..
А обработка примерно такая
FDB6.SetFilter(новое условие фильтра)
FDB6.ResetQueue(Reset:Queue)
Вот когда надо, тогда и обновится..
А обработка примерно такая
FDB6.SetFilter(новое условие фильтра)
FDB6.ResetQueue(Reset:Queue)
Re: Динамическое поле со списком
ммм..... не могу найти такого метода TakeSelectedСамое лучшее место для обновления - Event:Selected (метод TakeSelected) на самом DropBox'е...
может на TakeEvent, тогда что там писать
типа
Case of Event:Selected
.... ?
Re: Динамическое поле со списком
Вот тут тоже проблемка - у меня одно из влияющих полей Entry не прямо вводится, а через CallLookup и вот где запустить обновление фильтра, чтоб оно отработало после Lookup Procedure.... ?Всё просто. Есть, например, контрол, от которого зависит комбобох - ?LOC:Mode (не важно, какой, может Entry, Spin). при его изменении, например при событии EVENT:Accepted (или EVENT:NewSelection), пишем код:
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Динамическое поле со списком
Ну CallLookup - это же кнопка, там есть свои Embeds (там вызывается некая Ваша процедура и обновляется Entry поле), туда и вставляйте нужный код.
Немножко непрозрачный этот шаблон CallLookup, конечно. Я давно отказался от него. Легче на обычную кнопку навесить нужный функционал. Но если есть этот шаблон, то, наверно не проблема, надо только посмотреть куда там вставить код.
Немножко непрозрачный этот шаблон CallLookup, конечно. Я давно отказался от него. Легче на обычную кнопку навесить нужный функционал. Но если есть этот шаблон, то, наверно не проблема, надо только посмотреть куда там вставить код.
We are hard at work… for you. 

Re: Динамическое поле со списком
ммм.... в общем заработало, но есть одна шероховатость, как бы ее убрать ?
Суть в следующем - пусть в данный момент список отображает 2 элемента. Изменяю фильтр, применяю его в Event:Selected через FDCB6.ResetQueue(True).
Теперь должен отображать 3 элемента, на на самом деле отображает 2 (3-й через прокрутку доступен).
Наоборот, меняю фильтр с 3-х элементов на 2. Отображает 2, но видно что размер списка оценивает в 3 элемента (3-й недоступен). Ежели же не меняя фильтра еще раз комбо выбрать, то размер списка уже правильно оценивается.
В общем при изменении фильтра и первом выборе комбо, содержимое списка меняется, но размер списка остается прежним и меняется только при повторном выборе.
Суть в следующем - пусть в данный момент список отображает 2 элемента. Изменяю фильтр, применяю его в Event:Selected через FDCB6.ResetQueue(True).
Теперь должен отображать 3 элемента, на на самом деле отображает 2 (3-й через прокрутку доступен).
Наоборот, меняю фильтр с 3-х элементов на 2. Отображает 2, но видно что размер списка оценивает в 3 элемента (3-й недоступен). Ежели же не меняя фильтра еще раз комбо выбрать, то размер списка уже правильно оценивается.
В общем при изменении фильтра и первом выборе комбо, содержимое списка меняется, но размер списка остается прежним и меняется только при повторном выборе.
Re: Динамическое поле со списком
Угу, есть такое дело, сталкивался.
Попробуй после обновления поменять свойство Prop:Drop для комбобокса после обновления.
Если не сработает, в понедельник скажу точнее.
Попробуй после обновления поменять свойство Prop:Drop для комбобокса после обновления.
Если не сработает, в понедельник скажу точнее.
Re: Динамическое поле со списком
что-то не нашел такого свойстваYufil писал(а):Угу, есть такое дело, сталкивался.
Попробуй после обновления поменять свойство Prop:Drop для комбобокса после обновления.
Если не сработает, в понедельник скажу точнее.
Re: Динамическое поле со списком
Ну да, вот нашёл в действующей программе. Очередь, правда, ручками формируется...
DecQ - очередь, а Loc:Field - номер поля комбобокса, по умолчанию выпадает 15 строк
if Records(DecQ)<15
Loc:Field{Prop:Drop,1} = Records(DecQ)
Else
Loc:Field{Prop:Drop,1} = 15
End
DecQ - очередь, а Loc:Field - номер поля комбобокса, по умолчанию выпадает 15 строк
if Records(DecQ)<15
Loc:Field{Prop:Drop,1} = Records(DecQ)
Else
Loc:Field{Prop:Drop,1} = 15
End
Re: Динамическое поле со списком
А куда ставить ?
Я и до FDCB6.ResetQueue(True) ставил и после....
l_NameUsl{PROP:Drop}=5 для пробы - не работает....
Я и до FDCB6.ResetQueue(True) ставил и после....
l_NameUsl{PROP:Drop}=5 для пробы - не работает....
Re: Динамическое поле со списком
Для пробы-то лучше ?l_NameUsl{PROP:Drop}=5 или ?l_NameUsl{PROP:Drop,1}=5Андрей писал(а):l_NameUsl{PROP:Drop}=5 для пробы - не работает....
Я использовал так:
Код: Выделить всё
CASE ACCEPTED()
OF ?LOC:EnumField_3
FDB13.ResetQueue(1)
?LOC:EnumField_6{PROP:Drop}=5
Re: Динамическое поле со списком
Всё-таки, лучше обновить список на событие Event:Selected для ComboBox. Пока не надо выбирать из списка, нефига и очередь формировать
И ?Combo{Prop:Drop,1} не должен быть больше, чем количество записей в очереди, чревато некрасивыми графическими артефактами...
И ?Combo{Prop:Drop,1} не должен быть больше, чем количество записей в очереди, чревато некрасивыми графическими артефактами...
-
- ✯ Ветеран ✯
- Сообщения: 5161
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Re: Динамическое поле со списком
Всё равно по Accepted нужно поле комбобокса обнулять. А может есть смысл сразу вытянуть (первое) значение из вновь сформированного комбобокса, тем более, что стандартно комбобокс может так работать. Считаю, чем меньше юзер делает движений, тем он благодарнее. Вообще, надо смотреть по схеме работы, если поле с комбобоксом в форме обязательное, то, может, не заставлять юзера принудительно выбирать что-то из комбобокса?
We are hard at work… for you. 
