Página 1 de 3
criaçao de menus

Enviado:
27 Set 2010 16:16
por cristian
rapazes , qual a logica vcs usan pra criar menus com submenus e etc ...eu utilizo o swtch mas tem hora q embaralha tudo , pq menus tem que ter
1- listar as opçoes do menu principal
2-aguardar pressionar os botoes para tomar açoes
3-apresentear tela do submenu escolhido
4-voltar ao menu anterior
5-alterar dados dos submenus
isso vou criando semre atraves de swatch com uma varivel contendo o indice ...mas quando o menu e submenu é grande ai faz uma bagunça
ouvir falar que é igual a maquina de estado é isso mesmo?

Enviado:
27 Set 2010 19:19
por chrdcv
Já ouviu falar em ponteiro de funções? Que tal criar um array de ponteiros para funções passando como parâmetro o que será exibido e quando será exibido?
Christian

Enviado:
27 Set 2010 19:45
por Djalma Toledo Rodrigues
Programação Extruturada
_______Menu Pricipal_________
|__________________________|
--Case1 Case2 Case3 ..... CaseN
Cada qual com sua rotina independente
Vale o mesmo para Submenu
Todos devem ter a opção de Retorno, claro
DJ

Enviado:
27 Set 2010 20:24
por Red Neck Guy
Uma idéia é assim. Pode-se criar uma biblioteca para o menu, depois criar um módulo onde é criada a tabela de opções e dessa forma usa-se sempre o mesmo .C e .H para todos os projetos. Ali dentro do menu dá pra fazer de forma mais legal ainda mas é um próximo passo....
(Eu queria ter um iate pra passar por aí viajando e tomando mate...)
- Código: Selecionar todos
typedef struct{
const char *string_opcao;
unsigned char(*func_menu)(void);
}sMenu;
#define NUM_OPCOES_MENU 4
const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
{"Opcao 01",funcao_do_menu_01},
{"Opcao 02",funcao_do_menu_02},
{"Opcao 03",funcao_do_menu_03},
{"Sair",NULL}
};
#define LCD_CLS()
#define WRITE_LCD(STRING)// função para enviar uma string para o LCD
#define LCD_GOTO(X,Y)//função para posicionar o cursor
#define CARACTER_SELECAO ">"
#define LE_TECLADO() //macro para leitura do teclado que retorna 0 quando não há tecla pressionada
#define TECLA_UP
#define TECLA_DOWN
#define TECLA_ENTER
#define TECLA_ESC
void menu_lcd(char *menuTitle){
unsigned char ponteiroOpcao=0,tecla=0xFF,menu_loop=0;
LCD_CLS();
LCD_GOTO(0,0);
WRITE_LCD( menuTitle);
do{
if(tecla){
LCD_GOTO(0,1);
WRITE_LCD(CARACTER_SELECAO);
WRITE_LCD(menuFuleiro[ponteiroOpcao].string_opcao);
}
tecla = LE_TECLADO();
switch(tecla){
case TECLA_UP : ponteiroOpcao?(ponteiroOpcao--) : (NUM_OPCOES_MENU-1);
break;
case TECLA_DOWN: ponteiroOpcao = (ponteiroOpcao+1)%NUM_OPCOES_MENU
break;
case TECLA_ENTER: if(menuFuleiro[ponteiroOpcao].func_menu)
menuFuleiro[ponteiroOpcao].func_menu();
else
menu_loop = 0xFF;
break;
case TECLA_ESC : menu_loop = 0xFF; break;
}
}
while(!menu_loop);
}

Enviado:
27 Set 2010 20:29
por Silvio51
Aquino escreveu:
(Eu queria ter um iate pra passar por aí viajando e tomando mate...)
É meu amigo... tem gosto pra tudo... arrrrghhh...

Enviado:
27 Set 2010 23:26
por chrdcv
Silvio51 escreveu:Aquino escreveu:
(Eu queria ter um iate pra passar por aí viajando e tomando mate...)
É meu amigo... tem gosto pra tudo... arrrrghhh...
Eu que sou minerim me contentaria com uma fábrica de queijim da roça e umas cachacinhas... êtra trem bão uai!

Enviado:
28 Set 2010 14:16
por cristian
estou montando um menu aqui qualquer coisa eu posto aqui

Enviado:
29 Set 2010 09:21
por cristian
esta funçao aqui da erro ,nuca tinha visto esta forma de declarar const
entao montei e testei mas da erro
- Código: Selecionar todos
void funcao_do_menu_01(void)
{
}
void funcao_do_menu_02(void)
{
}
void funcao_do_menu_03(void)
{
}
typedef struct{
const char *string_opcao;
unsigned char(*func_menu)(void);
}sMenu;
#define NUM_OPCOES_MENU 4
const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
{"Opcao 01",funcao_do_menu_01},
{"Opcao 02",funcao_do_menu_02},
{"Opcao 03",funcao_do_menu_03},
{"sair"}
};
66 319 Cannot cast '' to ''
66 325 Too many initializers
mesmo declarando as funçoes deu erro e o NULL no mikroc nao aceitou
me explica esta funçao ai pode ser

Enviado:
29 Set 2010 09:33
por fabim
cris. é que a IDE não tem bola de cristal.
unsigned char(*func_menu)(void);
unsigned char(*func_menu "cade a definição de func_menu"?)(para nome que não enteressa a IDE que se dane pra entender);
você tem qeu definir o tipo (*func_menu).
você ta dizendo que é um ponteiro para algo desconhecido, mais o que é esse ponteiro ? Tem um nome, mais a IDE não sabe o qeu é.!!
Quando pegar estes exemplos, você deve ver as definições etc, e sempre observar para ver se acha os typedef ou struct ou #define. informando oq ue é esses nomes.
Abraços

Enviado:
29 Set 2010 09:36
por cristian
nao seria esse o caminho?
- Código: Selecionar todos
void funcao_do_menu_01(void)
{
}
para utilizar ele usou
Lcd_chr(2,2,menuFuleiro[2].string_opcao); // para escrever no display e
menuFuleiro[2].func_menu;// para chamar a funçao no indice [2] correto?
- Código: Selecionar todos
isso aqui nao funciona diz q nao pode transformar ponteiros em int
Lcd_chr(2,2,menuFuleiro[2].string_opcao); // para escrever no display e

Enviado:
29 Set 2010 10:21
por Red Neck Guy
cristian escreveu:esta funçao aqui da erro ,nuca tinha visto esta forma de declarar const
entao montei e testei mas da erro
- Código: Selecionar todos
void funcao_do_menu_01(void)
{
}
void funcao_do_menu_02(void)
{
}
void funcao_do_menu_03(void)
{
}
typedef struct{
const char *string_opcao;
unsigned char(*func_menu)(void);
}sMenu;
#define NUM_OPCOES_MENU 4
const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
{"Opcao 01",funcao_do_menu_01},
{"Opcao 02",funcao_do_menu_02},
{"Opcao 03",funcao_do_menu_03},
{"sair"}
};
66 319 Cannot cast '' to ''
66 325 Too many initializers
mesmo declarando as funçoes deu erro e o NULL no mikroc nao aceitou
me explica esta funçao ai pode ser
Acho que é pq na estrutura o tipo do ponteiro para função é do tipo
unsigned char(*pFunc)(void), tu tens duas opções aqui. Alterar o tipo do ponteiro na estrutura para
void(*pFunc)(void) ou alterar as tuas funções para serem do tipo
unsigned char func(void).
Vou escrever em negrito só para frisar, não me entendam mal:
Em ANSI C o nome de uma função sem parenteses é um ponteiro para ela, ou seja sempre que uso algo do tipo
void *ponteiro = (void*)nomeFunc estou pegando o endereço de entrada da função. Logo posso usar somente o nome em qualquer lugar onde seja necessário o endereço, como no caso de uma inicialização de constante.

Enviado:
29 Set 2010 10:21
por Red Neck Guy
cristian escreveu:esta funçao aqui da erro ,nuca tinha visto esta forma de declarar const
entao montei e testei mas da erro
- Código: Selecionar todos
void funcao_do_menu_01(void)
{
}
void funcao_do_menu_02(void)
{
}
void funcao_do_menu_03(void)
{
}
typedef struct{
const char *string_opcao;
unsigned char(*func_menu)(void);
}sMenu;
#define NUM_OPCOES_MENU 4
const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
{"Opcao 01",funcao_do_menu_01},
{"Opcao 02",funcao_do_menu_02},
{"Opcao 03",funcao_do_menu_03},
{"sair"}
};
66 319 Cannot cast '' to ''
66 325 Too many initializers
mesmo declarando as funçoes deu erro e o NULL no mikroc nao aceitou
me explica esta funçao ai pode ser
Acho que é pq na estrutura o tipo do ponteiro para função é do tipo
unsigned char(*pFunc)(void), tu tens duas opções aqui. Alterar o tipo do ponteiro na estrutura para
void(*pFunc)(void) ou alterar as tuas funções para serem do tipo
unsigned char func(void).
Vou escrever em negrito só para frisar, não me entendam mal:
Em ANSI C o nome de uma função sem parenteses é um ponteiro para ela, ou seja sempre que uso algo do tipo
void *ponteiro = (void*)nomeFunc estou pegando o endereço de entrada da função. Logo posso usar somente o nome em qualquer lugar onde seja necessário o endereço, como no caso de uma inicialização de constante.

Enviado:
29 Set 2010 10:21
por Red Neck Guy
cristian escreveu:esta funçao aqui da erro ,nuca tinha visto esta forma de declarar const
entao montei e testei mas da erro
- Código: Selecionar todos
void funcao_do_menu_01(void)
{
}
void funcao_do_menu_02(void)
{
}
void funcao_do_menu_03(void)
{
}
typedef struct{
const char *string_opcao;
unsigned char(*func_menu)(void);
}sMenu;
#define NUM_OPCOES_MENU 4
const sMenu menuFuleiro[NUM_OPCOES_MENU] =
{
{"Opcao 01",funcao_do_menu_01},
{"Opcao 02",funcao_do_menu_02},
{"Opcao 03",funcao_do_menu_03},
{"sair"}
};
66 319 Cannot cast '' to ''
66 325 Too many initializers
mesmo declarando as funçoes deu erro e o NULL no mikroc nao aceitou
me explica esta funçao ai pode ser
Acho que é pq na estrutura o tipo do ponteiro para função é do tipo
unsigned char(*pFunc)(void), tu tens duas opções aqui. Alterar o tipo do ponteiro na estrutura para
void(*pFunc)(void) ou alterar as tuas funções para serem do tipo
unsigned char func(void).
Vou escrever em negrito só para frisar, não me entendam mal:
Em ANSI C o nome de uma função sem parenteses é um ponteiro para ela, ou seja sempre que uso algo do tipo
void *ponteiro = (void*)nomeFunc estou pegando o endereço de entrada da função. Logo posso usar somente o nome em qualquer lugar onde seja necessário o endereço, como no caso de uma inicialização de constante.

Enviado:
29 Set 2010 10:26
por fabim
Calma aquino, ja entendemos.. Não precisa exagerar.. hehehe..
Como disse, tem que saber exatamente qual é o tipo... E detalhe, o mikroC odeia isso, da um pau lascado. Pode testar a vontreeeeeeee.. hehehe

Enviado:
29 Set 2010 10:31
por cristian
vcs sao uma onda ....kkkkkkkkkkkkkkkkkkkkkkkkkkk , precisava postar 3 vezes
fabio
mikroC odeia isso ......quer dizer q ja vai dar pau
vouo alterar