| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Вложени менюта http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=924 |
Страница 1 от 1 |
| Автор: | Nikola Kirov [ Пон Авг 08, 2005 10:00 pm ] |
| Заглавие: | Вложени менюта |
Задачата е да се организира сиситема с вложени менюта на малък графичен дисплей. Нещо като телефоните на Nokia. За малък брой менюта с до 2 нива на влагане съм го правил с масив тип структура в която има указатели към стринговете които се извеждат и указатели към функциите които се стартират при ОК върху активния ред и флагове за типа. Но като са да кажем 10 менюта с да кажем 5 нива на влагане се получава доста неефективно използване на паметта и голяма каша. Как се реализират подобни менюта по принцип? Някой правил ли е такова чудо? |
|
| Автор: | bateAz [ Пон Авг 08, 2005 11:36 pm ] |
| Заглавие: | |
Всеки може да си го направи както му е гот. Аз съм си направил менюто с нещо като дървовидна структура със такава организация : - всеки ред има свое 'ниво' в йерархията на редовете от менютата, при мен това се определя от броя интервали в началото на текста; - всеки ред има определено действие, което се извършва при 'ОК'. Вида на действието се определя от константа, която е елемент от структурата на един ред от менюто. Ето ти едни примерни такива действия ( при тебе може да са съвсем различни ) #define ACTION_EXIT BIT0 #define ACTION_GOSUB BIT1 #define ACTION_EDITFLOAT BIT2 #define ACTION_SELECT BIT3 #define ACTION_CTRLPARAM BIT4 #define ACTION_GOUP BIT5 #define ACTION_SHOWFLOAT BIT6 #define ACTION_SHOWINT BIT7 По принцип се допускат и комбинация от действия. - всеки ред (понякога) има и собствена процедура, която се изпълнява. Трети елемент е поинтер към процедурата (или нула); - всеки ред обикновено се отнася до някаква променлива - има и адрес на променливата; По този начин един ред се описва със структура, напр. в един мой проект тя е такава: struct menu_item { char text[20]; int action; void (*proc)(void); }; Един примерен масив с константи за меню е това: const struct menu_item mmenu[] = { // 12345678901234567890 "Изход от менюто ", ACTION_EXIT, 0, "Настройка входове ", ACTION_GOSUB, 0, " Изход от менюто ", ACTION_GOUP, 0, " Напреж траф R ", ACTION_EDITFLOAT, sel_utraf_r, " Напреж траф S ", ACTION_EDITFLOAT, sel_utraf_s, " Напреж траф T ", ACTION_EDITFLOAT, sel_utraf_t, " Напрежителен вход ", ACTION_GOSUB, select_in, " 100 V входове ", ACTION_GOUP, set_in100, " 220 V входове ", ACTION_GOUP, set_in220, " Токов траф R ", ACTION_EDITFLOAT, sel_itraf_r, " Токов траф S ", ACTION_EDITFLOAT, sel_itraf_s, " Токов траф T ", ACTION_EDITFLOAT, sel_itraf_t, " Свързване ", 0, select_conn, " Звезда ", ACTION_GOUP + ACTION_SELECT, set_conn_star, " Триъгълник ", ACTION_GOUP + ACTION_SELECT, set_conn_tri, "Настройка реле #1 ", ACTION_GOSUB, select_rel_1, "Настройка реле #2 ", ACTION_GOSUB, select_rel_2, "Настройка реле #3 ", ACTION_GOSUB, select_rel_3, "Настройка реле #4 ", ACTION_GOSUB, select_rel_4, " Изход от менюто ", ACTION_GOUP, 0, " Управлеващ парамет", ACTION_CTRLPARAM, select_ctrlparam_rel, " Долна граница ", ACTION_EDITFLOAT, sel_rel_llimit, " Горна граница ", ACTION_EDITFLOAT, sel_rel_hlimit, " Хистерезис ", ACTION_EDITFLOAT, sel_rel_hyst, " Време за включване", ACTION_EDITFLOAT, sel_rel_t_on, " Критерий за включ ", 0, select_relact, " над горна гран ", ACTION_GOUP, set_relact_h, " под долна гран ", ACTION_GOUP, set_relact_l, " между границите ", ACTION_GOUP, set_relact_in, " извън границите ", ACTION_GOUP, set_relact_out, .. и т.н. Ако ти харесва, можеш да го направиш така. |
|
| Автор: | ДедоБоре [ Вто Авг 09, 2005 9:14 am ] |
| Заглавие: | |
не забравяй, че самия текст ще заеме много повече място от структурите на менютата. преди много години правихнещо такова, ама то беше с адски много текст. уж имаше място в прома, после мястото свърши. та се наложи да правя речник. ама то не става на ръка, та си направих компилатор на менюта, който от обикновен текстови файл прави речник и глобява йерархията на менютата направо в бинарен вид. обаче надали ще намеря нещо - това беше преди повече от 15 години |
|
| Автор: | Реконструктор [ Вто Авг 09, 2005 10:18 am ] | |||||||||
| Заглавие: | ||||||||||
За едективно усвояане на паметта, речника е задължителен. Самата меню-система трябва да е нещо такова:
Мисля, че всичко е чисто и ясно, само да поясня за специалната ф-я на nAction. |
||||||||||
| Автор: | ToHu [ Сря Авг 10, 2005 1:14 pm ] |
| Заглавие: | |
Я ме светнете за речника ... че нещо не ми е ясно каква е идеята ... да позлваш една дума на много места или ????? |
|
| Автор: | Реконструктор [ Сря Авг 10, 2005 1:50 pm ] |
| Заглавие: | |
Чак толкова не - става сложно. |
|
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|