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ą.