Autor
|
Tema: Intentar diseñar bien (Leído 3,065 veces)
|
Meta
|
Buenas: Como se aprecia esta imagen, está marcada la primera opción con una x. Quiero hacer que nada más ejecutar el programa, se refleje esa x, ya que está simulando un radioButton en modo consola. Si pulsas cualquiera de las tres opciones una x, las demás si tiene alguna, se quita, solo queda una sola seleccionada. Al pulsar Enter por ejemplo > (x) Voltios, luego se me borra porque vuelve otra vez e redibujado principal. Dejo aquí el código porque no se en que fallo. Lenguaje C#. // ** P1 ** // > (x) % // ( ) Voltios // ( ) Decimal 0-1023 // ** P1 ** // > ATRÁS // GUARDAR using System; namespace LCD_Menu_con_submenus_Consola_03.Ventana02 { public class _0_P1 { #region Variables. // Contador de teclas y navegador. static sbyte indiceSeleccionado = 0; // Índice seleccionado de cada opción del menú. static bool salir = false; // Para salir del menú principal al INICIO. const sbyte SELECCION_OPCIONES_TOTALES = 3; // Total de opciones para seleccionar y fija. public static readonly string[] TEXTO = new string[] { " ** P1 ** ", // Posición 0. " ( ) % ", // 1 " ( ) Voltios ", // 2 " ( ) Decimal 0-1023", // 3 " SALIR ", // 4 " ", // 5 ">", // 6 "x" // 7 }; #endregion public static void P1_Principal() { // Capturar tecla para luego validar. ConsoleKey tecla; // Limpiar pantalla. Console.Clear(); do { //****************************************************************** // Dibujo el menú principal. switch (indiceSeleccionado) { case 0: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** P1 ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[1]); // > ( ) % Console.SetCursorPosition(0, 1); Console.Write(TEXTO[6]); // > Console.SetCursorPosition(0, 2); Console.Write(TEXTO[2]); // ( ) Voltios Console.SetCursorPosition(0, 3); Console.Write(TEXTO[3]); // ( ) Decimal 0-1023 break; case 1: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** P1 ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[1]); // ( ) % Console.SetCursorPosition(0, 2); Console.Write(TEXTO[2]); // > ( ) Voltios Console.SetCursorPosition(0, 2); Console.Write(TEXTO[6]); // > Console.SetCursorPosition(0, 3); Console.Write(TEXTO[3]); // ( ) Decimal 0-1023 break; case 2: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** P1 ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[1]); // ( ) % Console.SetCursorPosition(0, 2); Console.Write(TEXTO[2]); // ( ) Voltios Console.SetCursorPosition(0, 3); Console.Write(TEXTO[3]); // > ( ) Decimal 0-1023 Console.SetCursorPosition(0, 3); Console.Write(TEXTO[6]); // > break; case 3: Console.SetCursorPosition(0, 0); Console.Write(TEXTO[0]); // ** P1 ** Console.SetCursorPosition(0, 1); Console.Write(TEXTO[4]); // > SALIR Console.SetCursorPosition(0, 1); Console.Write(TEXTO[6]); // > Console.SetCursorPosition(0, 2); Console.Write(TEXTO[5]); // Console.SetCursorPosition(0, 3); Console.Write(TEXTO[5]); // 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: Console.SetCursorPosition(3, 1); Console.Write(TEXTO[7]); // x break; case 1: Console.SetCursorPosition(3, 2); Console.Write(TEXTO[7]); // x break; case 2: Console.SetCursorPosition(3, 3); Console.Write(TEXTO[7]); // x break; case 3: salir = true; // Salir 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); } } }
Saludos.
|
|
|
En línea
|
|
|
|
EdePC
|
Si quieres imitar el comportamiento de un RadioButton de forma sencilla estaría demás presionar Enter, con presionar las Flechas ya debería hacer todo el trabajo, salvo que quieras imitar el comportamiento de los CheckBox que al ser multiselección se hace necesario presionar Enter para decirle que checks marcar. En todo caso el Enter ya estaría destinado a ejecutar la acción final con la elección especificada: using System; namespace RadioButton { class Program { static void Main(string[] args) { ConsoleKey key; Console.CursorVisible = false; Console.SetWindowSize(44, 5); Console.SetBufferSize(44, 5); imprimeMenu(1); do { key = Console.ReadKey(true).Key; if (key == ConsoleKey.UpArrow && Console.CursorTop > 1) imprimeMenu(--Console.CursorTop); if (key == ConsoleKey.DownArrow && Console.CursorTop < 3) imprimeMenu(++Console.CursorTop); if (key == ConsoleKey.Enter) enter(Console.CursorTop); } while (key != ConsoleKey.Escape); } static void imprimeMenu(int posX) { Console.Clear(); Console.WriteLine(" ** P1 ** "); Console.WriteLine(" ( ) % "); Console.WriteLine(" ( ) Voltios "); Console.WriteLine(" ( ) Decimal 0-1023"); Console.SetCursorPosition(0, posX); Console.Write("> (x)"); } static void enter(int opcion) { Console.Clear(); Console.WriteLine("Usted a elegido la opción número {0}", opcion); Console.WriteLine("Presione cualquier tecla para continuar ..."); Console.ReadKey(true); imprimeMenu(opcion); } } }
|
|
|
En línea
|
|
|
|
Meta
|
Me funciona tu código, se pone la x justo cuando paso la >, no lo quiero así, sino, poder mover el > y solo cuando pulse enter en una opción indicada, aparece la X o no.
Si hacer una flecha abajo más, se pone otra opción que se llama Salir.
Gracias.
|
|
« Última modificación: 30 Julio 2024, 04:29 am por Meta »
|
En línea
|
|
|
|
EdePC
|
Haber, que tal esta aproximación: using System; namespace RadioButton { class Program { static void Main(string[] args) { ConsoleKey key; int posX = 0; //Posición de la x Console.CursorVisible = false; Console.SetWindowSize(44, 5); Console.SetBufferSize(44, 5); imprimeMenu(1, posX); // imprimeMenu(posición de la flecha >, posición de la x) do { key = Console.ReadKey(true).Key; if (key == ConsoleKey.UpArrow && Console.CursorTop > 1) imprimeMenu(--Console.CursorTop, posX); if (key == ConsoleKey.DownArrow && Console.CursorTop < 4) imprimeMenu(++Console.CursorTop, posX); if (key == ConsoleKey.Enter) { if (Console.CursorTop != 4) { posX = Console.CursorTop; imprimeMenu(Console.CursorTop, posX); } else { salir(posX); imprimeMenu(Console.CursorTop, posX); } } } while (key != ConsoleKey.Escape); } static void imprimeMenu(int posF, int posX) { Console.Clear(); Console.WriteLine(" ** P1 ** "); Console.WriteLine(" ( ) % "); Console.WriteLine(" ( ) Voltios "); Console.WriteLine(" ( ) Decimal 0-1023"); if (posF == 4) Console.Write(" Salir"); if (posX != 0) { Console.SetCursorPosition(3, posX); Console.Write("x"); } Console.SetCursorPosition(0, posF); Console.Write(">"); } static void salir(int opcion) { Console.Clear(); Console.WriteLine("Usted a elegido la opción número {0}", opcion); Console.WriteLine("Presione cualquier tecla para continuar ..."); Console.ReadKey(true); } } }
|
|
|
En línea
|
|
|
|
|
Meta
|
Por cierto, este código. Console.SetWindowSize(44, 5); Console.SetBufferSize(44, 5);
Sobre todo este: Console.SetBufferSize(44, 5);
¿Qué utilidad tiene? Lo incluya en el código o no, no veo ningún efecto o utilidad.
|
|
|
En línea
|
|
|
|
EdePC
|
La consola (símbolo del sistema) tiene dos tamaños, comparándolo con un documento de Word el WindowSize es el tamaño de la ventana de Word y BufferSize es el tamaño de la hoja, pero hay una restricción: el tamaño de la hoja no puede ser menor al de la ventana.
WindowSize se utiliza para dar tamaño a la ventana, y BufferSize se utiliza para dar tamaño al contenido de la consola, si hay más contenido aunque sea vació habrá más para desplazar con las barras de desplazamiento
Normalmente para que no hayan barras de desplazamiento se usa un WindowSize igual a la cantidad de letras en horizontal deseada +1, y también la cantidad de líneas +1, entonces se pone igual el BufferSize. Siempre se requiere ese +1 porque la consola funciona así, con ese margen a la derecha de mínimo 1 y margen inferior de mínimo 1
|
|
|
En línea
|
|
|
|
|
Meta
|
Gracias compañeros.
Ya me di cuenta, si lo quitas, aparece al lado para bajar y subir las líneas en la derecha como una Web, si lo pones, no aparece.
|
|
|
En línea
|
|
|
|
Meta
|
Quiero mejorar un poco el código. Que muestre Salir como en otra pantalla. Por ejemplo. Con la feclas del teclado terminaré por llegar en la otra pantalla indicada abajo. Desde que pulse SALIR, el programa se termina.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Diseñar tipografia
Diseño Gráfico
|
H@T
|
5
|
3,277
|
12 Enero 2006, 00:12 am
por Maox
|
|
|
aprender crear y diseñar web
Desarrollo Web
|
swagger14
|
1
|
2,081
|
8 Octubre 2012, 08:26 am
por WarGhost
|
|
|
como diseñar troyanos?
Análisis y Diseño de Malware
|
anonymous07
|
1
|
4,281
|
5 Febrero 2015, 22:07 pm
por skapunky
|
|
|
Diseñar tu propia luz de Led.
Electrónica
|
Meta
|
1
|
3,511
|
2 Febrero 2017, 00:26 am
por H30
|
|
|
Pido disculpas por intentar hacer estas cosas de hackear! Eso no está bien!
Hacking Wireless
|
win_7
|
7
|
7,695
|
26 Mayo 2021, 16:47 pm
por el-brujo
|
|