FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Forma eficiente de crear menú con submenú
Hola:
Trabajando en modo consola C# 2019. Quiero hacer un programa de ejemplo sobre creación de menús y submenús como se hacía en la época de antes, solo usando la consola de C#, nada de WindowsForm ni WPF. Los código que hago son muy extensos, muy repetitivos pero fáciles de actualizar si quiere añadir nuevos submenús o funciones. ¿Me pueden dar alguna idea o consejos a la hora de hacer menús y menús? Lo que he hecho hasta ahora es horrible pero funciona. Me da que hay que hacer estructura de diseño antes, de hacer programación directa. Ver vídeo. Código:
using System; namespace Menu_consola_18_cs { class Program { // Variable general para guardar el > de la última opción que haz entrado // en la hora de volver atrás. Por ejemplo: private static int guardarOpcion = 0; static void Main(string[] args) { Console.Title = "Menú de opciones"; // Tamaño ventana consola. // X anchura. Console.WindowWidth = 20; // Y altura. Console.WindowHeight = 5; // Ocultar cursor. Console.CursorVisible = false; // Fondo verde. Console.BackgroundColor = ConsoleColor.Green; // Letras negras. Console.ForegroundColor = ConsoleColor.Black; MenuPrincipal(); } #region Menú principal. public static void MenuPrincipal() { // Almacena la tecla pulsada en la variable. ConsoleKey teclaInicial; // Limpiar pantalla. Console.Clear(); // Posición del cursor del título del MENÚ PRINCIPAL. Console.SetCursorPosition(0, 0); // Título. Console.Write(" MENÚ PRINCIPAL "); // Pocisión de la hora. Console.SetCursorPosition(4, 2); // Formato numérico dd/MM/yyyy. Console.Write(DateTime.Now.ToString("ddd dd MMM")); // Almacena en la variable una tecla pulsada. teclaInicial = Console.ReadKey(true).Key; // ¿Haz pulsado la tecla Enter? if (teclaInicial == ConsoleKey.Enter) { // Sí. Se ejecuta esta función. MenuOpciones(); } } #endregion #region Menú de opciones principales. public static void MenuOpciones() { // Contador de teclas y navegador. int opcion = 0; opcion = guardarOpcion; // Capturar tecla para luego validar. ConsoleKey tecla; while (true) { //****************************************************************** // Dibujo el menú principal. // Limpiar pantalla. Console.Clear(); switch (opcion) { case 0: Console.SetCursorPosition(0, 0); Console.Write("> Opción A. "); Console.SetCursorPosition(0, 1); Console.Write(" Opción B. "); Console.SetCursorPosition(0, 2); Console.Write(" Opción C. "); Console.SetCursorPosition(0, 3); Console.Write(" Salir. "); break; case 1: Console.SetCursorPosition(0, 0); Console.Write(" Opción A. "); Console.SetCursorPosition(0, 1); Console.Write("> Opción B. "); Console.SetCursorPosition(0, 2); Console.Write(" Opción C. "); Console.SetCursorPosition(0, 3); Console.Write(" Salir. "); break; case 2: Console.SetCursorPosition(0, 0); Console.Write(" Opción A. "); Console.SetCursorPosition(0, 1); Console.Write(" Opción B. "); Console.SetCursorPosition(0, 2); Console.Write("> Opción C. "); Console.SetCursorPosition(0, 3); Console.Write(" Salir. "); break; case 3: Console.SetCursorPosition(0, 0); Console.Write(" Opción A. "); Console.SetCursorPosition(0, 1); Console.Write(" Opción B. "); Console.SetCursorPosition(0, 2); Console.Write(" Opción C. "); Console.SetCursorPosition(0, 3); Console.Write("> Salir. "); 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 (opcion) { case 0: OpcionA(); break; case 1: OpcionB(); break; case 2: OpcionC(); break; case 3: guardarOpcion = 0; MenuPrincipal(); break; default: break; } } // Flecha abajo del teclado. if (tecla == ConsoleKey.DownArrow) { opcion++; } // Flecha arriba del teclado. if (tecla == ConsoleKey.UpArrow) { opcion--; } // Si está en la última opción del menú, salta a la primera. if (opcion > 3) { opcion = 0; } // Si está en la primera posición del menú, salta a la última. if (opcion < 0) { opcion = 3; } } } #endregion #region Opción A (0). public static void OpcionA() { ConsoleKey teclaOpcionA; Console.Clear(); do { Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción A."); Console.SetCursorPosition(0, 2); Console.WriteLine("Pulse Enter para"); Console.SetCursorPosition(0, 3); Console.WriteLine("Salir."); // Almacena el teclado pulsado en la variable teclaSubMenuA. teclaOpcionA = Console.ReadKey(true).Key; } while (teclaOpcionA != ConsoleKey.Enter); } #endregion #region Opción B (1). public static void OpcionB() { // Contador de teclas y navegador. int opcionB = 0; // Capturar tecla para luego validar. ConsoleKey teclaOpcionB; while (true) { switch (opcionB) { case 0: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B. "); Console.SetCursorPosition(0, 1); Console.WriteLine("> SubOpción B-1. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" SubOpción B-2 "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 1: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" SubOpción B-1. "); Console.SetCursorPosition(0, 2); Console.WriteLine("> SubOpción B-2 "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 2: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" SubOpción B-1. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" SubOpción B-2 "); Console.SetCursorPosition(0, 3); Console.WriteLine("> Salir. "); break; default: Console.Write("Fuera de rango. "); break; } // Leer tecla ingresada por el usuario. teclaOpcionB = Console.ReadKey(true).Key; // Validar el tipo de tecla. if (teclaOpcionB == ConsoleKey.Enter) { switch (opcionB) { case 0: OpcionB1(); break; case 1: OpcionB2(); break; case 2: guardarOpcion = 1; MenuOpciones(); break; default: Console.Write("Fuera de rango. "); break; } } if (teclaOpcionB == ConsoleKey.DownArrow) { opcionB++; } if (teclaOpcionB == ConsoleKey.UpArrow) { opcionB--; } // Si está en la última opción, salta a la primera. if (opcionB > 2) { opcionB = 0; } // Si está en la primera posición, salta a la última. if (opcionB < 0) { opcionB = 2; } } } #endregion #region Opcion B-1. public static void OpcionB1() { ConsoleKey teclaOpcionB1; Console.Clear(); do { Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B-1."); Console.SetCursorPosition(0, 2); Console.WriteLine("Pulse Enter para "); Console.SetCursorPosition(0, 3); Console.WriteLine("volver atrás. "); // Almacena el teclado pulsado en la variable teclaSubMenuA. teclaOpcionB1 = Console.ReadKey(true).Key; } while (teclaOpcionB1 != ConsoleKey.Enter); } #endregion #region Opcion B-2. public static void OpcionB2() { ConsoleKey teclaOpcionB2; Console.Clear(); do { Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción B-2."); Console.SetCursorPosition(0, 2); Console.WriteLine("Pulse Enter para "); Console.SetCursorPosition(0, 3); Console.WriteLine("volver atrás. "); // Almacena el teclado pulsado en la variable teclaSubMenuA. teclaOpcionB2 = Console.ReadKey(true).Key; } while (teclaOpcionB2 != ConsoleKey.Enter); } #endregion #region Opción C (2). public static void OpcionC() { // Contador de teclas y navegador. int opcionC = 0; // Capturar tecla para luego validar. ConsoleKey teclaOpcionC; Console.Clear(); while(true) { switch (opcionC) { case 0: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C. "); Console.SetCursorPosition(0, 1); Console.WriteLine("> Color 1. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 2. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Opción C-1. "); break; case 1: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 1. "); Console.SetCursorPosition(0, 2); Console.WriteLine("> Color 2. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Opción C-1. "); break; case 2: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 1. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 2. "); Console.SetCursorPosition(0, 3); Console.WriteLine("> Opción C-1. "); break; case 3: Console.SetCursorPosition(0, 0); Console.WriteLine("> Color 3. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 4. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 5. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 4: Console.SetCursorPosition(0, 0); Console.WriteLine(" Color 3. "); Console.SetCursorPosition(0, 1); Console.WriteLine("> Color 4. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 5. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 5: Console.SetCursorPosition(0, 0); Console.WriteLine(" Color 3. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 4. "); Console.SetCursorPosition(0, 2); Console.WriteLine("> Color 5. "); Console.SetCursorPosition(0, 3); Console.WriteLine(" Salir. "); break; case 6: Console.SetCursorPosition(0, 0); Console.WriteLine(" Color 3. "); Console.SetCursorPosition(0, 1); Console.WriteLine(" Color 4. "); Console.SetCursorPosition(0, 2); Console.WriteLine(" Color 5. "); Console.SetCursorPosition(0, 3); Console.WriteLine("> Salir. "); break; default: Console.Write("Fuera de rango. "); break; } // Leer tecla ingresada por el usuario. teclaOpcionC = Console.ReadKey(true).Key; // Validar el tipo de tecla. if (teclaOpcionC == ConsoleKey.Enter) { switch (opcionC) { case 0: // Fondo azul. Console.BackgroundColor = ConsoleColor.Blue; // Letras blancas. Console.ForegroundColor = ConsoleColor.White; break; case 1: // Fondo verde. Console.BackgroundColor = ConsoleColor.Green; // Letras negras. Console.ForegroundColor = ConsoleColor.Black; break; case 2: OpcionC1(); break; case 3: // Fondo negro. Console.BackgroundColor = ConsoleColor.Black; // Letras rojo. Console.ForegroundColor = ConsoleColor.Red; break; case 4: // Fondo negro. Console.BackgroundColor = ConsoleColor.Black; // Letras rojo. Console.ForegroundColor = ConsoleColor.Yellow; break; case 5: // Fondo negro. Console.BackgroundColor = ConsoleColor.Red; // Letras rojo. Console.ForegroundColor = ConsoleColor.DarkRed; break; case 6: guardarOpcion = 2; MenuOpciones(); break; default: Console.Write("Fuera de rango. "); break; } } if (teclaOpcionC == ConsoleKey.DownArrow) { opcionC++; } if (teclaOpcionC == ConsoleKey.UpArrow) { opcionC--; } // Si está en la última opción, salta a la primera. if (opcionC > 6) { opcionC = 0; } // Si está en la primera posición, salta a la última. if (opcionC < 0) { opcionC = 6; } } } #endregion #region OpcionC-1. public static void OpcionC1() { // Contador de teclas y navegador. int opcionC1 = 0; // Capturar tecla para luego validar. ConsoleKey teclaOpcionC1; Console.Clear(); while(true) { Console.Clear(); switch (opcionC1) { case 0: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C-1."); Console.SetCursorPosition(0, 2); Console.WriteLine(" SI"); Console.SetCursorPosition(16, 2); Console.WriteLine("> NO"); break; case 1: Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción C-1."); Console.SetCursorPosition(0, 2); Console.WriteLine("> SI"); Console.SetCursorPosition(16, 2); Console.WriteLine(" NO"); break; default: Console.Write("Fuera de rango. "); break; } // Leer tecla ingresada por el usuario. teclaOpcionC1 = Console.ReadKey(true).Key; // Validar el tipo de tecla. if (teclaOpcionC1 == ConsoleKey.Enter) { switch (opcionC1) { case 0: guardarOpcion = 2; MenuPrincipal(); //Console.Clear(); break; case 1: OpcionSI(); break; default: Console.Write("Fuera de rango. "); break; } } // Flecha derecha. if (teclaOpcionC1 == ConsoleKey.RightArrow) { opcionC1++; } // Flecha izquierda. if (teclaOpcionC1 == ConsoleKey.LeftArrow) { opcionC1--; } // Si está en la última opción, salta a la primera. if (opcionC1 > 1) { opcionC1 = 0; } // Si está en la primera posición, salta a la última. if (opcionC1 < 0) { opcionC1 = 1; } } } #endregion #region opcionSI del sub menú C-1. public static void OpcionSI() { ConsoleKey teclaOpcionB1; Console.Clear(); do { Console.SetCursorPosition(0, 0); Console.WriteLine("Estás en Opción SÍ."); Console.SetCursorPosition(0, 2); Console.WriteLine("Pulse Enter para "); Console.SetCursorPosition(0, 3); Console.WriteLine("volver atrás. "); // Almacena el teclado pulsado en la variable teclaOpciónB1. teclaOpcionB1 = Console.ReadKey(true).Key; } while (teclaOpcionB1 != ConsoleKey.Enter); } #endregion } }
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino. Última edición por Casimiro Notevi fecha: 07-04-2020 a las 10:03:07. |
#2
|
||||
|
||||
¿Te sirve usar una librería que resuelva todo?
https://github.com/sushihangover/CursesSharp Sino, comenzaría a investigar las listas que te provee el framework, para armar algo mas programático. Saludos!
__________________
delphi.com.ar Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla. |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
forma mas eficiente de saber si existe un usuario en firebird? | erickperez6 | Firebird e Interbase | 0 | 18-06-2014 05:29:09 |
Ingresar 2.789.636 registro en una tabla de forma eficiente | Chaja | Conexión con bases de datos | 15 | 12-04-2012 19:52:35 |
menu y submenú | cmfab | Varios | 4 | 08-03-2011 14:19:37 |
Alguna forma más eficiente de enviar HTML al navegador-cliente ??? | chalao | Internet | 8 | 16-10-2008 18:23:03 |
Forma eficiente de manejar arrays de 10'000.000 cuadrados | mamcx | OOP | 6 | 15-09-2006 21:01:12 |
|