Tryb GRAFICZNY
jest ściśle związany z kartą graficzną, w jaką jest wyposażony komputer. Podczas inicjowania trybu graficznego należy określić właściwy dla danego sprzętu sterownik i tryb pracy ekranu. Do tego służy procedura DetectGraph, której wywołanie jest następujące:DETECTGRAPH (sterownik, tryb)
Jeśli zmienne sterownik i tryb są zmiennymi typu Integer, to wykonanie instrukcji:
sterownik := Detect;
InitGrah(sterownik, tryb, C:\TP\BGI);
spowoduje zainicjowanie trybu graficznego właściwego dla karty graficznej, w jaką jest wyposażony zestaw komputerowy. Odpowiedni sterownik powinien znajdować się na dysku stałym C: w podkatalogu BGI katalogu TP. Zakończenie pracy programu w trybie graficznym następuje poprzez wywołanie bezparametrowej procedury CloseGraph, która powoduje usunięcie sterownika z pamięci operacyjnej ekranu i powrót ekranu do trybu sprzed zainicjowania trybu graficznego.
następny program GrafikaPoniższy program przedstawia zainicjowanie trybu graficznego i wyświetlenie na ekranie prostych figur geom
etrycznych.Program Graf;
Var sterownik,tryb,i:Integer;
InitGraph(sterownik,tryb,'C:\Tp\BGI');
For i:=1 to 100 do
Begin
SetColor(12);
Circle(i,100,i);
Setcolor(4);
Begin
SetColor(13);
Bar(500,120,100,200);
End;
Setcolor(9);
Ellipse(500,100,0,360,50,i);
SetColor(11);
Circle(i,200,i);
Setcolor(5);
Ellipse(500,200,0,360,50,i);
Begin
Bar3D(400,200,200,400,50,TopOn);
End;
End;
Delay(1000);
CloseGraph;
End.
następny program GrafikaJest to przykład prostego programu z zainicjowanym trybem graficznym.
Program proste_cwiczenia_graficzne;
uses Graph;
var i, d,m:integer;
begin
d:=detect;
Initgraph(d,m,'c:\tp\bgi');
SetColor(yellow {14});
Rectangle(0,0,getmaxx,getmaxy);
for i:=1 to getmaxx do
begin
Setcolor(i div 25);
circle (0,i,getmaxy);
line (0,0,i,getmaxy);
end;
readln;
end.
następny program GrafikaProgram rysujący wykresy dwóch podstawowych funkcji trygonometrycznych : y = sin x, y = cos x.
Program wykres_sin;
Const skalaX=100;skalaY=150;
Var Sterownik,Tryb, x,y:integer;
InitGraph(Sterownik,Tryb,'C:\TP\BGI');
Begin
Setcolor(15);
Line(0, GetMaxY div 2,GetMaxX, GetMaxY div 2);
Line(GetmaxX div 2,0,GetmaxX div 2, GetMaxY);
End;
Procedure Rysujfunkcje;
Begin
For x:= -1 * (GetMaxX div 2) To GetMaxX div 2 Do
Begin
y:=Trunc (sin(x/skalaX)*skalaY);
PutPixel ((GetMaxX div 2) + x, (GetMaxY div 2) - y, 12);
y:=Trunc (cos(x/skalaX)*skalaY);
PutPixel ((GetMaxX div 2) + x, (GetMaxY div 2) - y, 14);
End;
End;
Procedure Opis;
Begin
SetColor(15);
SetTextStyle(8,0,4);
OutTextXY(190,15,'wykres funkcji');
SetColor(12);
OutTextXY(450,80,'y = sin x');
SetColor(14);
OutTextXY(100,80,'y = cos x');
End;
Begin
Inicjacja_graf;
RysujXY;
Rysujfunkcje;
Opis;
Readln;
CloseGraph;
End.
następny program GrafikaProgram rysujący wykresy czterech podstawowych funkcji trygonometrycznych : y = sin x, y = cos x, y = tg x, y = ctg x.
Program funkcje;
Uses graph;
Const skalaX = 50;skalaY = 80;
Var Sterownik,Tryb:integer;
x,y: integer ;
Procedure Inicjowanie_graf;Begin
Sterownik :=detect;
Initgraph(Sterownik,Tryb,'c:\tp\bgi');
End;
Procedure Rysuj_osie_XY;
Begin
Line(0,GetMaxY div 2 ,GetMaxX,GetMaxY div 2);
Line(GetMaxX div 2,0,GetMaxX div 2,GetMaxY);
End;
Procedure Rysuj_funkcje;
Begin
For x := -1 * (GetMaxX div 2) To GetMaxX div 2 Do
Begin
y := Trunc(sin(x/skalaX)*skalaY);
PutPixel((GetMaxX div 2) + x ,(GetMaxY div 2) - y,5);
y := Trunc(cos(x/skalaX)*skalaY);
PutPixel((GetMaxX div 2) + x,(GetMaxY div 2) - y,3);
y:=Trunc((sin(x/skalaX)/cos(x/skalaX))*skalaY);
PutPixel((GetMaxX div 2) + x,(GetMaxY div 2) - y,2);
If x <> 0 Then
y:=Trunc((cos(x/skalaX)/sin(x/skalaX)) * skalaY);
PutPixel((GetMaxX div 2) + x,(GetMaxY div 2) - y,4);
End;
End;
Procedure Opis;
Begin
SetColor(15);
SetTextStyle(8,0,4);
OutTextXY(170,15,'wykresy funkcji');
SetColor(5);
OutTextXY(80,90,'y = sinx');
SetColor(3);
OutTextXY(420,90,'y = cosx');
SetColor(2);
OutTextXY(80,350,'y = tgx');
SetColor(4);
OutTextXY(420,350,'y = ctgx');
End;
Begin
Inicjowanie_graf;
Rysuj_osie_XY;
Rysuj_funkcje;
Opis;
Readln;
CloseGraph;
End.
następny ZEGAR GrafikaProgram animacji zegara analogowego pobierającego czas systemowy.
Program Zegar;
Uses Crt,Dos,Graph;
Var h,m,s,ss,start:Word;
Sterownik,Tryb,a,b,c,i,r,x1,y1,x2,y2,cale,godzinowe:Integer; sgodz,smin,ssek,tarcza:Real;
Procedure Narysuj_Tarcze;
Begin SetColor(15);
For b:=207 To 210 Do
Begin
Circle(320,240,b);
End;
Setcolor(10);
For i:=214 to 220 do
Begin
Circle(320,240,i);
Rectangle(100,20,540,460);
Rectangle(98,20,542,460);
Rectangle(95,20,545,460);
Rectangle(93,20,547,460);
Rectangle(90,20,550,460);
Rectangle(88,20,552,460);
End;
For a:=0 To 59 Do
Begin
tarcza:=a*(pi/6);
SetLineStyle(0,0,ThickWidth);
If (a mod 5)=0 Then
Begin
godzinowe:=220;
End
Else
Begin
cale:=195;
godzinowe:=220;
End;
x1:=Round(cos(tarcza-pi/2)*cale)+320;
y1:=Round(sin(tarcza-pi/2)*cale)+240;
x2:=Round(cos(tarcza-pi/2)*godzinowe)+320;
y2:=Round(sin(tarcza-pi/2)*godzinowe)+240;
Line(x1,y1,x2,y2);
End;
End;
Procedure Godziny;
Var Godz:Real;
Begin
SetColor(0);
Line(320,240,Round(cos(sgodz-pi/2)*100)+320,Round(sin(sgodz-pi/2)*100)+240);
SetColor(15);
godz:=h*(pi/6)+m*(pi/360);
sgodz:=godz;
Line(320,240,Round(cos(godz-pi/2)*100)+320,Round(sin(godz-pi/2)*100)+240);
End;
Procedure Minuty;
Var Min:Real;
Begin
SetColor(0);
Line(320,240,Round(cos(smin-pi/2)*175)+320,Round(sin(smin-pi/2)*175)+240);
SetColor(15);
min:=m*(pi/30)+s*(pi/1800);
smin:=min;
Line(320,240,Round(cos(min-pi/2)*175)+320,Round(sin(min-pi/2)*175)+240);
End;
Procedure Sekundy;
Var Sek:Real;
Begin
SetColor(0);
Line(320,240,Round(cos(ssek-pi/2)*175)+320,Round(sin(ssek-pi/2)*175)+240);
SetColor(12);
sek:=s*(pi/30);
ssek:=sek;
Line(320,240,Round(cos(sek-pi/2)*175)+320,Round(sin(sek-pi/2)*175)+240);
End;
Procedure Napis;
Begin
SetColor(12);
SetTextStyle(8,0,4);
OutTextXY(245,140,'KALITKA');
OutTextXY(299,55,'XII');
OutTextXY(302,390,'VI');
OutTextXY(130,215,'IX');
OutTextXY(475,215,'III');
End;
Begin
Sterownik:=Detect;
InitGraph(Sterownik,Tryb,'c:\tp\bgi');
Narysuj_Tarcze;
Repeat
GetTime(h,m,s,ss);
If s<>start Then
Begin
Napis;
Godziny;
Minuty;
Sekundy;
start:=s;
End;
Until KeyPressed;
End.
Moduły GrafikaProgram animacji zegara analogowego pobierającego czas systemowy.
Program Zegar;
Uses Crt,Dos,Graph;
Sterownik,Tryb,a,b,i,x1,y1,x2,y2,cale,godzinowe:Integer;
sgodz,smin,ssek,tarcza:Real;
Procedure Tlo;
var i:integer;
Begin
Setcolor(9);
For i:=0 to 460 do
Begin
Rectangle(95,40,545,i);
End;
End;
Procedure Narysuj_Tarcze;
Begin
Setcolor(0);
Circle(320,240,207);
For b:=1 to 195 do
Begin
Circle(320,240,b);
End;
For a:=0 To 59 Do
Begin
tarcza:=a*(pi/30);
If (a mod 5)=0 Then
Begin
godzinowe:=210;
End
Else
Begin
cale:=195;
godzinowe:=205;
End;
x1:=Round(cos(tarcza-pi/2)*cale)+320;
y1:=Round(sin(tarcza-pi/2)*cale)+240;
x2:=Round(cos(tarcza-pi/2)*godzinowe)+320;
y2:=Round(sin(tarcza-pi/2)*godzinowe)+240;
Line(x1,y1,x2,y2);
SetLineStyle(0,0,ThickWidth);
Setcolor(15);
End;
End;
Procedure Godziny;
Var Godz:Real;
Begin
SetColor(0);
Line(320,240,Round(cos(sgodz-pi/2)*100)+320,Round(sin(sgodz-pi/2)*100)+240);
SetColor(15);
godz:=h*(pi/6)+m*(pi/360);
sgodz:=godz;
Line(320,240,Round(cos(godz-pi/2)*100)+320,Round(sin(godz-pi/2)*100)+240);
End;
Procedure Minuty;
Var Min:Real;
Begin
SetColor(0);
Line(320,240,Round(cos(smin-pi/2)*165)+320,Round(sin(smin-pi/2)*165)+240);
SetColor(15);
min:=m*(pi/30)+s*(pi/1800);
smin:=min;
Line(320,240,Round(cos(min-pi/2)*165)+320,Round(sin(min-pi/2)*165)+240);
End;
Procedure Sekundy;
Var Sek:Real;
Begin
SetColor(0);
Line(320,240,Round(cos(ssek-pi/2)*175)+320,Round(sin(ssek-pi/2)*175)+240);
SetColor(15);
sek:=s*(pi/30);
ssek:=sek;
Line(320,240,Round(cos(sek-pi/2)*175)+320,Round(sin(sek-pi/2)*175)+240);
End;
Procedure Napis;
Begin
SetColor(15);
SetTextStyle(8,0,4);
OutTextXY(298,50,'12');
OutTextXY(400,73,'1');
OutTextXY(215,73,'11');
OutTextXY(165,138,'10');
OutTextXY(225,360,'7');
OutTextXY(460,138,'2');
OutTextXY(310,390,'6');
OutTextXY(400,360,'5');
OutTextXY(450,300,'4');
OutTextXY(175,300,'8');
OutTextXY(145,215,'9');
OutTextXY(470,215,'3');
End;
Begin
Sterownik:=Detect;
InitGraph(Sterownik,Tryb,'c:\tp\bgi');
Tlo;
Narysuj_Tarcze;
Repeat
GetTime(h,m,s,ss);
If s<>start Then
Begin
Napis;
Godziny;
Minuty;
Sekundy;
start:=s;
End;
Until KeyPressed;
End.
Przykładowa baza danychModuły
z przykładowym zastosowaniemModuły są służą przede wszystkim do grupowania procedur i funkcji w biblioteki, a także do dzielenia dużych programów na powiązane logicznie części. Po zadeklarowaniu modułu w danym programie dostępna jest każda procedura i funkcja zdefiniowana w danym module., jak również zadeklarowane w nim stałe, typy i zmienne. Uruchomienie skompilowanego programu zawierającego deklaracje modułu wymaga, aby moduł taki był również wcześniej skompilowany.
Ogólna postać modułu jest następująca:
UNIT
nazwa modułu;część opisowa modułu
część implementacyjna
część inicjująca.
W programie, w którym zadeklarowano pewien moduł, można opisać elementy o takich samych identyfikatorach, jak elementy zdefiniowane w części opisowej tego modułu. Opisy występujące w programie są nadrzędne w stosunku do definicji występujących w części opisowej modułu.
Moduł do programu.
Unit Moj;
Interface
Uses Crt;
Procedure WriteLnXY(x,y:byte;s:string);
Procedure Ramka1(x1,y1,x2,y2:byte);
Procedure Ramka2(x1,y1,x2,y2:byte);
Procedure Linia1Poz(x1,x2,y:byte);
Procedure Linia1Pion(y1,y2,x:byte);
Procedure Linia2Poz(x1,x2,y:byte);
Procedure Linia2Pion(y1,y2,x:byte);
Implementation
Procedure WriteXY;
Begin
GotoXY(x,y);
Write(s);
End;
Procedure WriteLnXY;
Begin
GotoXY(x,y);
WriteLn(s);
End;
Procedure Linia1Poz(x1,x2,y:byte);
var a:byte;
begin
for a:=x1 to x2 do
begin
WriteXY(a,y,#196);
end;
end;
Procedure Linia1Pion(y1,y2,x:byte);
var a:byte;
begin
for a:=y1 to y2 do
begin
WriteXY(x,a,#179);
end;
end;
Procedure Linia2Poz(x1,x2,y:byte);
var a:byte;
begin
for a:=x1 to x2 do
begin
WriteXY(a,y,#205);
end;
end;
Procedure Linia2Pion(y1,y2,x:byte);
var a:byte;
begin
for a:=y1 to y2 do
begin
WriteXY(x,a,#186);
end;
end;
Procedure Ramka1;
Begin
Textcolor(4);
WriteXY(x1,y1,#218); {218}
WriteXY(x2,y1,#191); {191}
WriteXY(x1,y2,#192);
WriteXY(x2,y2,#217);
Linia1Poz(x1+1,x2-1,y1);
Linia1Poz(x1+1,x2-1,y2);
Linia1Pion(y1+1,y2-1,x1);
Linia1Pion(y1+1,y2-1,x2);
End;
Procedure Ramka2;
Begin
Textcolor(1);
WriteXY(x1,y1,#201 );
WriteXY(x2,y1,#187);
WriteXY(x1,y2,#200);
WriteXY(x2,y2,#188);
Linia2Poz(x1+1,x2-1,y1);
Linia2Poz(x1+1,x2-1,y2);
Linia2Pion(y1+1,y2-1,x1);
Linia2Pion(y1+1,y2-1,x2);
End;
Begin
ClrScr;
Textcolor(14);
End.
Na koniec programu
Program ksiegarnia_biblioteka_dziennik;
Uses Crt,Dos,Moj;
Type Dane_osobowe = Record
Nazwisko:string[30];
Imie:string[30];
numer:Byte;
data:Word;
End;
Var Plik:File of Dane_osobowe;
Osoba:Dane_osobowe;
rekord:Integer;
Tekst,Tytul:String;
g,m,sek,ss:Word;
r,mi,d,nrdn:Word;
Procedure Otworz_Plik(nazwa:string);
Begin
Assign(Plik,nazwa);
{$I-}
Reset(Plik); {otwiera istniejący - nadpisuje}
{$I+}
If IOResult <>0 then Rewrite(Plik); {tworzy nowy -usuwa istniejący}
End;
Procedure Przegladanie;
Var znak,znak1:Char;
lancuch:String;
procedure Ekran;
Begin
GetDir(0,lancuch); {uzyskujemy inf. o bieżącym skorowidzu:0=bierz,1=a}
Textcolor(3);
Write(lancuch,'\BIBL.DAT');
GotoXY(1,25);
Textcolor(10);
Write('PgDown-nastepny, PgUp-poprzedni, Home-pierwszy, End-ostatni, Esc-koniec');
End;
Procedure Wypisz;
Begin
If rekord < 0 Then rekord:=0;
If rekord > FileSize(Plik)-1 Then rekord:=FileSize(Plik)-1;
Seek(Plik,rekord);
Read(Plik,osoba);
TextBackground(4);
Ramka1(4,6,77,21);
Textcolor(14);
Window(10,8,70,20);
TextBackground(0);
ClrScr;
GoToXY(2,1);
Write('Nazwisko ');
GoToXY(2,2);
Write('Imie ');
GoToXY(2,3);
Write('Nr ksiazki ');
GotoXY(2,12);
Write(d,' ',mi,' ',r,' o godz.',g,'.',m,'.',sek);
GoToXY(15,1);
Write(Osoba.Nazwisko);
GoToXY(15,2);
Write(Osoba.Imie);
GoToXY(15,3);
Write(Osoba.Numer);
GotoXY(28,12);
GetDate(r,mi,d,nrdn);
GetTime(g,m,sek,ss);
Write(d,' ',mi,' ',r,' o godz.',g,'.',m,'.',sek);
Window(1,1,80,25);
GoToXY(70,1);
Write(rekord+1,'/',FileSize(Plik));
End;
Begin {przegladanie}
ClrScr;
Textcolor(2);
Seek(Plik,0);
Ekran;
rekord:=0;
Wypisz;
Repeat
znak1:=ReadKey;
If znak1=#0 Then
Case ReadKey of
#73 : Dec(rekord);
#81 : Inc(rekord);
#71 : rekord:=0;
#79 : rekord:=(FileSize(Plik));
End;
Wypisz;
Until znak1=#27
End;
Procedure Wpisywanie;
Var g,m,sek,ss:Word;
r,mi,d,nrdn:Word;
Begin
ClrScr;
Textcolor(14);
Seek(Plik,FileSize(Plik));
Repeat
WriteLn;
WriteLn;
Write('Podaj NAZWISKO : ');
ReadLn(Osoba.nazwisko);
If Osoba.nazwisko <> ''then
Begin
Write('Podaj IMIĘ : ');
Readln(Osoba.imie);
Write('Podaj NR kasety : ');
ReadLn(Osoba.numer);
WriteLn('Data rejestracji: ');
GetDate(r,mi,d,nrdn);
GetTime(g,m,sek,ss);
Write(d,' ',mi,' ',r,' o godz.',g,'.',m,'.',sek);
Write(Plik,osoba);
End;
Until osoba.nazwisko='';
End;
Procedure Menu;
Var znak:Char;
Begin
ClrScr;
Repeat
ClrScr;
GotoXY(33,6);
Textcolor(11);
WriteLn(' M E N U');
GotoXY(29,10);
Textcolor(14);
WriteLn('W - Wpisywanie klienta ');
GotoXY(29,12);
Textcolor(2);
WriteLn('P - Przeglądanie listy klientów ');
GotoXY(29,17);
Textcolor(4);
WriteLn(' K - Koniec pracy');
Repeat
znak:=Upcase(readkey);
Until znak in ['W','P','K'];
Case znak of
'P':przegladanie;
'W':wpisywanie;
End;
Until znak='K';
End;
Begin
ClrScr;
Otworz_Plik('bib.dat');
ClrScr;
Menu;
End.