Ulepszony ReadKey
fatalbomb
Wszyscy znamy pascalową funkcję ReadKey, która zwraca kod naciśniętego klawisza. Niestety, aby obsłużyć niektóre ciekawsze klawisze, trzeba się trochę posiłować:
ch := ReadKey;
if ch = #0 then begin
ch := ReadKey;
if ch = #72 then { tu obsługa kliknięcia strzałki w górę }
if ch = #80 then { tu obsługa kliknięcia strzałki w dół }
if ch = #59 then { tu obsługa klawisza F1 }
end;
Wynika to z tego, że klawisze typu F1-F10, strzałki, Home, End, itd. dają od razu dwa kody, z czego pierwszy jest zerem. Naciśnięcie np. strzałki w dół powoduje, że pierwszy raz ReadKey złapie zero, a dopiero za drugim razem kod 80. Pozwala to odróżnić strzałkę w dół od znaku "P".
Gdy piszemy coś większego, ciągłe pisanie podwójnego ReadKey`a i zagnieżdżonych warunków zaciemnia kod. Dlatego pisząc to po raz setny nie wytrzymałem i napisałem coś bardziej czytelnego:
function M_ReadKey:Word;
var ch:Char;
begin
ch := ReadKey;
if ch = #0 then begin
ch := ReadKey;
M_ReadKey := 256+Ord (ch);
end else M_ReadKey := Ord (ch);
end;
Teraz czytanie kodów odbywa się w ten sposób:
ch := M_ReadKey;
if ch = 328 then { obsługa strzałki w górę, 256+72=328 }
co jest znacznie czytelniejsze. Tyle, że tym razem zmienną ch definiujemy jako Word!!!
W praktyce, zamiast posługiwać się gołymi liczbami, warto wstawić trochę stałych:
{ Nazwy stałych wzięte żywcem z Delphi }
const
{ Kody proste }
VK_F1 = 315;
VK_F2 = 316;
VK_F3 = 317;
VK_F4 = 318;
VK_F5 = 319;
VK_F6 = 320;
VK_F7 = 321;
VK_F8 = 322;
VK_F9 = 323;
VK_F10 = 324;
VK_HOME = 327;
VK_UP = 328;
VK_PageUp = 329;
VK_LEFT = 331;
VK_RIGHT = 333;
VK_END = 335;
VK_UP = 336;
VK_PageDown = 337;
VK_INSERT = 338;
VK_DELETE = 339;
{ Obsługa klawiszy przełączających }
ss_Shift = 25; { Tylko dla klawiszy F1-F10: używać jako np. ss_Shift+VK_F1 }
ss_Ctrl = 35; { Tylko dla klawiszy F1-F10: używać jako np. ss_Ctrl+VK_F1 }
ss_Alt = 45; { Tylko dla klawiszy F1-F10: używać jako np. ss_Alt+VK_F1 }
{ Kombinacje }
VK_Ctrl_A = 1;
VK_Ctrl_B = 2;
VK_Ctrl_C = 3;
VK_Ctrl_D = 4;
VK_Ctrl_E = 5;
VK_Ctrl_F = 6;
VK_Ctrl_G = 7;
VK_Ctrl_H = 8;
VK_BackSpace = 8;
VK_Ctrl_I = 9;
VK_TAB = 9;
VK_Ctrl_J = 10;
VK_Ctrl_Enter = 10;
VK_Ctrl_K = 11;
VK_Ctrl_L = 12;
VK_Ctrl_M = 13;
VK_Enter = 13;
VK_Ctrl_N = 14;
VK_Ctrl_O = 15;
VK_Ctrl_P = 16;
VK_Ctrl_Q = 17;
VK_Ctrl_R = 18;
VK_Ctrl_S = 19;
VK_Ctrl_T = 20;
VK_Ctrl_U = 21;
VK_Ctrl_V = 22;
VK_Ctrl_W = 23;
VK_Ctrl_X = 24;
VK_Ctrl_Y = 25;
VK_Ctrl_Z = 26;
VK_Ctrl_SqrBracketLeft = 27; { Ctrl+[ }
VK_ESC = 27;
VK_Ctrl_Backslash = 28;
VK_Ctrl_SqrBracketRight = 29; { Ctrl+] }
VK_Ctrl_6 = 30;
VK_Ctrl_Minus = 31;
VK_Space = 32;
{ Kody liter, cyfr, interpunkcji można sprawdzić za pomocą normalnego Ord (x); }
VK_Ctrl_BackSpace = 127;
VK_Ctrl_2 = 259;
VK_Shift_Tab = 271;
VK_Ctrl_Left = 371;
VK_Ctrl_Right = 372;
Oczywiście, nie jest to pełna lista. Jak ktoś znalazłby jeszcze jakieś, proszę o dopisanie do listy.
Witam, ja natomiast mam problem z tym , bo kompilator wywala mi błędy
[Error] Unit1.pas(53): Undeclared identifier: 'ReadKey'
[Error] Unit1.pas(110): Undeclared identifier: 'ch'
Wspaniała rzecz.. zawsze mi tego brakowało, ale jakoś nie chciało mi się pisać:D