KEYPRESSED y la obtencion de teclas


Probado para Borland Turbo Pascal 7

Para los que todavia no la conocen, keypressed es una funcion predefinida en pascal de tipo boolean (devuelve verdadero si alguna tecla ha sido presionada), lo mas tipico es usarla de la siguiente forma

repeat
     write('Numero ',i);
     inc(i);
until keypressed;

while not keypressed do begin
        write('Numero: ',i);
        inc(i);
end;

Este ciclo, termina cuando se haya detectado la presion de una tecla. Muchos quisieramos que la funcion keypressed no solo devolviera verdadero o falso, sino que nos devolviera el valor de la tecla que ha sido presionada.

Cuando se ha salido del ciclo del ejemplo anterior sabemos que se ha presionado una tecla, pero no sabemos cual, lo que en ciertas circunstacias es un problema. Como cuando en un ciclo necesitas hacer un proceso continuo, pero en donde tambien es necesario leer datos desde el teclado, si para terminar ese ciclo usas keypressed tendras el problema de no conocer el valor de la tecla oprimida, pero si dentro del ciclo usas una asignacion como op:=readkey, el proceso se detiene hasta que el usuario presione alguna tecla.

Una forma de poder usar keypressed y al mismo tiempo obtener la tecla que fue presionada es colocar inmediatamente despues de keypressed o terminacion del ciclo la asignacion de tipo op:=readkey; donde p es forsozamente una variable de tipo caracter (char). De tal forma que el codigo quedaria de la siguiente manera.

 

repeat
    write('Numero ',i);
    inc(i);
until keypressed;
op:=readkey;

while not keypressed do begin
        write('Numero: ',i);
        inc(i);
end;
op:=readkey;

 

Tal pareceria que la intruccion inmediata al terminar el ciclo detendría todo a la espera de una tecla, pero lo que en realidad hace es asignar la tecla presionada a la variable op. Hasta aqui todo va bien mientras las teclas presionadas no sean teclas especiales tales como F1..F10, Flechas del cursor, insert, inicio, re pag, supr, fin, av pag, combinaciones con ctrl, alt o shift (ctrl+z, shift+w, alt+f2, etc), al ser estas teclas dobles es necesario colocar una segunda instrucion de asignacion op:=readkey;, pero ¿como saber cuando colocar esta segunda instruccion?, sencillamente con un if preguntando si la varibale trae un caracter nulo, quedando el codigo de la siguiente manera.

 

repeat
   write('Numeros: ',i);
   inc(i);
until keypressed;
op:=readkey;

if op=#0 then
   op:=readkey;

while not keypressed do begin
       write('Numeros: ',i);
       inc(i);
end;
op:=readkey
if op=#0 then
   op:=readkey;

 

Ahora para simplicar el codigo, estas instrucciones pueden convertirse facilmente en una funcion que asigne y pregunte.

 

function tecla:char
var
   car:char
begin
      car:=readkey;
      if car=#0 then
         car:=readkey;
tecla:=car;
end;

El valor de esta funcion le seria asignada a una varibale global o local del mismo tipo de la funcion, op:=tecla; mi recomendacion es que sea llamada en la linea inmediata a la terminacion del codigo, pero puede ser llamada en cualquier linea (obviamente despues de keypressed) hasta antes de algun procedimiento de lectura.


repeat
     write('Numeros: ',i);
     inc(i);
until keypressed
op:=tecla     {aqui es mejor}

o

repeat
     write('Numeros: ',i);
     inc(i);
until keypressed
{
.....................................
lineas de codigo que no sean procedimientos de lectura ni readkey
.....................................
}

op:=tecla

Despues de esta asignacion op puede ser tratada como normalmente se hace, ya que al fin de cuentas es solo una varible de tipo caracter:

if op = 'a' then

case op of
     'a'..'z':begin
                 end;
end;

if op =#13 then

Muy bien, supongamos que deseas realizar un programa con menus y toda la cosa, pero que ademas muestre la hora del sistema, pero al momento de escribir la hora en pantalla te das cuenta de que la hora se queda estatica, pero al usar algo parecido a

repeat
    gettime(h,m,s,ms);
    write(h,':',m,':',s);
until keypressed;

ahora veras que el reloj se mueve, pero no tu menu, entonces es aqui donde puedes usar la funcion ya mencionada, creando una funcion que obtenga y escriba la hora automaticamente parte del codigo quedaria asi:


procedure tiempo;
begin
       gettime(h,m,s,ms);
       write(h,':',m,':',s);
end;

{Dentro del programa principal u otro procedimiento}

repeat
     tiempo;
until keypressed
op:=tecla

op ya tiene el valor de la ultima tecla y puedes hacer las validaciones correspondientes para moverte a traves del menu.


Descarga el ejemplo completo
tiempo.zip

Roberto Garcia

 



Regresar


inicio
Si llegaste a esta pagina desde un buscador
haz click aqui para ir a la pagina principal