|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 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,
.. и т.н. Ако ти харесва, можеш да го направиш така.
|