listas

eva
06 de Junio del 2006
Hola, estoy haciendo un trabajillo y me ha surgido un problema; es un menú con
listas, al compilar el programa aparece la palabra inicio, si pulsamos F10
nos aparece el menu principal que deberia tener cindo opciones, pero solo me
aparecen cuatro ¿sabrían por que?, y si pulso intro en la opción clientes que
es la primera, se me desplega un menú que igual debería tener cinco opciones
pero solo aparecen cuatro. Al aparecer el sub-menú desaparece el menú principal
y lo que quiero es q este siga visible, para irnos del menú secundario al principal
lo hacemos con ESC. Si pudieran ayudarme. Muchas gracias.


#include<conio.h>
#include<stdio.h>

//******************************INTERFAZ*******************************

typedef struct nodoppal
{
int indice;
char cabecera[30];
struct nodoppal *ant, *sig;
}nodoDP;

typedef struct nodosecundario
{
int indice2;
char opcion[40];
struct nodosecundario *ant, *sig;
}nodoDS;

//******************************++++++++*******************************


void menu(nodoDP **pmenu, nodoDP **fmenu);
void menu_secundario(nodoDS **smenu, nodoDS **xmenu);
void control(nodoDP *pmenu, nodoDP *fmenu, nodoDS *smenu, nodoDS *xmenu);

void visualizar_menu(nodoDP *pmenu, nodoDP *fmenu, int indice);
void visualizar_menu_secundario(nodoDS *smenu, nodoDS *xmenu, int indice);


void main()
{
nodoDP *pmenu, *fmenu;
nodoDP *smenu, *xmenu;
clrscr();
menu(&pmenu,&fmenu);
menu_secundario(&smenu,&xmenu);
control(pmenu,fmenu,smenu,xmenu);
}

void control(nodoDP *pmenu, nodoDP *fmenu,nodoDS *smenu, nodoDS *xmenu)

{
int F10=0;
char tecla,tecla2, pantalla[4096];
int indice=1;
int indice2=1;
clrscr();
do
{
textbackground(BLUE);
gotoxy(1,24);
cprintf("INICIO");
tecla=getch();
if(tecla==0)
tecla=getch();
switch(tecla)
{
case 0x44://F10
F10=1; //F10 pulsado-> visulizar desplegable ppal.
break;
case 13://enter
gettext(1,1,80,25,pantalla);
do
{
tecla2=getch();
if(tecla2==0)
tecla2=getch();
switch(indice)
{
case 1:
case 2:
case 3:
case 4:
case 5:
switch(tecla2)
{
case 0x48://abajo
indice2++;
if(indice2>5)
indice2=1;
break;
case 0x50://abajo
indice2--;
if(indice2<1)
indice2=5;
break;
}//switch
visualizar_menu_secundario(smenu,xmenu,indice2);
break;
}//switch
}while(tecla2!=27);
puttext(1,1,80,25,pantalla);
break;
case 27://Escape
F10=0; //indica que se debe ocultar el desplegable ppal.
break;
case 0x48://arriba
indice++;
if(indice>5) indice=1;
break;
case 0x50://abajo
indice--;
if(indice<1) indice=5;
break;
}//switch
if(F10==1)
visualizar_menu(pmenu,fmenu,indice);
//si se ha pulsado F10, dibujar el desp.ppal
//visualizar_menu();
}while(tecla!=0x2D); //pide teclas mientras no pulsemos alt+x
}

void menu(nodoDP **pmenu, nodoDP **fmenu)
{
nodoDP *nuevo;
char op[5][30]={"Clientes ",
"Solicitud ",
"Reserva ",
"Proveedores ",
"Facturas "};
int i;
*pmenu=NULL;
*fmenu=NULL;
for(i=0;i<5;i++)
{
nuevo=(nodoDP *)malloc (sizeof(nodoDP));
if(*pmenu==NULL)
{
nuevo->indice=i+1;
strcpy(nuevo->cabecera,op[i]);
nuevo->ant=nuevo;
nuevo->sig=nuevo;
*pmenu=nuevo;
*fmenu=nuevo;
}//if
else
{
nuevo->indice=i+1;
strcpy(nuevo->cabecera,op[i]);
nuevo->ant=*fmenu;
nuevo->sig=*pmenu;
(*fmenu)->sig=nuevo;
*fmenu=nuevo;
}//else
}//for
}

void visualizar_menu(nodoDP *pmenu, nodoDP *fmenu, int indice)
{
nodoDP *control,*aux;
int fila;
int op=1;
aux=pmenu;
control=pmenu;
clrscr();
fila=23;
while(pmenu!=NULL&&pmenu->sig!=control)
{
gotoxy(1,fila);
if(op!=indice)
{
textbackground(BLACK);
textcolor(WHITE);
}
else
{
textbackground(RED);
textcolor(WHITE);
}
cprintf("%s",pmenu->cabecera);
fila--;
pmenu=pmenu->sig;
op++;
}
}

void menu_secundario(nodoDS **smenu, nodoDS **xmenu)
{
nodoDS *nuevo;
char op[5][30]={"Altas ",
"Bajas ",
"Buscar ",
"Ver Datos ",
"Modificar "};
int i;
*smenu=NULL;
*xmenu=NULL;
for(i=0;i<5;i++)
{
nuevo=(nodoDS *)malloc (sizeof(nodoDS));
if(*smenu==NULL)
{
nuevo->indice2=i+1;
strcpy(nuevo->opcion,op[i]);
nuevo->ant=nuevo;
nuevo->sig=nuevo;
*smenu=nuevo;
*xmenu=nuevo;
}//if
else
{
nuevo->indice2=i+1;
strcpy(nuevo->opcion,op[i]);
nuevo->ant=*xmenu;
nuevo->sig=*smenu;
(*xmenu)->sig=nuevo;
*xmenu=nuevo;
}//else
}//for
}

void visualizar_menu_secundario(nodoDS *smenu, nodoDS *xmenu, int indice2)

{
nodoDS *control,*aux;
int fila;
int op=1;
aux=smenu;
control=smenu;
clrscr();
fila=23;
while(smenu!=NULL&&smenu->sig!=control)
{
gotoxy(14,fila);
if(op!=indice2)
{
textbackground(BLACK);
textcolor(WHITE);
}
else
{
textbackground(BLUE);
textcolor(WHITE);
}
cprintf("%s",smenu->opcion);
fila--;
smenu=smenu->sig;
op++;
}
}