Título: Lendo teclas de função
Linguagem: Pascal
S.O.: DOS
Autor(es): Wenderson Teixeira
Basicamente, este é o mesmo artigo que a versão em C/C++, com algumas modificações para o Pascal, como por exemplo o fato de que ReadKey
do Pascal não lê as teclas F11, F12 e algumas outras combinações de Ctrl+Tecla.
Muitas vezes me perguntam como ler uma tecla de função (F1..F10), setas ou as teclas de edição (Insert, Home, PageUp, PageDown, Delete, End), para evitar responder a essa questão mais uma vez, resolvi colocá-la aqui.
No DOS, quando queremos ler uma tecla, utilizamos as função ReadKey
, esta função lê uma tecla e retorna seu valor, para teclas normais, o valor retornado é equivalente ao caracter correspondente a tecla, ou seja, se pressionarmos a tecla 'A', será retornado o código 'A' que equivale a 65, e assim por diante. Mas o que acontece quando pressionamos uma tecla de função? Bem, aí a história muda um pouco, quando pressionamos uma tecla especial, é retornado o valor 0 (zero), você deve então fazer a leitura novamente, será retornado então um valor de 1 a 255, correspondente ao código da tecla.
Para tornar mais compreensível, criei duas funções, ReadKeyWait
e ReadKeyEx
para fazer a leitura de teclas, incluindo as especiais, a primeira espera que seja digitado uma tecla, só retornado depois de lida, a segunda, verifica se alguma tecla já foi pressionada, se sim, a mesma é retornada, caso contrário retorna 0, para teclas normais o código retornado vai de 1 à 255, as teclas especiais são sempre maiores ou iguais a 256. Foram criadas constantes com os valores definidos para facilitar a utilização e um programa exemplo também foi criado para demonstração.
LeTecla.pas
Teste.pas
Unit LeTecla; Interface const BKSPC = $08; const TAB = $09; const LF = $0A; const CR = $0D; const ESC = $1B; const F1 = $3B00; const F2 = $3C00; const F3 = $3D00; const F4 = $3E00; const F5 = $3F00; const F6 = $4000; const F7 = $4100; const F8 = $4200; const F9 = $4300; const F10 = $4400; const F11 = $8500; const F12 = $8600; const UP = $4800; const LEFT = $4B00; const RIGHT = $4D00; const DOWN = $5000; const HOME = $4700; const ENDKEY = $4F00; const PAGEUP = $4900; const PAGEDN = $5100; const INSERT = $5200; const DELETE = $5300; function ReadKeyWait : integer; function ReadKeyEx : integer; Implementation uses CRT; function ReadKeyWait : integer; var ch : char; begin ch := ReadKey; if ch = chr(0) then ReadKeyWait := ord(ch) or (ord(ReadKey) shl 8) else ReadKeyWait := ord(ch); end; function ReadKeyEx : integer; begin if KeyPressed then ReadKeyEx := ReadKeyWait else ReadKeyEx := 0; end; end.
program Teste; uses CRT, LeTecla; var value : integer; begin writeln('Digite uma tecla para ver o seu valor, ESC p/ sair.'); repeat value := ReadKeyEx; if value <> 0 then begin if value >= 256 then case value of { setas } UP: writeln('Up'); LEFT: writeln('Left'); RIGHT: writeln('Right'); DOWN: writeln('Down'); else { outras teclas extendidas (F1..F10, Insert, Delete, End...) } writeln('*: ', value); end else { Teclas normais } writeln(chr(value)); end; { Se foi digitado ESC, sai do loop } until value = ESC; end.