|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Всем добрый день! Столкнулась с интересной ситуацией при работе с меню. DEFINE POPUP men1 FROM 10,10 MULTI margin TITLE 'Услуги' for ii=1 to kol_usl define bar ii of men1 PROMPT ALLTRIM(STR(rez3(ii))) + '. ' + alltrim(rez5(ii)) + ' ' + ALLTRIM(STR(rez6(ii),6,2)) endfor on sele popu men1 do vm1 with prompt(), bar() acti popup men1 PROCEDURE vm1 param ks1, ks3 if mrkbar('men1',ks3) n_labr(zz) = r_labr(ks3) v_gr_pech(zz) = r_gr_pech(ks3) v_vich(zz) = r_vich(ks3) v_ne_pech(zz) = r_ne_pech(ks3) ENDIF set mark of bar ks3 of men1 to .t. DEFINE BAR ks3 OF men1 PROMPT ks1 COLOR scheme 3 retu Если определяю меню с мультивыбором (параметр MULTISELECT), то mrkbar('men1',ks3) на входе в программу vm1 на все элементы меню сразу .t., хотя set mark ещё не было. Если убираю параметр MULTISELECT), то mrkbar('men1',ks3) - .f. и становится .t. только после set mark. Поэтому никак не могу сделать включение-выключение пунктов меню. Что я делаю не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 09:34 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Неужели никто не сталкивался с таким, может это у меня FOX глючит (7 версия)? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 11:20 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Здесь путаница в назначении функции mrkBar(). Да, по умолчанию, она определяет признак того, что слева от выбранного пункта меню стоит "птичка". Т.е. использована настройка SET MARK OF BAR ... OF ... TO .T. Однако в режиме множественного выбора (Multiselect) эта же функция проверяет уже не факт наличия/отстутствия "птички", а факт выбора соответствующего пункта меню. Ведь выбрано может быть несколько пунктов. При этом, никаких птичек слева от выбранных пунктов не ставится. Они просто подсвечиваются контрастным цветом. Другими словами, режимы MULTISELECT и SET MARK OF - не совместимы, если предполагается использовать mrkBar(). Она будет показывать выбранный, а не помеченный пункт меню. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 11:50 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
А как проверить, выбран ли данный пункт меню при MULTISELECT. Это нужно, чтобы пользователь имел возможность отменить выбранный неверно пункт за один приемю ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 11:59 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Запуталась в терминах, надо отменить пометку пункта. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 12:01 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
АленаША как проверить, выбран ли данный пункт меню при MULTISELECT. Это нужно, чтобы пользователь имел возможность отменить выбранный неверно пункт за один приемю Так ведь в справке по команде DEPINE POPUP дан прекрасный пример использования именно MULTISELECT. Вот код из справки по VFP7 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Смысл в том, что процедура YourChoice при любым выборе сканирует ВСЕ пункты меню (цикл FOR). И для каждого из них проверяет факт выбора. В результате, внутри процедуры YourChoice получаешь полный список всех выбранных элементов меню. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 12:32 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Так дело в том, что если один раз выбрал, то mrkbar остается .t., а мне надо, чтобы при повторном выборе происходила отмена и пометка убиралась. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 13:05 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Я же уже сказал, что SET MARK и MULTISELECT - несовместимы в части использования mrkBar(). Либо выбирайте по одному пункту за раз и вручную ставите SET MARK (тогда выбор остается "навсегда") Либо выбираете по несколько пунктов сразу, но результат выбора забывается сразу после выбора. Впрочем, можно попробовать хранить номера пунктов для которых сделана настройка SET MARK в каком-либо отдельном глобальном массиве, вообще не обращаясь к функции mrkBar(). Т.е. функция mrkBar() будет использоваться только для фиксации множественного выбора. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 14:05 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Спасибо большое, у меня как раз только что все получилось, и почти как у Вас. Значит, мыслю верно. if zz<kol_usl if mrkbar('men1',ks3) = .t. IF ASCAN(rez2,VAL(SUBSTR(ks1,1,AT('.',ks1)-1))) = 0 zz=zz+1 rez2(zz) = VAL(SUBSTR(ks1,1,AT('.',ks1)-1)) rez4(zz)= SUBSTR(ks1,AT('.',ks1)+2,AT('_',ks1)-(AT('.',ks1)+2)) set mark of bar ks3 of men1 to mrkbar('men1',ks3) = .t. DEFINE BAR ks3 OF men1 PROMPT ks1 COLOR scheme 3 ELSE ud_ar = ASCAN(rez2,VAL(SUBSTR(ks1,1,AT('.',ks1)-1))) set mark of bar ks3 of men1 to mrkbar('men1',ks3) = .f. = ADEL(rez2,ud_ar) = ADEL(rez4,ud_ar) zz=zz - 1 endif ENDIF endif ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 14:13 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Окончательно получилось так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
ВладимирМ, спасибо Вам! ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 14:51 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
Если вы размерность массивов все-равно не меняете, то имеет смысл создать массив с размерностью, равной максимально возможному значению параметра k3. Т.е. тому, что возвращает Bar(). Тогда вместо ASCAN() надо будет просто обратится к нужному элементу массива Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Кстати, массив может быть и двумерным. Поэтому в нем же, но в других столбцах, если необходимо, можно хранить и фрагменты ks1 И еще раз напоминаю, про бессмысленность проверки if mrkbar('men1',ks3) = .t. Она же всегда будет выполняться при использовании MULTISELECT. Зачем делать бессмысленную работу и усложнять код? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2009, 17:31 |
|
MULTISELECT и MRKBAR()
|
|||
---|---|---|---|
#18+
ВладимирМ, учту советы! Конечно, код ешё почищу, а размерность массива у меня как раз совпадает с количеством пунктов меню. Уменьшать его не могу, так как вдруг они опять передумают и начнут выбирать все подряд по максимуму, ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2009, 10:22 |
|
|
start [/forum/topic.php?fid=41&fpage=122&tid=1586248]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
31ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 326ms |
total: | 474ms |
0 / 0 |