Programowanie w języku Pascal » FAQ

Jak napisać odpowiednik funkcji ReadKey, która nie wstrzymuje działania programu

  • 2006-11-06 13:38
  • 0 komentarzy
  • 1683 odsłony
  • Oceń ten tekst jako pierwszy
</b>Normalnie funkcja ReadKey zatrzymuje działanie programu czekając na naciśnięcie jakiegoś klawisza. Jeżeli byłoby to zachowanie niepożądane, można napisać ulepszoną wersję tej funkcji:

function GetKey:Char;
var Ch:Char;
begin
  Ch := #255;
  if keypressed then ch := ReadKey;
  GetKey := Ch;
end;


Działa to tak: jeżeli nie naciśniemy żadnego klawisza, funkcja zwróci znak o kodzie #255 (nie polecam tu wykorzystywania kodu #0, który jest używany do odczytywania kodów klawiszy np. F1 czy strzałek). Jeżeli jednak coś naciśniemy, funkcja keypressed zwróci wartość true i nastąpi odczyt kodu ostatnio naciśniętego klawisza.
Choć funkcja się przydaje, czasami jednak lepiej jest użyć zwykłego ReadKey.

ps mozna tez jeszcze ciekawiej, bez modulu crt. Wtedy nie narazamy sie na run time error 200.

var key : byte;

key = port[$60];

tylko trzeba czyscic bufor klawiatury.
np.

PROCEDURE Keyb_Clear;Assembler;
ASM
  mov ax, 0c00h
  int 21h
END;

Trzeba pamietac, ze kody klawiszy funkcja Port sa nieco inne od kolejnosci w kodzie ascii. Zaczynaja sie od Esc. nr 1, F1 nr 2, F2 nr 3, itd...

dzieki temu mozna badac aktualny stan klawiatury. Nie bedzie tez problemow z przepelnieniem bufora. Szczegolnie nadaje sie przy tworzeniu gier.
Zapraszam na
http://www.programowanie.vsz.pl lub gdy nie dziala
http://www.programowanie.virtual.avx.pl

tam kod zrodlowy calego modulu, ktory w tablicy ma zapisane aktualnie wcisniete klawisze. Rozpoznaje shifty i alty