[ Foro de C# ]

presionar dos veces una tecla. (problema)

24-Jul-2014 01:04
Invitado (wind)
3 Respuestas

He hecho un programa con Switch. (Consola)

Posee 5 opciones. La opción del 1 al 4 me permite realizar transformaciones matemáticas, si el usuario presiona la tecla escape al principio del programa, el programa finalizará inmediatamente. (Lo cuál estoy conforme con este comportamiento)

Si presiono al principio del programa la tecla 1, pedirá datos para realizar la operación y al introducir los datos requeridos (Enter), mostrará el resultado de la operación y aparecerá el siguiente mensaje:

"Presione una tecla para volver al menú principal".

El problema es que el usuario debe presionar dos veces la tecla, para volver al menú principal.  (Cuando presiona la tecla, se borra toda la pantalla, queda la pantalla negra, hasta que el usuario debe volver a presionar la tecla para que aparezca el menú principal)


Y en esta misma parte, cuando aparece el mensaje: "Presione una tecla para volver al menú principal". , Si el usuario presiona la tecla Escape, debe hacerlo dos veces, para salir del programa.


Esta es la última linea de mi programa:

 
while (Console.ReadKey(true).Key != ConsoleKey.Escape);
 
}
}
}
 



La idea es cuando aparezca el mensaje: "Presione una tecla para volver al menú principal".
El usuario tenga que presionar una sola vez la tecla, tanto para volver al menú o salir del programa.

¿Será necesario que escriba el código completo?
 
(Muy agradecido por las respuestas anteriores)


25-Jul-2014 00:41
Invitado (wind)

He decidido publicar le código fuente, porque he intentado solucionarlo por mi cuenta, pero he fallado. (Leer el post de arriba para detalles)

 
using System;
using System.Globalization;
 
namespace Convertidor_de_unidades_de_tiempo
{
    class Program
    {
        static void Main()
        {
            double segundos;
            double minutos;
            double horas;
            double dias;
 
            do
            {
Console.ForegroundColor = ConsoleColor.White;
 NumberFormatInfo nfi = new CultureInfo("es-ES", false).NumberFormat;
 Console.WriteLine("Convertidor de unidades de tiempo.");
 Console.WriteLine("Programa escrito en C# por Benjamín C.");
                // Versión 1.0 (Beta)
 Console.WriteLine("");
Console.WriteLine("Menú opciones:");
Console.WriteLine("");
Console.WriteLine("1. Convertir segundos a minutos, horas y días.");
                Console.WriteLine("2. Convertir minutos a segundos, horas y días.");
                Console.WriteLine("3. Convertir horas a minutos, segundos y días.");
                Console.WriteLine("4. Convertir días a horas, minutos y segundos.");
                Console.WriteLine("Esc. Finalizar programa.");
                Console.WriteLine("");
                try
                {
                    Console.WriteLine("Pulse una tecla.");
                    ConsoleKeyInfo tecla;
                    tecla = Console.ReadKey(true);// Para que no se vea la tecla al pulsarla.
                    Console.WriteLine("");
 
                    switch (tecla.Key)
                    {
 case ConsoleKey.D1: Console.Write("Ingrese tiempo en segundos: ");
                            segundos = Convert.ToDouble(
                                Console.ReadLine());
 
                            minutos = segundos / 60; //ok
                            horas = segundos / 3600; //ok
                            dias = segundos / 86400; //ok
 
                            Console.WriteLine("");
                            Console.WriteLine("{0} segundos = {1} minutos", segundos, minutos.ToString("N12"));
                            Console.WriteLine("{0} segundos = {1} horas", segundos, horas.ToString("N12"));
                            Console.WriteLine("{0} segundos = {1} días", segundos, dias.ToString("N12"));
 
                            break;
 
                        case ConsoleKey.NumPad1: Console.Write("Ingrese tiempo en segundos: ");
                            segundos = Convert.ToDouble(
                                Console.ReadLine());
 
                            minutos = segundos / 60; //ok
                            horas = segundos / 3600; //ok
                            dias = segundos / 86400; //ok 
 
                            Console.WriteLine("");
                            Console.WriteLine("{0} segundos = {1} minutos", segundos, minutos.ToString("N12"));
                            Console.WriteLine("{0} segundos = {1} horas", segundos, horas.ToString("N12"));
                            Console.WriteLine("{0} segundos = {1} días", segundos, dias.ToString("N12"));
 
                            break;
 
                        // opción 2.
 
                        case ConsoleKey.D2: Console.Write("Ingrese tiempo en minutos: ");
                            minutos = Convert.ToDouble(
                                Console.ReadLine());
 
                            segundos = minutos * 60; //ok
                            horas = minutos / 60; // ok
                            dias = minutos / 1440; //ok
 
                            Console.WriteLine("");
                            Console.WriteLine("{0} minutos = {1} segundos", minutos, segundos.ToString("N12"));
                            Console.WriteLine("{0} minutos = {1} horas", minutos, horas.ToString("N12"));
                            Console.WriteLine("{0} minutos = {1} días", minutos, dias.ToString("N12"));
 
                            break;
 
                        case ConsoleKey.NumPad2: Console.Write("Ingrese tiempo en minutos: ");
                            minutos = Convert.ToDouble(
                                Console.ReadLine());
 
                            segundos = minutos * 60; // ok
                            horas = minutos / 60; // ok
                            dias = minutos / 1440; //ok
 
                            Console.WriteLine("");
                            Console.WriteLine("{0} minutos = {1} segundos", minutos, segundos.ToString("N12"));
                            Console.WriteLine("{0} minutos = {1} horas", minutos, horas.ToString("N12"));
                            Console.WriteLine("{0} minutos = {1} días", minutos, dias.ToString("N12"));
 
                            break;
 
                        //opción 3
 
                        case ConsoleKey.D3: Console.Write("Ingrese tiempo en horas: ");
                            horas = Convert.ToDouble(
                                Console.ReadLine());
 
                            minutos = horas * 60; // ok
                            segundos = horas * 3600; // ok
                            dias = horas / 24; // ok
 
                            Console.WriteLine("");
                            Console.WriteLine("{0} horas = {1} minutos", horas, minutos.ToString("N12"));
                            Console.WriteLine("{0} horas = {1} segundos", horas, segundos.ToString("N12"));
                            Console.WriteLine("{0} horas = {1} días", horas, dias.ToString("N12"));
 
                            break;
 
 
                        case ConsoleKey.NumPad3: Console.Write("Ingrese tiempo en horas: ");
                            horas = Convert.ToDouble(
                                Console.ReadLine());
 
                            minutos = horas * 60; // ok
                            segundos = horas * 3600; // ok
                            dias = horas / 24; // ok
 
                            Console.WriteLine("");
                            Console.WriteLine("{0} horas = {1} minutos", horas, minutos.ToString("N12"));
                            Console.WriteLine("{0} horas = {1} segundos", horas, segundos.ToString("N12"));
                            Console.WriteLine("{0} horas = {1} días", horas, dias.ToString("N12"));
 
                            break;
 
                        // opción 4
 
 
                        case ConsoleKey.D4: Console.Write("Ingrese tiempo en días: ");
                            dias = Convert.ToDouble(
                                Console.ReadLine());
 
                            horas = dias * 24;
                            minutos = dias * 1440;
                            segundos = dias * 86400;
 
                            Console.WriteLine("");
                            Console.WriteLine("{0} días = {1} horas", dias, horas.ToString("N12"));
                            Console.WriteLine("{0} días = {1} minutos", dias, minutos.ToString("N12"));
                            Console.WriteLine("{0} días = {1} segundos", dias, segundos.ToString("N12"));
 
                            break;
 
 
                        case ConsoleKey.NumPad4: Console.Write("Ingrese tiempo en días: ");
                            dias = Convert.ToDouble(
                                Console.ReadLine());
 
                            horas = dias * 24;
                            minutos = dias * 1440;
                            segundos = dias * 86400;
 
                            Console.WriteLine("");
                            Console.WriteLine("{0} días = {1} horas", dias, horas.ToString("N12"));
                            Console.WriteLine("{0} días = {1} minutos", dias, minutos.ToString("N12"));
                            Console.WriteLine("{0} días = {1} segundos", dias, segundos.ToString("N12"));
 
                            break;
 
                            //test 
 
                        case ConsoleKey.Escape:
                            Environment.Exit(0); // Salir del programa inmediatamente presionando Esc
                            break;
 
                        default: Console.WriteLine("Opción incorrecta.");
                            break;
 
                    }// termina el switch
 
                    Console.WriteLine("");
                    Console.WriteLine("Presione una tecla para volver al menú opciones.");
                    Console.ReadKey(true);
                    Console.Clear();
 
                }// termina el try
 
                catch (FormatException)
                {
                    Console.WriteLine("Ingrese sólo números.");
                    Console.WriteLine("Presione una tecla para volver al menú opciones.");
                    Console.ReadKey(true);
                    Console.Clear();
                } /* Termina el catch */
 
            } // Termina el do
 
            while (Console.ReadKey(true).Key != ConsoleKey.Escape);
 
        }
    }
}
 


saludos


25-Jul-2014 10:56
Invitado

En la parte final del programa, tras mostrar los datos y escribir "Presione una tecla...", tienes dos instrucciones "Console.Readkey", por eso te hace dos pausas. Para solucionarlo debes de quitar el "ReadKey" que figura despues de mostrar los datos. El problema que tendrás es que después de ese ReadKey tienes un borrado de pantalla y te borra los resultados según los muestras. Esta parte la puedes solucionar poniendo el borrado de pantalla al principio del bucle, antes de pintar el menú.

Saludos.


25-Jul-2014 20:27
Invitado (wind)

muy agradecido, tenías toda la razón, funciona de maravillas!






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)