A veces entro en una función void, como que se llama así mismo y el programa no funciona como debería.
En la pila de llamadas muestra esto.
Ver zoom.
Como puedes ver en la imagen en la Pila de llamadas, cada vez que intento salir del submenú, se repite cada vez más y en este caso hay tres, Volumen() y otras tres AjustesPrincipal(). Tiene que salir desde que salga, no que tenga comportamiento de este tipo.
Dejo código por si les dice algo en C# en modo consola.
Volumen();
Código
// ** VOLUMEN ** //> Vol: ■■■■■■-- 6 // //> ATRÁS > INICIO using LCD_Menu_con_submenus_Consola_03.Ventana01; using System; namespace LCD_Menu_con_submenus_Consola_03.Ventana03 { public class _0_Volumen { static int volumen = 6; public static void Volumen() { // Variables. string[] TEXTO = { " ** VOLUMEN ** ", // Posición 0. " Vol: ", // 1 "■", // 2 "-", // 3 "ATRÁS", // 4 "INICIO", // 5 ">", // 6 " " // 7 }; const int VOLMEN_MAX = 8; int opcion = 0; // 0 = Volumen, 1 = ATRÁS y 2 = INICIO. ConsoleKey teclaVolumen; // Limpiar pantalla. Console.Clear(); // Mostrar menú. MostrarMenu(); do { // ¿Están en la opción Volumen o 0? if (opcion == 0) { // Sí. Mostrar volumen. MostrarVolumen(); } // Captura tecla y lo guarda en la variable teclaVolumen. teclaVolumen = Console.ReadKey(true).Key; // ¿Están en la opción Volumen o 0? if (opcion == 0) { // Sí. Controlar el volumen. if ((teclaVolumen == ConsoleKey.RightArrow) && (volumen < VOLMEN_MAX)) { volumen++; } else if ((teclaVolumen == ConsoleKey.LeftArrow) && (volumen > 0)) { volumen--; } else if ((teclaVolumen == ConsoleKey.UpArrow) || (teclaVolumen == ConsoleKey.DownArrow)) { opcion = 1; // 1 = ATRÁS. } } else // No. Mientras. { // Navegar entre ATRÁS e INICIO. if ((teclaVolumen == ConsoleKey.LeftArrow) && (opcion == 2)) { opcion = 1; // 1 = ATRÁS. } else if ((teclaVolumen == ConsoleKey.RightArrow) && (opcion == 1)) { opcion = 2; // 2 = INICIO. } else if ((teclaVolumen == ConsoleKey.UpArrow) || (teclaVolumen == ConsoleKey.DownArrow)) { opcion = 0; // 0 = Volumen. } } // Mostrar menú. MostrarMenu(); } while (teclaVolumen != ConsoleKey.Enter || opcion == 0)); // Acción al pulsar Enter. if (opcion == 1) { // ATRÁS. _0_Ajustes.AjustesPrincipal(); } else if (opcion == 2) { // INICIO. Inicio.InicioPrincipal(); } // Mostrar dibujado en pantalla. void MostrarVolumen() { Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** VOLUMEN ** Console.SetCursorPosition(1, 1); Console.Write(TEXTO[1]); // Vol: for (int i = 0; i < volumen; i++) { Console.Write(TEXTO[2]); // ■ } for (int j = 0; j < (VOLMEN_MAX - volumen); j++) { Console.Write(TEXTO[3]); // - } // Mostrar el volumen en número. Console.SetCursorPosition(16, 1); Console.Write(volumen); } void MostrarMenu() { Console.SetCursorPosition(2, 3); Console.Write(TEXTO[4]); // ATRÁS Console.SetCursorPosition(13, 3); Console.Write(TEXTO[5]); // INICIO Console.SetCursorPosition(0, 1); Console.Write(TEXTO[7]); // Console.SetCursorPosition(0, 3); Console.Write(TEXTO[7]); // Console.SetCursorPosition(11, 3); Console.Write(TEXTO[7]); // // ¿Es 0 = Volumen? if (opcion == 0) { // Sí. Indica esta posición del cursor. Console.SetCursorPosition(0, 1); } // No. Entonces, ¿ 1 = ATRÁS? else if (opcion == 1) { // Sí. Indica esta posición del cursor. Console.SetCursorPosition(0, 3); } // No. Entonces, ¿2 = INICIO? else if (opcion == 2) { // Sí. Indica esta posición del cursor. Console.SetCursorPosition(11, 3); } // Muestra el caracter >. Console.Write(TEXTO[6]); // > } } } }
AjustesPrincipal():
Código
// ** AJUSTES ** // > Volumen. // Brillo/Contraste // [x] Beep. // ** AJUSTES ** // > [x] Luz de fondo. // ATRÁS // INICIO using LCD_Menu_con_submenus_Consola_03.Ventana03; using System; namespace LCD_Menu_con_submenus_Consola_03.Ventana01 { public class _0_Ajustes { public static void AjustesPrincipal() { string[] TEXTO = { " ** AJUSTES ** ", // Posición 0. " Volumen. ", // 1 " Brillo / Contraste", // 2 " [ ] Beep ", // 3 " [ ] Luz de fondo. ", // 4 " ATRÁS ", // 5 " INICIO ", // 6 ">", // 7 "x", // 8 " " // 9 }; // Contador de teclas y navegador. sbyte indiceSeleccionado = 0; // Índice seleccionado de cada opción del menú. bool salir = false; // Para salir del menú principal al INICIO. const sbyte SELECCION_OPCIONES_TOTALES = 5; // Total de opciones para seleccionar y fija. // Capturar tecla para luego validar. ConsoleKey tecla; do { //****************************************************************** // Dibujo el menú principal. switch (indiceSeleccionado) { case 0: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** AJUSTES ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[1]); // > Volumen. Console.SetCursorPosition(0, 1); Console.Write(TEXTO[7]); // > Console.SetCursorPosition(0, 2); Console.Write(TEXTO[2]); // Brillo / Contraste Console.SetCursorPosition(0, 3); Console.Write(TEXTO[3]); // [ ] Beep. break; case 1: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** AJUSTES ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[1]); // Volumen. Console.SetCursorPosition(0, 2); Console.Write(TEXTO[2]); // > Brillo / Contraste Console.SetCursorPosition(0, 2); Console.Write(TEXTO[7]); // > Console.SetCursorPosition(0, 3); Console.Write(TEXTO[3]); // [ ] Beep. break; case 2: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** AJUSTES ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[1]); // Volumen. Console.SetCursorPosition(0, 2); Console.Write(TEXTO[2]); // Brillo / Contraste Console.SetCursorPosition(0, 3); Console.Write(TEXTO[3]); // > [ ] Beep. Console.SetCursorPosition(0, 3); Console.Write(TEXTO[7]); // > break; case 3: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** AJUSTES ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[4]); // > [ ] Luz de fondo. Console.SetCursorPosition(0, 1); Console.Write(TEXTO[7]); // > Console.SetCursorPosition(0, 2); Console.Write(TEXTO[5]); // ATRÁS Console.SetCursorPosition(0, 3); Console.Write(TEXTO[6]); // INICIO break; case 4: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** AJUSTES ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[4]); // [ ] Luz de fondo. Console.SetCursorPosition(0, 2); Console.Write(TEXTO[5]); // > ATRÁS Console.SetCursorPosition(0, 2); Console.Write(TEXTO[7]); // > Console.SetCursorPosition(0, 3); Console.Write(TEXTO[6]); // INICIO break; case 5: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** AJUSTES ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[4]); // [ ] Luz de fondo. Console.SetCursorPosition(0, 2); Console.Write(TEXTO[5]); // ATRÁS Console.SetCursorPosition(0, 3); Console.Write(TEXTO[6]); // > INICIO Console.SetCursorPosition(0, 3); Console.Write(TEXTO[7]); // > break; default: Console.Write("Fuera de rango. "); break; } // Fin de pintar el menú principal. //****************************************************************** // Leer tecla ingresada por el usuario. tecla = Console.ReadKey(true).Key; // Validar el tipo de tecla. if (tecla == ConsoleKey.Enter) { switch (indiceSeleccionado) { case 0: _0_Volumen.Volumen(); break; case 1: break; case 2: break; case 3: break; case 4: salir = true; break; case 5: Inicio.InicioPrincipal(); break; default: Console.Write("Fuera de rango. "); break; } } // ¿Has pulsado tecla flecha Abajo? if (tecla == ConsoleKey.DownArrow) { indiceSeleccionado++; } // Entonces si pulsas tecla flecha Arriba. if (tecla == ConsoleKey.UpArrow) { indiceSeleccionado--; } // Si está en la última opción, salta a la primera. if (indiceSeleccionado > SELECCION_OPCIONES_TOTALES) { indiceSeleccionado = 0; } // Si está en la primera posición, salta a la última. if (indiceSeleccionado < 0) { indiceSeleccionado = SELECCION_OPCIONES_TOTALES; } // Salida del menú. } while (salir == false); } } }
Llevo tiempo sin resolver esto.
Espero que se entienda lo que quiero decir, si no, se lo explico con más capturas.
Muchas gracias.