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.