Praca i poświęcenie powodują, że osiąga się sukces oraz niezdobyte szczyty !!!
Data dokumentu : styczeń 2004r.
Opis podstawowych poleceń biblioteki curses.
Autor: Krystian Bogdanik
Celem tego opisu jest lepsze zrozumienie i wykorzystanie właściwości biblioteki
curses. Opis ten zawiera przykłady wykorzystania procedur oraz funkcji tworzących
tryb okienkowy pod systemem Unix. Wszystkie przykłady programów zostały napisane
w języku Pascal.
Podstawową czynnością, która należy wykonać, żeby działała prawidłowo biblioteka należy
napisać:
Program nazwa_programu;
CONST
#include "/usr/local/air/sunpc/include/pcurses.cons"
...
TYPE
#include "/usr/local/air/sunpc/include/pcurses.type"
...
VAR
ekran:Window;
...
#include "/usr/local/air/sunpc/include/pcurses.proc"
BEGIN
ekran:=INITSCR;
....
EndWin;
END.
Gdzie ekran jest zmienna typu window, czyli deklaracja okna głównego,
natomiast ekran:=INITSCR powoduje włączenie trybu okienkowego.
Polecenie EndWin służy do wyłączania trybu
okienkowego. Procedurę tę należy umieścić na końcu programu, np. :
begin
......
EndWin; { wyłączenie trybu okienkowego }
end.
Następnym poleceniem, które opisze jest Wrefresh(nazwa_okna).
Procedura ta powoduje odświeżenie okna, którego nazwę umieścimy w nawiasie.
Procedura TouchWin(nazwa_okna) również powoduje odświeżenie okna lecz najpierw zaznacza
wszystkie elementy, które znajdują się w danym oknie.
Obydwie procedury odświeżania należy stosować, gdy chcemy wyświetlić coś w trybie
okienkowym.
Za pomocą funkcji NewWin(ilość_wierszy,ilość_kolumn,y,x) możemy utworzyć nowe okno.
Pierwsze dwa argumenty tej funkcji określają rozmiar nowego okna (ilość wierszy i kolumn)
natomiast dwa następne miejsce położenia okna na terminalu. Trzeba jednak pamiętać że najpierw
się podaje współrzędne Y, a potem X, liczone od lewego górnego rogu, gdzie Y,X
wynoszą 0,0.
Sposób wywołania:
Program Okienko;
....
var ekran,okno1:Window;
{ deklaracja okna głównego i okna1 }
.....
begin
ekran:=INITSCR; { włączenie trybu okienkowego }
okno1:=NewWin(5,20,0,0); { tworzenie nowego okna }
Box(okno1,0,0); { utworzenie ramki wokół okna nowego }
Wrefresh(okno1); { odświeżenie okna1 - wyświetlenie jego }
Delwin(okno1); { usunięcie okna1 }
Endwin; { wyłączenie trybu okienkowego}
end.
Wyniku wykonania tego programu zastanie utworzone nowe okno w lewym górnym rogu terminala
o rozmiarach 5 na 20.Procedura Box(nazwa_okna,0,0) służy do wykonywania ramki dla
stworzonego okna. Trzeba jednak pamiętać że procedura ta zmniejsza ilość wierszy i kolumn,
np. stworzone okno w programie 'okienko' "będzie miało" tylko 3 wiersze oraz 18 kolumn,
ponieważ dwie kolumny i dwa wiersze będą przeznaczone na narysowanie obramowania.
Procedura DelWin(nazwa_okna) służy do usuwania stworzonego okna.
Procedura WMove(nazwa_okna,y,x) jest procedurą przeznaczoną do umieszczania kursora w żądanym
miejscu danego okna. Bardzo przydatna, kiedy chcemy wyświetlić napisów lub znak w oknie
( ustawienia kursora tylko).Sposób wykorzystania:
Program ustaw_kursor;
...
var ekran:Window; { utworzenie zmiennej ekran}
...
begin
ekran:=INITSCR; { wywołanie trybu okienkowego }
Echo;
{ włączenie kursora }
Wmove(ekran,10,30);
{ ustawienie kursora o współrzędnych x=30 i y=10 }
EndWin;
{ wyłączenie trybu okienkowego}
end;
Wyniku wykonania tego programu zostanie umieszczony kursor o współrzędnych 10,30.
Procedura Echo służy do włączania kursora, natomiast do wyłączania służy
polecenie NoEcho, którego wywołanie jest podobne.
Procedura Waddstr(nazwa_okna,argument) służy do wyświetlania, np. Wyrazów lub całych
zdań, gdzie argument jest typu string80.
Program wyswietl_napis;
...
var ekran:window; { deklaracja okna }
text:string80; { deklaracja zmiennej typu string}
...
begin
ekran:=INITSCR;
text:='Ala ma kota';
{ podstawienie pod zmienną text 'zdanie' }
Wmove(ekran,10,5);
{ podanie współrzędnych, w których ma być wyświetlone zdanie}
Waddstr(ekran,text);
{ wyświetlenie zmiennej text na ekranie }
Wrefresh(ekran);
{ odświeżenie okna }
EndWin;
end.
Wyniku wykonania tego programu ukaże się zdanie 'Ala ma kota', mnie więcej na środku ekranu.
Procedura Waddch(nazwa_okna,argument) służy do wyświetlania pojedynczych znaków, np. 'k'
lub '$', oczywiście argument jest typu Char.
Program wyswietl_znak;
...
var ekran:Window;
{ deklaracja okna głównego }
znak:Char;
{ deklaracja znaku jako Char }
...
begin
ekran:=INITSCR;
NoEcho;
{ wyłączenie kursora - staje się nie widoczny }
znak:='K';
{ podstawienie znaku 'K' po zmienną znak }
Wmove(ekran,2,4);
{ ustawienie kursora w lewym górnym rogu}
Waddch(ekran,znak);
{ wyświetlenie zmiennej znak na ekranie}
Wmove(ekran,2,78);
{ ustawienie kursora w prawym górnym rogu }
Waddch(ekran,'B');
{ wyświetlenie litery 'B'}
Werefresh(ekran); { odświeżenie ekranu }
EndWin; { wyłączenie trybu okienkowego}
end.
Wyniku wykonania tego programu na ekranie
zostanie umieszczona litera 'K' w lewym górnym rogu oraz litera 'B' w prawym
górnym rogu.
Funkcja Wgetch(nazwa_okna) służy
do sczytywania pojedynczego znaku z wybranego okna.
Funkcja ta zwraca liczbę całkowitą(w kodzie ASCI).Jej wywołanie wygląda następująco:
klawisz:=wgetch(nazwa_okna), gdzie zmienna klawisz jest typu Integer.
Program ponierz_znak;
...
var ekran:window;
klawisz:integer;
{ deklarowanie zmiennej klawisz }
znak:Char;
...
begin
ekran:=INITSCR;
echo;
{ włączenie kursora }
repeat
Wmove(ekran,10,30);
{ ustawienie kursora w żądanym miejscu }
klawisz:=Wgetch(ekran); { pobranie klawisza - inaczej
użycie procedury " readln(klawisz) " }
znak:=chr(klawisz);
{ zamiana zmiennej typu Integer-klawisz
na konkretny znak za pomocą procedury 'chr(argument) }
Wmove(ekran,5,30); { ustawienie kursora
w żądanym miejscu }
Waddch(ekran,znak);
{ wyświetlenie znaku na ekranie }
until znak='q'; { zakończenie pętli, gdy
zostanie spełniony warunek:znak='q' }
EndWin.
end;
Po skompilowaniu i uruchomieniu programu 'pobierz_znak'
na ekranie pojawi się kursor
w współrzędnych y=10 i x=30, który będzie czekał na wciśnięcie klawisza (dowolnego).
Po naciśnięciu przycisku na ekranie pojawi się litera(lub znaczek) wciśnięta
w współrzędnych y=5 i x=30. Pętla ta zakończy swe działanie po wciśnięciu 'q'. Wykonanie
takiej pętli jest bardzo przydatne, kiedy chcemy zobaczyć rezultat swego prostego
programu, ponieważ wyświetlenie samego okna czasami odbywa się bardzo szybko i nie zauważamy
rezultatu wykonania jego przed zakończeniem działania programu.
Procedura Wgetstr(nazwa_okna,argument) jest procedurą
pozwalającą do wczytania ciągu znaków czyli, np. zdani lub nazwy pliku. Argument
jest typu string80.
Program Pobierz_wyraz;
...
var
ekran,okno1:window; { deklaracja
okna głównego oraz okna1 }
wyraz:string80;
{ deklaracja zmiennej wyraz jako ciąg znaków }
...
begin
ekran:=INITSCR;
okno1:=NewWin(3,50,10,20);
{ wywołanie okna1 o rozmiarach 3wiersze i 50 kolumn i wyświetleni go
w X=20, Y=10 }
Box(okno1,0,0);
{ wykonanie ramki wokół stworzonego okna1 }
Wmove(okno,1,3); { ustawienie
kursora w we współrzędnych Y=1 i X=3 }
Waddstr(okno,'Prosze podac dowolnego wyraz: ');
{ wyświetlenie zdania }
Wrefresh(okno1);
{ odświeżenie okna1 }
Wmove(okno,1,30); { ustawienie
kursora w we współrzędnych Y=1 i X=30 }
WgetStr(okno,wyraz); { pobranie wprowadzonego ciągu
znaków z klawiatury i podstawienie pod zmienną 'wyraz' }
Delwin(okno);b> { usunięcie okna1 }
EndWin; { zakończenie trybu
graficznego }
writeln('Twoj wyraz napisany w trybie curses to: ',wyraz);
{ wyświetlenie zmiennej 'wyraz' w trybie tekstowym }
end.
Wyniku wykonania programu 'Pobierz_wyraz' na ekranie
pojawi się okno z ramką. W środku tego okna będzie się znajdowało zdanie oraz kursor,
który będzie czekał na wpisanie wyrazu. Po wciśnięciu ENTERa zostanie skasowane okno oraz
zakończenie pracy graficznej tego programu i zostanie wyświetlone ten wyraz w trybie tekstowym
Procedura decydująca o
działaniu klawiszy funkcyjnych ( np.F1,ESC,strzałki,itp.) podczas wykonywania
programu to: Keypad(nazwa_okna,switch). Pierwszym
argumentem jest nazwa okna, natomiast switch
przyjmuje wartości on lub off. Nazwę
poszczególnych przycisków używanych w bibliotece znajdują się tutaj
curses.
Program Klawiatura;
...
var ekran:Window;
klawisz:Integr;
{ zmienna służąca do pobrania wciśniętego przycisku }
koniec :Boolean;
{ zmienna kończąca program }
...
begin
ekran:=INITSCR;
Keypad(ekran,on);
{ włączenie klawiszy funkcyjnych na głównym ekranie }
koniec:=false;
repeat { początek pętli }
Wmove(ekran,3,5);
WaddStr(ekran,'PRZYCISKI, KTÓRE COŚ ROBIĄ W TYM
PROGRAMIE TO:F1,ESC,Strzalki');
Wrefresh(ekran);
klawisz:=Wgetch(ekran);
{ pobranie wartości klawisza wciśniętego }
case klawisz of
K_ESC : koniec:=true;
{ zakończenie programu jeśli został wciśnie ty 'ESC' }
KEY_PF1 : begin
{ wyświetlenie napisu 'Ten przycisk to "F1" !', kiedy wciśniemy F1 }
Wclear(ekran);
Wmove(ekran,5,10);
Waddstr(ekran,'Ten przycisk to "F1" ! ');
Wrefresh(ekran);
end;
KEY_UP : begin
{ wyświetlenie napisu 'Działa tylko strzałka do góry', kiedy wciśniemy strzałkę do góry}
Wclear(ekran);
Wmove(ekran,10,10);
Waddstr(ekran,'Dział tylko strzałka do góry');
Wrefresh(ekran);
end;
otherwise;
end;
until koniec=true;
{ koniec pętli }
end.
Wyniku wykonania tego programu zostanie wyświetlony napis informujący jakie klawisze
coś wykonują. Jeżeli naciśniemy 'ESC' program zakończy pracę, natomiast po naciśnięciu
przycisku "F1" wyświetli się napis - "Ten przycisk to F1 !", kiedy naciśniemy strzałkę
do góry zostanie wyświetlony napis - "Działa tylko strzałka do góry". Inne przyciski nic nie
będą wykonywać, ponieważ są pomijane.
UWAGA !!! Zdarzają się przypadki, kiedy terminal nie reaguje na zadeklarowane
przyciski!
W takim przypadku możemy tylko zmienić nazwę przycisku zadeklarowanego na kod ASCI,
który mu odpowiada.
Wszelkie uwagi związane z niejasnością
tekstu proszę kierować pod adres e-mail krystianx@op.pl
lub kbogdani@diablo.ict.pwr.wroc.pl .
Autor : Krystian Bogdanik