pascal_17.pdf

(96 KB) Pobierz
Obsługa klawiszy rozszerzonych i własne Menu
Turbo Pascal cześć 17
ver. 1.1
Dzisiejsza lekcja będzie poświęcona obsłudze klawiszy rozszerzonych, czyli klawisze kursora, klawisze
funkcyjne, Insert, End itd.
W pierwszej kolejności przypomnimy sobie funkcję ReadKey, której składnia wygląda:
znak:=ReadKey;
Jest to funkcja, która znajduje się w bibliotece CRT i zwraca znak odczytany z klawiatury ( nie cały ciąg
znaków STRING a tylko jeden typu CHAR ). np.
Przykładowo:
USES CRT;
Var
znak:char;
Begin
WriteLn( 'Wcisnij jakis klawisz...');
znak:=ReadKey;
WriteLn( 'Wcisniety zostal klawisz: ',znak );
End.
Program czeka na wciśnięcie jakiegokolwiek klawisza i wyświetla go ( oczywiście nie mówię tu o klawiszach
SHIFT, ALT czy CRTL bo one działają tylko w połączeniu z innymi znakami :)
Inną pożyteczną funkcją jest Chr, składnia jej to:
znak:=Chr(liczba);
znak:=#liczba;
Każdy litera, cyfra czy inny znak (np. ramki) posiadają swój własny numer (dokładniej jest to liczba od 0 do
255) i jest odczytywany z tablicy kodów ASCII, np. znakowi 'A' odpowiada liczba 65, znakowi 'a' liczba 97, a
znakowi '2' liczba 50. Aby można było zamieniać liczbę na znak używa się właśnie funkcji Chr, która zwraca
znak typu CHAR np.
Begin
WriteLn(chr(70));
WriteLn(chr(43));
WriteLn(#43);
WriteLn(chr(39));
End.
Program wyświetli w kolejnych liniach znaki: 'F', '+', jeszcze jeden '+' ( zamiast chr() mozesz używać znaczka #
wynik jest ten sam ) i w ostatniej linii pojawi się niedający się zwyczajnie wyświetlić znaku apostrofu. A wiesz
może dlaczego nie można go zwyczajnie wyświetlić ? Odpowiedź jest prosta: jeżeli wstawimy go np. w
procedurze WriteLn to procedura uzna go za znak zaczynający lub kończący zmienną typu string, nie da się
więc tak zrobić:
WriteLn( 'Alfabet Morse'a' );
Pascal widzi tylko zmienną 'Alfabet Morse' i nie wie co dalej zrobić z resztą ( a' ) a ponieważ zmienne String
można łączyć ze zmiennymi Char, tak więc poprawna linijka wyglądała by tak:
WriteLn( 'Alfabet Morse'+chr(39)+'a' );
lub tak:
WriteLn( 'Alfabet Morse'+#39+'a' );
ewelntualnie tak:
WriteLn( 'Alfabet Morse',#39,'a' );
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
1
Niektóre kody są znakami sterującymi np. chr(13) odpowiada klawiszowi ENTER, chr(27) klawiszowi ESC,
chr(8) klawiszowi BACKSPACE, a chr(7) odpowiada pipnięciu przez głośniczek komputera, spróbuj coś
takiego:
Begin
WriteLn(chr(7));
End.
Ciekawostką będzie dla nas program, który czeka na wciśnięcie klawisza ESC ( na żaden inny nie reaguje ):
USES CRT;
Var
znak:char;
Begin
ClrScr;
WriteLn('Wcisnij klawisz ESC');
Repeat
znak:=ReadKey;
Until znak=Chr(27);
End.
Funkcja Ord jest podobna do funkcji Chr, tylko że w niej zamieniane jest na odwrót, nie liczby na znaki, tylko
znaki na liczby np. ord('A')=65 ord('a')=97 ord('2')=50 itd. np.
Składnia jej to
liczba:=Ord(znak);
USES CRT;
Var
znak:char;
Begin
Repeat
znak:=ReadKey;
WriteLn(znak,' ',ord(znak));
Until znak=Chr(27);
End.
Program ten czeka na wciśnięcie znaku i wyświetla go, podając jednocześnie jego kod ASCII. Działa tak długo
póki nie wciśniemy klawisza ESC.
Zadanie 2
Napisz program, który czeka na naciśnięcie przycisku spacji.
Zajmę się teraz obsługą Klawiszy Rozszerzonych. Klawisze rozszerzone podobnie jak zwykłe odczytuje się
funkcją ReadKey. Jest jednak jedna różnica, jeżeli to jest klawisz rozszerzony to funkcja ReadKey zwróci nam
wartość chr(0), aby rozpoznać który to klawisz z rozszerzonych, to należy POWTÓRNIE ODCZYTAĆ
KLAWISZ funkcją ReadKey. Aby to objaśnić obejrzyj poniższy przykład:
Zadanie 3
Przepisz poniższy program i sprawdź efekt jego działania. Opisz wynik działania programu.
USES CRT;
Var
normalny,rozszerzony:char;
Begin
WriteLn( 'Wcisnij jakis klawisz...');
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
2
Zadanie 1
Napisz program, który wyświetli kody znaków do 'a' do 'z'
normalny:=ReadKey;
if normalny=chr(0) then
Begin
rozszerzony:=ReadKey;
WriteLn( 'Wcisniety zostal rozszerzony klawisz: ',rozszerzony );
End Else WriteLn( 'Wcisniety zostal klawisz: ',normalny );
End.
…………………………………………………………………………………………………………………….
…………………………………………………………………………………………………………………….
…………………………………………………………………………………………………………………….
…………………………………………………………………………………………………………………….
…………………………………………………………………………………………………………………….
…………………………………………………………………………………………………………………….
Ciekawym programem dla nas byłaby obsługa klawiszy strzałek. Wykonamy teraz program, który będzie
wstępem do takiej obsługi.
USES CRT;
Var
c1,c2:char;
Begin
Repeat
c1:=ReadKey;
c2:=' '; {1}
if c1=chr(0) then c2:=ReadKey; {2}
if c2='H' then WriteLn('Kursor w górę');
if c2='P' then WriteLn('Kursor w dół');
if c2='M' then WriteLn('Kursor w prawo');
if c2='K' then WriteLn('Kursor w lewo');
Until c1=chr(27);
End.
Program reaguje tylko na klawisze kursora i ESC. W linii {1} musiałem jakoś wyzerować zmienną "C2" a to
dlatego że jeżeli wcisnęlibyśmy klawisz np. "kursor w lewo" a potem jakiś zwykły np. spację to program by
wyświetlił ponownie "kursor w lewo" gdyż w linii {2} nie odczytałby powtórnie klawisza { c1 byłoby wtedy
różne od chr(0) } i pozostałaby w zmiennej C2 poprzednia wartość.
Jednym z naszych podstawowych zapisów przy pętlach w pascalu było X:=X+1; Zapis ten ma swoje zalety i
wady. Zaletą jest, że jest dla nas "naturalny" wadą iż wolno go wykonuje. Pomocna jest tu procedura Inc
Składnia: Inc(zmienna);
Normalnie to jest procedura zwiększająca wartość zmiennej o "1" czyli np. "X:=X+1" to jest to samo co
"Inc(X)". Ale ta procedura zwiększa również inne typy np. typ CHAR jeżeli zmienna C= 'a' to po wykonaniu
"Inc(C);" zmienna C będzie miała wartość o "1" większą czyli: 'b'.
(czyt. Inc(a,1) jest tym samym co a:=a+1). Można też używać zapisu Inc(y,30) co oznacza y:=y+30;
Analogicznie można zmniejszać licznik przy pomocy procedury Dec
Składnia: Dec(zmienna);
Jest to procedura podobna do Inc z tą tylko różnicą że ta nie zwiększa o "1" tylko ZMNIEJSZA o "1"
(czyt. Dec(a,1) jest tym samym co a:=a-1)
Na koniec jeszcze funkcja "Keypressed" o składni Keypressed:boolean z biblioteki CRT, która sprawdza czy
w chwili aktualnej jest wciśnięty jakiś klawisz, i jeżeli tak zwraca wartość TRUE, jeżeli nie to FALSE. np.
Uses CRT;
var
klawisz:boolean;
Begin
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
3
klawisz:=Keypressed;
WriteLn(klawisz);
End.
Najczęściej stosuje się ją w programach np.
Begin
Repeat Until Keypressed; {1}
End.
{1} Powtarzaj dopóki nie zostanie wciśnięty jakiś klawisz ( czekaj na wciśniecie klawisza ).
Zadanie 3
Napisz program, który informuje jaki klawisz został wciśnięty i wypisze jego kod w kodzie ASCII
Kurs opracował mgr Jarosław Teodorczuk
veljarek@poczta.gazeta.pl
4
Zgłoś jeśli naruszono regulamin