Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > .NET
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 06-04-2020
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 454
Poder: 21
REHome Va por buen camino
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
    }
}
Saludos.
__________________
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.
Responder Con Cita
  #2  
Antiguo 27-04-2020
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 26
delphi.com.ar Va por buen camino
¿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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 02:11:37.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi