Na lekcji tej dowiesz się jak zamienić liczbę na tekst (np. WORD => STRING), jak zbudować własne biblioteki oraz utworzymy parę procedur i funkcji do obsługi myszki.
Składnia: Str(liczba,tekst:string); LICZBA może być typu BYTE, INTEGER, WORD itd.
Procedura zamienia liczbę "LICZBA" na zmienną typu "STRING" np.
Var X:Byte; S:String; Begin X:=48; Str(x,s); WriteLn(s); End.
Przy nauce tworzenia bibliotek zrobimy sobie procedurę, która czasami może się nam przydać, mianowicie procedurę rysującą ramkę w trybie tekstowym. Wykorzystamy również dodatkowo procedurę WriteXY, którą utworzyliśmy w lekcji 3.
USES CRT;
PROCEDURE WriteXY(x,y:byte; s:string);
Begin
GotoXY(x,y);
Write(s);
End;
PROCEDURE Ramka(x1,y1,x2,y2:byte);
Var {1}
t:byte;
Begin
WriteXY(x1,y1,chr(201)); {2}
WriteXY(x1,y2,chr(200)); {3}
WriteXY(x2,y1,chr(187)); {4}
WriteXY(x2,y2,chr(188)); {5}
For t:=x1+1 To x2-1 Do WriteXY(t,y1,chr(205)); {6}
For t:=x1+1 To x2-1 Do WriteXY(t,y2,chr(205)); {7}
For t:=y1+1 To y2-1 Do WriteXY(x1,t,chr(186)); {8}
For t:=y1+1 To y2-1 Do WriteXY(x2,t,chr(186)); {9}
End;
Begin
Clrscr;
Ramka(5,5,12,9);
End.
Zmienne:
UNIT GIGIKURS; {1}
INTERFACE {2}
USES CRT,DOS,GRAPH; { GRAPH i DOS są wstawione od razu gdyż później będą nam potrzebne }
PROCEDURE WriteXY(x,y:byte; s:string); {3}
PROCEDURE Ramka(x1,y1,x2,y2:byte); {4}
IMPLEMENTATION {5}
PROCEDURE WriteXY(x,y:byte; s:string); {6}
Begin
GotoXY(x,y);
Write(s);
End;
PROCEDURE Ramka(x1,y1,x2,y2:byte); {7}
Var
t:byte;
Begin
WriteXY(x1,y1,chr(201));
WriteXY(x1,y2,chr(200));
WriteXY(x2,y1,chr(187));
WriteXY(x2,y2,chr(188));
For t:=x1+1 To x2-1 Do WriteXY(t,y1,chr(205));
For t:=x1+1 To x2-1 Do WriteXY(t,y2,chr(205));
For t:=y1+1 To y2-1 Do WriteXY(x1,t,chr(186));
For t:=y1+1 To y2-1 Do WriteXY(x2,t,chr(186));
End;
Begin {8}
End. {8}
{1} Definicja "oto nowa biblioteka o nazwie GIGIKURS". Linia ta powinna znajdować się w źródle jako PIERWSZA.USES CRT,GIGIKURS; Begin Clrscr; Ramka(5,5,12,9); End.Przyznasz chyba że tak program wygląda bardziej czytelnie :)
Teraz utworzę procedury do obsługi myszki, nie musisz znać ich działania na poziomie na którym teraz jesteś, gdyż będę operował na przerwaniach więc lepiej tego nie ruszaj :) , a ty mam nadzieję że sam dorzucisz je do naszej biblioteki GIGIKURS.
PROCEDURE PokazMyche;
Var r:registers;
Begin
r.ax:=$0001;
Intr($33,r);
End;
PROCEDURE SchowajMyche;
Var r:registers;
Begin
r.ax:=$0002;
Intr($33,r);
End;
PROCEDURE UstawMyche(x1,y1,x2,y2:word);
Var r:registers;
Begin
r.ax:=$0007;
r.cx:=x1;
r.dx:=x2;
Intr($33,r);
r.ax:=$0008;
r.cx:=y1;
r.dx:=y2;
Intr($33,r);
End;
PROCEDURE PobierzMyche(var x,y,butt:word);
Var r:registers;
Begin
r.ax:=$0003;
Intr($33,r);
x:=r.cx;
y:=r.dx;
butt:=r.bx;
End;
PROCEDURE VgaOn;
Var
driver,mode:integer;
Begin
driver:=vga; mode:=vgahi;
InitGraph(driver,mode,'c:\bp\bgi'); { Tutaj wprowadz swoja sciezke do plikow BGI }
End;
Poszczególne procedury służą do:
[...]
PokazMyche; { myszka widoczna }
SchowajMyche; { myszka niewidoczna }
SchowajMyche; { myszka niewidoczna }
PokazMyche; { myszka NADAL NIEWIDOCZNA gdyż zostało użyte 2 razy ukrycie ! }
PokazMyche; { i dopiero teraz myszka widoczna }
[...]
Zasada 2. Jeżeli myszka znajduje się na ekranie i np. narysujemy linię akurat przechodzącą przez kursor myszki, to część linii, na której znajdował się wyświetlony kursor
zostanie skasowana tak więc sposobem na to jest wykonanie zawsze czegoś takiego:
[...]
SchowajMyche; { Ukryj mychę aby kursor nie przeszkadzał }
Line(1,1,100,100); { Narysuj już teraz linię bez obaw że się coś skasuje }
PokazMyche; { Pokaż spowrotem myszkę }
[...]
Teraz będzie program ukazujący możliwości nowych procedur, na początek prymitywny do włączenia trybu graficznego i wyświetlenia kursora myszki :)
Uses CRT,GRAPH,GIGIKURS;
Begin
VgaOn;
UstawMyche(1,1,635,475); { aby lepiej to poznac poeksperymentuj z tymi wartosciami }
PokazMyche;
Repeat Until Keypressed;
CloseGraph;
End.
Extra ! Mycha jest ! Nawet się rusza :) Ale co dalej ? Rozbudujemy na początek ten program tak abyśmy widzieli na jakich współrzędnych znajduje się aktualnie kursor myszki:
Uses CRT,GRAPH,GIGIKURS;
Var
x,y,przyciski:word;
tekstx,teksty:string;
Begin
VgaOn;
UstawMyche(1,1,635,475);
PokazMyche;
Repeat
PobierzMyche(X,Y,PRZYCISKI); {1}
SchowajMyche;
Str(X,tekstx); {2}
Str(Y,teksty); {3}
OutTextXY(10,10,tekstx); {4}
OutTextXY(10,30,teksty); {5}
PokazMyche;
Until Keypressed;
CloseGraph;
End.
{1} Pobranie współrzędnych położenia kursora mychy ( Działa nawet wtedy gdy nie widać kursora !)
Uses CRT,GRAPH,GIGIKURS;
Var
x,y,przyciski:word;
tekstx,teksty:string;
Begin
VgaOn;
UstawMyche(1,1,635,475);
PokazMyche;
SetFillStyle(SolidFill,Black); {1}
Repeat
PobierzMyche(X,Y,PRZYCISKI);
SchowajMyche;
Str(X,tekstx);
Str(Y,teksty);
Bar(10,10,40,40); {2}
OutTextXY(10,10,tekstx);
OutTextXY(10,30,teksty);
PokazMyche;
Until Keypressed;
CloseGraph;
End.
{1} Ustawienie koloru wyświetlania wypełnionego prostokąta na czarny
Uses CRT,GRAPH,GIGIKURS;
Var
x,y,przyciski:word;
staryx,staryy:word; {1}
tekstx,teksty:string;
Begin
VgaOn;
UstawMyche(1,1,635,475);
PokazMyche;
SetFillStyle(SolidFill,Black);
staryx:=1000; {2}
Repeat
PobierzMyche(X,Y,PRZYCISKI);
If (staryx<>x) OR (staryy<>y) Then {3}
Begin
SchowajMyche;
Str(X,tekstx);
Str(Y,teksty);
Bar(10,10,40,40);
OutTextXY(10,10,tekstx);
OutTextXY(10,30,teksty);
Staryx:=x; {4}
Staryy:=y; {5}
PokazMyche;
End;
Until Keypressed;
CloseGraph;
End.
{1} nowe zmienne będące informacją "w jakim położeniu znajdował się poprzednio kursor"Powinieneś już co nieco rozumieć z obsługi mychy, zajmiemy się jeszcze na tej lekcji wybieraniem obiektów np. przycisków. Narysujmy więc na początek trzy proste ikonki:
USES CRT,GRAPH,GIGIKURS; Begin VgaOn; SetFillStyle(SolidFill,Green); Bar(215,220,275,250); Bar(285,220,345,250); Bar(355,220,415,250); OuttextXY(218,232,'Opcja 1'); OuttextXY(288,232,'Opcja 2'); OuttextXY(358,232,'Opcja 3'); Repeat Until Keypressed; CloseGraph; End.Dorzućmy do tego obsługę myszki z poprzedniego programu wycinając niepotrzebne już linie wyświetlające współrzędne:
Uses CRT,GRAPH,GIGIKURS;
Var
x,y,przyciski:word;
Procedure OPCJA1;
Begin
Sound(50);
End;
Procedure OPCJA2;
Begin
Sound(100);
End;
Procedure OPCJA3;
Begin
Sound(150);
End;
Begin
VgaOn;
SetFillStyle(SolidFill,Green);
Bar(215,220,275,250); {1}
Bar(285,220,345,250); {2}
Bar(355,220,415,250); {3}
OuttextXY(218,232,'Opcja 1');
OuttextXY(288,232,'Opcja 2');
OuttextXY(358,232,'Opcja 3');
UstawMyche(1,1,635,475);
PokazMyche;
Repeat
PobierzMyche(X,Y,PRZYCISKI);
If (PRZYCISKI=1) Then {4}
Begin
If (X>215) AND (y>220) AND (x<275) AND (y<250) Then OPCJA1; {5}
If (X>285) AND (y>220) AND (x<345) AND (y<250) Then OPCJA2; {6}
If (X>355) AND (y>220) AND (x<415) AND (y<250) Then OPCJA3; {7}
End;
Until Keypressed;
Nosound; {8}
CloseGraph;
End.
Doszły nam 3 procedury: OPCJA1, OPCJA2, OPCJA3 to one właśnie będą wywoływane i będą wydawały dźwięki o różnej częstotliwości. Teraz interesuje nas tylko czy został wciśnięty klawisz myszy
i czy znajduje się w tym momencie nad jakąś ikonką.