Отговори на тема  [ 6 мнения ] 
Вложени менюта 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Вложени менюта
Задачата е да се организира сиситема с вложени менюта на малък графичен дисплей. Нещо като телефоните на Nokia.
За малък брой менюта с до 2 нива на влагане съм го правил с масив тип структура в която има указатели към стринговете които се извеждат и указатели към функциите които се стартират при ОК върху активния ред и флагове за типа.
Но като са да кажем 10 менюта с да кажем 5 нива на влагане се получава доста неефективно използване на паметта и голяма каша.

Как се реализират подобни менюта по принцип? Някой правил ли е такова чудо?


Пон Авг 08, 2005 10:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Всеки може да си го направи както му е гот. Аз съм си направил менюто с нещо като дървовидна структура със такава организация :
- всеки ред има свое 'ниво' в йерархията на редовете от менютата, при мен това се определя от броя интервали в началото на текста;
- всеки ред има определено действие, което се извършва при 'ОК'. Вида на действието се определя от константа, която е елемент от структурата на един ред от менюто. Ето ти едни примерни такива действия ( при тебе може да са съвсем различни )
#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,

.. и т.н. Ако ти харесва, можеш да го направиш така.


Пон Авг 08, 2005 11:36 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
не забравяй, че самия текст ще заеме много повече място от структурите на менютата. преди много години правихнещо такова, ама то беше с адски много текст. уж имаше място в прома, после мястото свърши. та се наложи да правя речник. ама то не става на ръка, та си направих компилатор на менюта, който от обикновен текстови файл прави речник и глобява йерархията на менютата направо в бинарен вид.

обаче надали ще намеря нещо - това беше преди повече от 15 години :roll:


Вто Авг 09, 2005 9:14 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Сеп 25, 2004 12:32 pm
Мнения: 8382
Местоположение: София
Мнение 
За едективно усвояане на паметта, речника е задължителен. Самата меню-система трябва да е нещо такова:

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

char**    Dictionary;
MenuItem** Menus;


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


Вто Авг 09, 2005 10:18 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
Я ме светнете за речника ... че нещо не ми е ясно каква е идеята ... да позлваш една дума на много места или ?????


Сря Авг 10, 2005 1:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Сря Авг 10, 2005 1:50 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 6 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни