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.

FAQ

2 komentarzy

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