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.
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
if op =#13 then
     'a'..'z':begin
                 end;
end;
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;
{Dentro del programa principal u otro procedimiento}
repeat
begin
       gettime(h,m,s,ms);
       write(h,':',m,':',s);
end;
     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.
Si llegaste a esta pagina desde un buscador
haz click aqui para ir a la pagina principal