Obsługa klawiatury w Turbo pascalu.docx

(18 KB) Pobierz

Obsługa klawiatury w Turbo pascalu

 Nie chodzi w tym rozdziale o przedstawienie działania ReadLn, czy ReadKey, tylko o profesjonalne badanie aktualnego stanu klawiszy.

   Problem z klawiaturą zaczyna się gdy chcemy zbudować coś naprawdę zaawansowanego. Ciężko jest nam przechwytywać informacje o wciśniętych altach, controlach i shiftach. Największy problem pojawia się gdy wciskamy wiele klawiszy na raz. Wtedy zaczyna się jeden duży pisk -oznaczający przepełnienie bufora. Jak tego uniknąć

Potrzebne zaawansowane obsługiwanie przerwań


   Co wcale nie znaczy że trudne. Kiedy wciskamy klawisz komputer wywołuje pewne przerwanie. Kiedy opuszczamy dzieje się to samo. W takim razie wystarczy podczas każdego przerwania wpisać do tablicy czy dany klawisz jest wciśnięty czy nie. Należy także pamiętać o wyczyszczeniu bufora, żebyśmy nie musieli słuchać pisków przepełnienia bufora.

   Ponieważ nie dysponuję zbyt duża ilością czasu wkleję moduł, którym sam się posługiwałem do obsługi klawiatury. Na jego przykładzie możesz napisać coś swojego, albo wykoprzystać go w swoich projektach.

Użycie modułu:
przed pętlą główną zainicjuj klawiaturę za pomocą keyb_Init;

Teraz stan klawiatury badasz z tablicy key[x]
Są podstawione pewne stałe, np.
Vk_Up, Vk_Down - to są strzałki, resztę zobacz w kodzie

użycie np.
if key[Vk_Up] then y:=y-1;

w pętli czyść za każdym razem bufor przez keyb_Clear;


Na końcu przywróć stare przerwanie przez keyb_End;

UWAGA! to nie jest kolejność Ascii! Kolejność musisz samemu zbadać np. w tablicy z kodu źródłowego


{$g+}
unit keyb_x;
interface

TYPE TKeyboard_Event   = PROCEDURE;

VAR   key             : array[1..127] of boolean; { to store the key-presses }
     AnyPressed      : Boolean;
     KeyDelay        : Word;
     KEYBOARD_EVENT  : TKeyboard_Event;

Const KeyName : array[1..83] of string[10] = (
          'Esc','1','2','3','4','5','6', '7','8','9','0','_','=','BckSpace',
          'Tab','Q','W','E','R','T','Y', 'U','I','O','P','[',']','Return',
          'Ctrl','A','S','D','F','G','H', 'J','K','L',';','"','`','Lewy Shift',
          '','Z','X','C','V','B','N','M', ',','.','/','Prw. Shift','*',
          'AlT','Spacja','Caps Lock','F1', 'F2','F3','F4','F5','F6','F7','F8',
          'F9','F10','Num Lock','Scroll Lock', 'Home','G˘ra','Pg Up','-','Lewo',
          '5','Prawo','+','End','D˘','Pg Down', 'Ins','Del');

Const KeyNorm : array[1..55] of CHAR = (

          { 1    2    3    4    5    6    7    8    9   10}
          ' ', '1', '2', '3', '4', '5', '6', '7', '8', '9',
          '0', '-', '=', ' ', ' ', 'q', 'w', 'e', 'r', 't',
          'y', 'u', 'i', 'o', 'p', '[', ']', ' ', ' ', 'a',
          's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '"',
          '`', ' ', '', 'z', 'x', 'c', 'v', 'b', 'n', 'm',
          ',', '.', '/', ' ', '*');


     KeyAlt : array[1..55] of CHAR = (

          { 1    2    3    4    5    6    7    8    9   10}
          ' ', '1', '2', '3', '4', '5', '6', '7', '8', '9',
          '0', '-', '=', ' ', ' ', 'q', 'w', ' ©', 'r', 't',
          'y', 'u', 'i', '˘', 'p', '[', ']', ' ', ' ', 'Ą',
          '', 'd', 'f', 'g', 'h', 'j', 'k', '', ';', '"',
          '`', ' ', '', 'ľ', ' «', ' †', 'v', 'b', 'ä', 'm',
          ',', '.', '/', ' ', '*');

     KeyShift : array[1..55] of CHAR = (

          { 1    2    3    4    5    6    7    8    9   10}
          '~', '!', '@', '#', '$', '%', '^', ' &', '*', '(',
          ')', '_', '+', ' ', ' ', 'Q', 'W', 'E', 'R', 'T',
          'Y', 'U', 'I', 'O', 'P', '{', '}', ' ', ' ', 'A',
          'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"',
          '`', ' ', '', 'Z', 'X', 'C', 'V', 'B', 'N', 'M',
          '<', '>', '?', ' ', '*');



      VK_ESC = 1;      { these are just some constants... }
      VK_Down ...

Zgłoś jeśli naruszono regulamin