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 23-07-2024
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 469
Poder: 22
REHome Va por buen camino
Menús y más menús

Buenos días a todos:

Quiero saber de la mejor forma hacer el dibujado de menú con submenú en modo consola en el lenguaje C#. Lo de llamar funciones de cada subemnú es otro cantar, que también se hará, al menos es aprender bien la base. Parece que es mejor trabajar en este tipo de proyecto de forma modular, partes por partes.

El programa tiene que ser capaz de seleccionar menús y submenú solo con las flechas del teclado, Enter y Scape, nada más.

Hoy en día es complicado encontrar gente que domine este tipo de forma de programar antiguo, pero si se usa en LCD para electrónicos.

Dejo un ejemplo en vídeo. Quiero hacer un buen menú y submenó bajo C# de la mejor manera posible y fácil de actualizar.

La resolución está hecho de 20x4.

Ver vídeo.



Un cordial saludos.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.

Última edición por REHome fecha: 23-07-2024 a las 19:13:32.
Responder Con Cita
  #2  
Antiguo 24-07-2024
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.430
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Yo te diría que para empezar, hagas un programa de consola que capture las teclas dentro de un bucle.
Una vez tengas identificadas las teclas "importantes" para tí (flechas, return ESC,...) pasas al siguiente paso de dibujar los menús.
El dibujado es lo más simple, debes tener un procedimiento para dibujar el menú en cada momento (previo limpiar la pantalla).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 24-07-2024
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 469
Poder: 22
REHome Va por buen camino
En un folio tengo hecho las ventanas o páginas señalado por flechas. Para no perderme.

Si quiere en DropBox subo el proyecto para que lo veas, aún está incompleto.

Lo que se ha hecho por ahora es esto.
Program.cs
Código:
// El menú principal que muestra nada más ejecutar el programa.

using System;

namespace LCD_Menu_con_submenus_Consola_03
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // Acceso a la ventana de inicio principal.
            Inicio.InicioPrincipal();
        }
    }
}
MenuPrincipal.cs
Código:
// El menú principal que muestra nada más ejecutar el programa.

// ** MENÚ PRINCIPAL **
// > ESTADO PRINCIPAL
//   NOMBRES RELÉS
//   NOMBRES SENSORES

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

// ** 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
    {
        // Variable global o estática.
        public static int opcion = 0;
        public static void Menu_Principal()
        {
            // Contador de teclas y navegador.
            bool salir = false;
            const int SELECCION_MENU = 8;

            // Capturar tecla para luego validar.
            ConsoleKey tecla;

            // Limpiar pantalla.
            Console.Clear();

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

                // Cursor invisible.
                Console.CursorVisible = false;

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

                switch (opcion)
                {
                    case 0:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(MENSAJES[1]);         // > ESTADO PRINCIPAL  
                        Console.SetCursorPosition(0, 1);
                        Console.Write(MENSAJES[11]);        // >
                        Console.SetCursorPosition(0, 2);
                        Console.Write(MENSAJES[2]);         //   NOMBRE RELÉS      
                        Console.SetCursorPosition(0, 3);
                        Console.Write(MENSAJES[3]);         //   NOMBRE SENSORES   
                        break;

                    case 1:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(MENSAJES[1]);         //   ESTADO PRINCIPAL  
                        Console.SetCursorPosition(0, 2);
                        Console.Write(MENSAJES[2]);         // > NOMBRE RELÉS      
                        Console.SetCursorPosition(0, 2);
                        Console.Write(MENSAJES[11]);        // >
                        Console.SetCursorPosition(0, 3);
                        Console.Write(MENSAJES[3]);         //   NOMBRE SENSORES   
                        break;

                    case 2:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(MENSAJES[1]);         //   ESTADO PRINCIPAL  
                        Console.SetCursorPosition(0, 2);
                        Console.Write(MENSAJES[2]);         //   NOMBRE RELÉS      
                        Console.SetCursorPosition(0, 3);
                        Console.Write(MENSAJES[3]);         // > NOMBRE SENSORES   
                        Console.SetCursorPosition(0, 3);
                        Console.Write(MENSAJES[11]);        // >
                        break;

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

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

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

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

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

                    case 8:
                        Console.SetCursorPosition(0, 0);
                        Console.Write(MENSAJES[0]);         // ** MENÚ PRINCIPAL **
                        Console.SetCursorPosition(0, 1);
                        Console.Write(MENSAJES[7]);         //   AYUDA
                        Console.SetCursorPosition(0, 2);
                        Console.Write(MENSAJES[8]);         //   EXTRA      
                        Console.SetCursorPosition(0, 3);
                        Console.Write(MENSAJES[9]);         // > INICIO
                        Console.SetCursorPosition(0, 3);
                        Console.Write(MENSAJES[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 (opcion)
                    {
                        case 0:
                            EstadoPrincipal.Estado_Principal();
                            break;
                        case 1:
                            NombresReles.NombreReles_Principal();
                            break;
                        case 2:
                            NombreSensores.NombreSensores_Principal();
                            break;
                        case 3:
                            // Opcion();
                            break;
                        case 4:
                            //
                            break;
                        case 5:
                            //
                            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)
                {
                    opcion++;
                }

                // Entonces si pulsas tecla flecha Arriba.
                else if (tecla == ConsoleKey.UpArrow)
                {
                    opcion--;
                }

                // Si está en la última opción, salta a la primera.
                if (opcion > SELECCION_MENU)
                {
                    opcion = 0;
                }

                // Si está en la primera posición, salta a la última.
                if (opcion < 0)
                {
                    opcion = SELECCION_MENU;
                }
                // Uso la tecla escape como salida.
            } while (salir == false);
        }
    }
}
Inicio.cs
Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LCD_Menu_con_submenus_Consola_03
{
    public class Inicio
    {
        public static void InicioPrincipal()
        {
            // Almacena la tecla pulsada en la variable.
            ConsoleKey teclaInicial;

            do
            {
                // Establece el ancho y alto de la ventana.
                Console.SetWindowSize(20, 5);

                // Limpiar pantalla.
                Console.Clear();

                // Posición del cursor del título del MENÚ PRINCIPAL.
                Console.SetCursorPosition(0, 0);

                // Título.
                Console.Write("       INICIO       ");

                // Pocisión de la hora.
                Console.SetCursorPosition(4, 2);

                // Formato numérico dd/MM/yyyy.
                Console.Write(DateTime.Now.ToString("ddd dd MMM"));

                // Cursor invisible.
                Console.CursorVisible = false;

                // 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.
                    MenuPrincipal.Menu_Principal();
                }

            } while (teclaInicial != ConsoleKey.Escape);

            // Menú principal.
            // ---------------------------------------------------
            // MenuPrincipal.Menu_Principal();
            // NombresReles.NombreReles_Principal();
            // EstadoPrincipal.Estado_Principal();
        }
    }
}
No pongo más código porque es mucho.

La idea es que funcione bien. Con un Wiondows Form, solo con un botón, cierra o oculta la página o furmulario actual y llamas al otro, la idea que en consolas es más complicado. Sobre todo usando solo flechas del teclado, Enter y Scape.

Esta forma de programar me enseñó un amigo pero todo el mundo dice que este código es horrible,

Usa dos Switch cuando solo hace falta uno dentro de un do While.

La verdad, quiero aprender y diseñar bien elegir páginas o ventanas y que se llamen entre ellas, luego aplicar sus funciones.

La ventana del vídeo, se mueve mediante flechas, cuando tenga una opción seleccionada, por ejemplo la imagen de abajo.


Pulsas Enter y te vas a la otra indicada abajo.


Si vuelves a pulsar Enter, vuelves a la pantalla anterior. Esos detalles así es lo que quiero, no es tan fácil como aparenta.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.

Última edición por REHome fecha: 24-07-2024 a las 12:32:01.
Responder Con Cita
  #4  
Antiguo 24-07-2024
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.953
Poder: 27
delphi.com.ar Va por buen camino
En los ejemplos que expones tienes todas las funciones necesarias para hacer lo que deseas:

Código Delphi [-]
// Establece el ancho y alto de la ventana.
Console.SetWindowSize(20, 5);

// Limpiar pantalla.
Console.Clear();

// Posición del cursor del título del MENÚ PRINCIPAL.
Console.SetCursorPosition(0, 0);

// Escribir texto en la consola.
Console.Write("       INICIO       ");

// Leer tecla ingresada por el usuario.
tecla = Console.ReadKey(true).Key;

Utilizando esas funciones puedes hacer lo que deseas, teniendo un array o lista con los elementos del menú, una variable/constante con la cantidad máxima a mostrar y una variable que indique el elemento seleccionado y otra el índice del elemento que se muestra como primero en la lista. Al mover el cursor hacia abajo incrementas el índice del elemento seleccionado, solo si existen más elementos, y si el elemento seleccionado es mayor al máximo elementos a mostrar menos el índice del elemento superior mostrado, entonces incrementar este último valor. Una lógica similar funcionará para cuando quieras subir en el menú. Y luego de cualquier cambio, lo más simple es redibujar todo el menú.


No vas a encontrar la solución a medida de tus necesidades con tantas condiciones, por lo que es indispensable en comprendas las herramientas utilizadas y la lógica, aquí tienes algun ejemplo similar: https://www.youtube.com/watch?v=qAWhGEPMlS8

Saludos
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #5  
Antiguo 26-07-2024
REHome REHome is offline
Miembro
 
Registrado: jul 2003
Ubicación: España
Posts: 469
Poder: 22
REHome Va por buen camino
Muy bueno el vídeo, voy a probar por ahí. Muchas gracias por las respuestas.
__________________
http://electronica-pic.blogspot.com....n-arduino.html Manuales de electrónica general, PIC y Arduino.
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
Propiedad Default Menus Contextuales equivalente en menus firemonkey juniorSoft FireMonkey 1 26-05-2016 22:28:58
No se ven los menus drykea Varios 2 03-02-2009 15:36:34
menus lis983 Varios 3 02-06-2008 13:25:29
Menus Desplegables Diavlo HTML, Javascript y otros 1 27-05-2006 06:11:18
menus flotantes Toni Varios 6 19-04-2006 22:42:10


La franja horaria es GMT +2. Ahora son las 07:12:38.


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