Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   .NET (https://www.clubdelphi.com/foros/forumdisplay.php?f=17)
-   -   Reducir código (https://www.clubdelphi.com/foros/showthread.php?t=96801)

REHome 26-07-2024 22:55:52

Reducir código
 
Hola:

Este código me ayudaron hace unos años pero no me gusta mucho, usa dos Switch -case, uno para el dibujado y el otro acciones cuando pulsa Enter. Los menús se eligen con las flechas.

¿Es posible mejorarlo que no quede tan feo, malo, mucho códigos de más, etc?

Código:

// El menú principal que muestra nada más ejecutar el programa.

// ** MENÚ PRINCIPAL **
// > ESTADO PRINCIPAL
//  NOMBRES ENTRADAS
//  NOMBRES SALIDAS

// -------------------

// ** MENÚ PRINCIPAL **
//  ENTRADA ANALÓGICA
//  CONFIGURACIÓN
//  ACERCA DE...

// -------------------

// ** MENÚ PRINCIPAL **
//  AYUDA
//  EXTRA
//  INICIO

using System;

namespace LCD_Menu_con_submenus_Consola_03
{
    public class MenuPrincipal
    {
        public static void Menu_Principal()
        {
            // 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 = 8;    // Total de opciones para seleccionar y fija.

            // Capturar tecla para luego validar.
            ConsoleKey tecla;

            // Limpiar pantalla.
            Console.Clear();

            do
            {
                //******************************************************************
                // Dibujo el menú principal.

                // Cursor invisible.
                Console.CursorVisible = false;

                string[] OPCIONES =
                {
                    "** MENÚ PRINCIPAL **", // Posición 0.
                    "  ESTADO PRINCIPAL  ", // 1
                    "  NOMBRE ENTRADAS  ", // 2
                    "  NOMBRE SALIDAS    ", // 3
                    "  ENTRADA ANALÓGICA ", // 4
                    "  CONFIGURACIÓN    ", // 5
                    "  ACERCA DE...      ", // 6
                    "  AYUDA            ", // 7
                    "  EXTRA            ", // 8
                    "  INICIO            ", // 9
                    "                    ", // 10
                    ">"                    // 11
                };

                switch (indiceSeleccionado)
                {
                    case 0:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[1]);        // > ESTADO PRINCIPAL 
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[11]);        // >
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[2]);        //  NOMBRE ENTRADAS     
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[3]);        //  NOMBRE SALIDAS 
                        break;

                    case 1:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[1]);        //  ESTADO PRINCIPAL 
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[2]);        // > NOMBRE ENTRADAS     
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[11]);        // >
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[3]);        //  NOMBRE SALIDAS 
                        break;

                    case 2:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[1]);        //  ESTADO PRINCIPAL 
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[2]);        //  NOMBRE ENTRADAS     
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[3]);        // > NOMBRE SALIDAS 
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[11]);        // >
                        break;

                    case 3:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[4]);        // > ENTRADA ANALÓGICA   
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[11]);        // >
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[5]);        //  CONFIGURACIÓN   
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[6]);        //  ACERCA DE...           
                        break;

                    case 4:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[4]);        //  ENTRADA ANALÓGICA   
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[5]);        // > CONFIGURACIÓN
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[11]);        // >
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[6]);        //  ACERCA DE...
                        break;

                    case 5:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[4]);        //  ENTRADA ANALÓGICA
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[5]);        //  CONFIGURACIÓN
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[6]);        // > ACERCA DE...           
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[11]);        // >
                        break;

                    case 6:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[7]);        // > AYUDA
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[11]);        // >
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[8]);        //  EXTRA     
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[9]);        //  INICIO           
                        break;

                    case 7:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[7]);        //  AYUDA     
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[8]);        // > EXTRA   
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[11]);        // >
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[9]);        //  INICIO     
                        break;

                    case 8:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(OPCIONES[0]);        // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(OPCIONES[7]);        //  AYUDA
                        Console.SetCursorPosition(0, 2);
                        Console.Write(OPCIONES[8]);        //  EXTRA     
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[9]);        // > INICIO
                        Console.SetCursorPosition(0, 3);
                        Console.Write(OPCIONES[11]);        // >
                        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:
                            EstadoPrincipal.Estado_Principal();
                            break;
                        case 1:
                            NombreEntradas.NombreEntradas_Principal();
                            break;
                        case 2:
                            NombresSalidas.NombreSalidas_Principal();                         
                            break;
                        case 3:
                            // Opcion();
                            break;
                        case 4:
                            //
                            break;
                        case 5:
                            AcercaDe.Acerca_De();
                            break;
                        case 6:
                            //
                            break;
                        case 7:
                            //
                            break;
                        case 8:
                            salir = true;
                            //opcion = 0; // Vuelve al menú principal.
                            break;
                        default:
                            Console.Write("Fuera de rango.    ");
                            break;
                    }
                }

                // ¿Has pulsado tecla flecha Abajo?
                else if (tecla == ConsoleKey.DownArrow)
                {
                    indiceSeleccionado++;
                }

                // Entonces si pulsas tecla flecha Arriba.
                else 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;
                }
                // Uso la tecla escape como salida.
            } while (salir == false);
        }
    }
}


Casimiro Notevi 27-07-2024 12:59:58

Si funciona, no lo toques :D

mamcx 27-07-2024 22:32:34

Una mejora simple es convertir las `opciones` y los `indices` en enums, crearles un método para imprimir el texto y hacer solo switch con enums. No quedara muy reducido pero es mas claro.

REHome 28-07-2024 02:13:06

Cita:

Empezado por Casimiro Notevi (Mensaje 556860)
Si funciona, no lo toques :D

Hay casos que no siempre es así. Eso de tener dos Switch como que no. Se puede reducir.

En cuanto al enum. ¿Qué más da si enum y un array, el rollo es conseguir esa información.

REHome 28-07-2024 16:52:59

Dentro de un tiempo lo hago con otro ejemplo desde cero para que se entienda mejor.

mamcx 28-07-2024 20:44:46

Cita:

Empezado por REHome (Mensaje 556862)
En cuanto al enum. ¿Qué más da si enum y un array, el rollo es conseguir esa información.


En términos generales, es mejor modelar con `tipos` que con `algoritmos`.


Por ejemplo, si quieres definir que algo esta ordenado, puedes hacer un algoritmo de `sort` O (mejor) usas una estructura como un `Btree`, que esta ordenada por construcción.


Igual, es lo mismo decir que tienes 2 posiciones en pantalla con `[1,2]` que con `Point{x:1,y:2}`, pero la segunda es mas clara.


El uso de enums aquí hace mas correcto el código, ya que crea una lista finita y explicita de opciones, en cambio, un integer es 'valido' para todo el rango del 'i32'.

tsk 28-07-2024 21:20:49

Lo podrías hacer de muchas formas, pero revisa la siguientes bibliotecas, tal vez te sean de utilidad.

https://github.com/gui-cs/Terminal.Gui
https://github.com/MV10/dotnet-curses
https://spectreconsole.net/
https://github.com/lechu445/ConsoleMenu

Así de buenas me iría primero por Terminal.Gui

Y es relativamente sencillo iniciar con esta biblioteca.

Código:

dotnet new console
dotnet add package Terminal.Gui

Y si quieres puedes usar una interfaz para crear diseñar la vista por medio de una aplicación que se llama TerminalGuiDesigner que la puedes instalar de la siguiente forma.

Código:

dotnet tool install --global TerminalGuiDesigner
Este programa te facilita crear la GUI, por ejemplo

https://imgur.com/a/2Ojlk53

Al principio te podría parecer un poco complejo, pero podrías obtener un resultado más profesional

Además podrías seguir el siguiente tutorial para aprender a usarlo.

https://markjames.dev/blog/developin...player-csharp/


La franja horaria es GMT +2. Ahora son las 07:02:54.

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