Wednesday, July 6, 2011

Uso de ReadKey y KeyAvailable

La clase Console nos permite usar la consola de la aplicación. Esto data desde los años 50's cuando las computadoras ocupaban una o varias habitaciones.

Para los años 60's la consola o terminal de E/S estaba compuesta por el conjunto de teclado y/o lectora de tarjetas.

Para inicio de los 70's la terminal contenía el teclado, la pantalla (Display CRT) y la impresora de línea.

Parte de esto subsiste hasta nuestros días.

La clase Console provee mecanismos para leer las teclas que se oprimen en el teclado.

La propiedad Console.KeyAvailable regresa un valor booleano que permite saber si hay una tecla en el bufer de teclado esperando ser leíada, es decir, que se ha oprimido una tecla y aún no ha sido procesada.

Podemos usar Console.KeyAvailable dentro de una condición para evaluar si se ha oprimido una tecla por ejemplo

if (Console.KeyAvailable) { ...Leer la tecla...}

En este caso si hay una tecla que ha sido presionada se ejecuta el código condicional.

También se puede usar un bucle o ciclo que termina cuando se oprime una tecla

while (!Console.KeyAvailable)

{
... hacer algo en el ciclo mientras no se presione nada en el teclado
}



Una vez que se ha presionado una tecla podemos leer la tecla presionada con Console.ReadKey()

Console.ReadKey().Key es una propiedad que regresa una valor de tipo ConsoleKeyInfo. ConsoleKeyInfo es una estructura de datos que contiene varias constantes que representan las diferentes teclas.

Para saber que tecla es la que se ha presionado se puede comparar el valor que regresa ReadKey() contra las constantes definidas en ConsoleKeyInfo.


Ejemplo

ConsoleKeyInfo myKey;

myKey=Console.ReadKey();

if (myKey.Key == ConsoleKeyInfo.LeftArrow) { Si la tecla es la flecha izquierda se ejecuta este código }

if (myKey.Key == ConsoleKeyInfo.A) { Si la tecla es la 'A' se ejecuta este código }

if (myKey.Key == ConsoleKeyInfo.C) { Si la tecla es la 'C' se ejecuta este código }


Console.ReadKey().Key se pude usar en una estructura switch/case para comparar contra un grupo de valores como en este caso:

ConsoleKeyInfo mykey; // Declaración de variable

mykey = Console.ReadKey(); // Lectura de la tecla almacenada
switch (mykey.Key)
{
case ConsoleKey.X: { myChar = "X"; Console.Clear(); break;}
case ConsoleKey.Z: { myChar = "Z"; Console.Clear(); break;}
case ConsoleKey.C: { myChar = "C"; Console.Clear(); break;}
case ConsoleKey.UpArrow: myChar = " I"; Console.Clear(); break;
case ConsoleKey.LeftArrow: myChar = " " + myChar; break;
case ConsoleKey.RightArrow: myChar = myChar.Remove(0, 1); if (myChar.Length == 0) myChar = "I"; break;
case ConsoleKey.Enter:
case ConsoleKey.Spacebar: fin = true; break;

}


Se esperan sus comentarios y recuerden que la práctica hace al maestro.

No comments:

Post a Comment