Микроконтролери и електроника
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 години :roll:

Автор:  Реконструктор [ Вто Авг 09, 2005 10:18 am ]
Заглавие: 

За едективно усвояане на паметта, речника е задължителен. Самата меню-система трябва да е нещо такова:

Код:
struct MenuItem
{
   int      nText;
   int      nAction;
}

char**    Dictionary;
MenuItem** Menus;


Мисля, че всичко е чисто и ясно, само да поясня за специалната ф-я на nAction. :) Ако, да кажем, nAction > 0 то това означава изпълнение на дадена команда. Ако nAction < 0 то в този случай имаме подменю, с индекс в масива от менюта nAction * -1. По-просто от това едва ли може да се измисли. :)

Автор:  ToHu [ Сря Авг 10, 2005 1:14 pm ]
Заглавие: 

Я ме светнете за речника ... че нещо не ми е ясно каква е идеята ... да позлваш една дума на много места или ?????

Автор:  Реконструктор [ Сря Авг 10, 2005 1:50 pm ]
Заглавие: 

Чак толкова не - става сложно. :) Идеята е, вместо да имаш char text[20] (т.е. фиксиран размер) за текста на всяко меню, размера да е плаващ. Т.е. да имаш масив от стрингове някъде. Стринга може да е с плаващ размер в самата структура, но тогава е по-сложно за обработка.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/