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

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