Documente Academic
Documente Profesional
Documente Cultură
20 Aplicatii
20 Aplicatii
EduSoft
Bacu 2005
ISBN 973-87655-3-6
CUPRINS
INTRODUCERE
PARTEA I. APLICAII N DELPHI 5
1. Ciupercile - un joc de ndemnare i perspicacitate 7
2. Harta - un program despre Romnia turistic 26
3. Mrfuri - un joc de logic 38
4. Puzzle - un joc de perspicacitate 49
5. Supraf - reprezentarea grafic a suprafeelor 54
6. Parser - analiza sintactic i lexical a unei fraze 61
7. AutoWeb - Creator de pagini web 71
8. Zodiac - ce ne este scris n stele? 84
9. Gastro - program pentru reete culinare 102
PARTEA II. APLICAII N VISUAL BASIC 113
10. Calculator de buzunar 115
11. Prinde mutele 122
12. Vntoarea de berze 128
13. Tetris 135
14. Puzzle cu numere 148
15. Puzzle cu imagini 151
16. Bila 158
17. Test gril 163
18. Test de circulaie rutier 171
19. Bioritm 182
20. Editor de hri 196
BIBLIOGRAFIE 211
Introducere
Prin aceast carte dorim s venim n sprijinul tuturor celor
care programeaz sau doresc s programeze n mediul Windows i
care vor s realizeze aplicaii Windows uor i repede.
Aceast carte este o colecie de aplicaii dezvoltate n mediile
de programare vizual Delphi i Visual Basic, realizate i
comercializate de firmele Inprise (Borland), respectiv Microsoft.
Mediul de programare Delphi permite realizarea de programe
care s se execute n Windows, cu interfee de tip Windows, pe baza
unui limbaj de programare de tip Pascal, iar mediul de programare
Visual Basic se bazeaz pe limbajul foarte simplu de nvat Basic.
Interfeele aplicaiilor vizuale se implementeaz cu uurin, dar
proiectarea i dezvoltarea unor aplicaii inteligente i puternice nu se
poate realiza fr un efort de gndire din partea programatorului.
Aceasta presupune proiectarea i implementarea n limbajul Object
Pascal, respectiv Visual Basic a unor algoritmi eficieni de rezolvare
a problemelor n cauz.
Aadar, cartea se adreseaz programatorilor serioi, care au
cunotinele suficiente de programare obiectual i vizual n mediile
de programare menionate. Dar chiar i programatorii obinuii cu
medii de programare mai simple pot nva uor programarea vizual
n Delphi sau Visual Basic, pe baza unor exemple ca cele din
aceast lucrare.
Exemplele de aplicaii prezentate n aceast lucrare sunt
diferite prin temele pe care le trateaz. Am ncercat s acoperim un
numr suficient de situaii pe care orice programator le-ar ntlni
atunci cnd ar dori s elaboreze un program mai complex n Delphi
sau Visual Basic.
Cititorii care doresc s intre n posesia surselor programelor
prezentate n aceast carte i a fiierelor cu date (imagini, sunete,
text) sunt rugai s ne viziteze site-ul http://edusoft.inf.ro.
Cu convingerea c oricine va studia cu atenie aplicaiile
prezentate n aceast carte va face din programarea vizual o
pasiune, le doresc cititorilor lectur plcut i compilare fr erori!
Autorul
PARTEA I
APLICAII N DELPHI
Aplicaia 1
10
11
13
procedure Clear;
end;
14
Form1.Canvas.Brush.Color:=clYellow;
Form1.Canvas.FloodFill(lat*j+10,lat*i+9,
clYellow,fsBorder);
Form1.Canvas.Pen.Color:=clGreen;
Form1.Canvas.Pen.Width:=1;
Form1.Canvas.Brush.Color:=clGreen;
Form1.Canvas.Rectangle(lat*j+7,lat*i+3,
lat*j+18,lat*i+6);
Form1.Canvas.Pen.Color:=clWhite;
Form1.Canvas.MoveTo(lat*j+11,lat*i+2);
Form1.Canvas.LineTo(lat*j+14,lat*i+2);
DeseneazaCurba(lat*j+10,lat*i+8,clFuchsia,'0357');
DeseneazaCurba(lat*j+14,lat*i+8,clFuchsia,'0357');
DeseneazaCurba(lat*j+10,lat*i+11,clRed,'03533313')
end;
Procedura
Tipar
realizeaz
afiarea
informaiei
corespunztoare unei celule a matricei labirintului, n funcie de
coninutul acesteia (dat de L[i,j], unde i i j sunt linia, respectiv
coloana acelei celule).
procedure Tipar(i,j: Integer);
begin
case L[i,j] of
' ': ClearView(lat*j+1,lat*i+1,
lat*j+lat,lat*i+lat-1);
'*': begin
Ciup[0].Init(i,j); Ciup[0].Display
end;
{ '&': begin
Carac[0].Init(i,j); Carac[0].Display
end; }
'#': begin
Form1.Canvas.Pen.Color:=clmaroon;
Form1.Canvas.Pen.Width:=3;
Form1.Canvas.Moveto(lat*j+lat div 3,lat*i);
Form1.Canvas.LineTo(lat*j+lat div 3,
lat*(i+1)-1);
Form1.Canvas.MoveTo(lat*(j+1)-lat div 3,
lat*i);
Form1.Canvas.LineTo(lat*(j+1)-lat div 3,
lat*(i+1)-1);
Form1.Canvas.MoveTo(lat*j+lat div 3,
lat*i+lat div 3);
Form1.Canvas.LineTo(lat*(j+1)-lat div 3,
lat*i+lat div 3)
end;
'@': begin
15
Form1.Canvas.Pen.Width:=1;
Form1.Canvas.Pen.Color:=clMaroon;
Form1.Canvas.Brush.Color:=clRed;
Form1.Canvas.Brush.Style:=bsDiagCross;
Form1.Canvas.Rectangle(lat*j+1,lat*i,
lat*(j+1)-1,lat*(i+1))
end;
'$': Omulet(i,j)
end
end;
De asemenea,
TCaracatita:
avem
i
16
metodele
obiectelor
de
tip
procedure TCaracatita.Init;
begin
x:=x0; y:=y0;
mut:=Random(2);
end;
procedure TCaracatita.Clear;
begin
ClearView(lat*y+1,lat*x+1,lat*y+lat-1,lat*x+lat-1);
Tipar(x,y)
end;
17
Clear; Tipar(x,y);
case m of
0: y:=y-1;
1: y:=y+1;
2: x:=x+1;
3: x:=x-1
end;
Display
end;
begin
case L[x,y] of
' ','*':
if L[x+1,y]='@' then
case mut of
0: if y>2 then
if L[x+1,y-1] in ['@','#'] then
Muta(mut)
else
mut:=1
else
mut:=1;
1: if y<21 then
if L[x+1,y+1] in ['@','#'] then
Muta(mut)
else mut:=0
else mut:=0
end
else { # }
begin
if Random(10)<3 then mut:=2
else
if mut=3 then mut:=Random(2)
else Muta(mut)
end;
'#': case mut of
0: if Random(10)<7 then mut:=3
else
if y>2 then
if L[x+1,y-1] in ['@','#'] then
Muta(mut)
else
mut:=1
else
mut:=1;
1: if Random(10)<5 then mut:=3
else
if y<21 then
if L[x+1,y+1] in ['@','#'] then
Muta(mut)
18
else mut:=0
else mut:=0;
2: if L[x+1,y]='@' then
if Random(10)<2 then
mut:=3
else mut:=Random(2)
else Muta(mut); {sus}
3: if L[x+1,y] in ['#','@'] then
Muta(mut)
else
begin
if Random(10)<3 then
mut:=2
else mut:=Random(2)
end
end
end
end;
19
begin
vieti:=10;
ciuperci:=0;
AssignFile(F,nf); Reset(F);
for i:=1 to 16 do
begin
for j:=1 to 22 do
begin
Read(F,L[i,j]);
{zid, scara sau omulet -> se deseneaza}
if L[i,j] in ['#','@','$'] then
Tipar(i,j);
if L[i,j]='$' then {omuletul}
begin L[i,j]:=' '; Xom:=i; Yom:=j end;
case L[i,j] of
'*': begin
{ciuperca se creeaza,
initializeaza si afiseaza}
Inc(ciuperci);
Ciup[ciuperci].Init(i,j);
Ciup[ciuperci].Display
end;
'&': begin
{caracatita se creeaza,
initializeaza si afiseaza}
Inc(caracatite);
Carac[caracatite].Init(i,j);
Carac[caracatite].Display;
L[i,j]:=' '
end;
end
end;
ReadLn(F)
end;
CloseFile(F);
Xom_i:=Xom; Yom_i:=Yom;
ciuperci_initiale:=ciuperci
end;
20
Str(ciuperci_initiale-ciuperci,s);
Form1.Label1.Caption:='PUNCTAJ: '+s;
end;
procedure AfisVieti;
var s: String;
begin
Str(vieti,s);
Form1.Label2.Caption:='VIETI RAMASE: '+s;
end;
21
22
sir:=InputBox('Ciupercile',
'Dati numarul labirintului [1..4]!','3');
CitesteLabirint('LAB'+sir+'.LBR');
Label1.Show; Label2.Show;
AfisVieti; AfisPunctaj;
Timer1.Interval:=1000 div caracatite
end;
23
end
end;
38: if (L[Xom,Yom]='#') and
(L[Xom-1,Yom] in ['#',' ','*']) then {sus}
begin
aux:=L[Xom,Yom]; L[Xom,Yom]:=' ';
Tipar(Xom,Yom);
L[Xom,Yom]:=aux; Tipar(Xom,Yom);
Dec(Xom); Omulet(Xom,Yom);
if L[Xom,Yom]='*' then
begin
L[XOm,YOm]:=' '; Dec(ciuperci);
Tipar(Xom,Yom); Omulet(Xom,Yom);
AfisPunctaj
end
end;
37: if (L[Xom,Yom] in ['#',' ']) and
(L[Xom,Yom-1]<>'@') and
(L[Xom+1,Yom-1] in ['@','#']) then {stg}
begin
aux:=L[Xom,Yom]; L[Xom,Yom]:=' ';
Tipar(Xom,Yom);
L[Xom,Yom]:=aux; Tipar(Xom,Yom);
Dec(Yom); Omulet(Xom,Yom);
if L[Xom,Yom]='*' then
begin
L[XOm,YOm]:=' '; Dec(ciuperci);
Tipar(Xom,Yom); Omulet(Xom,Yom);
AfisPunctaj
end
end;
39: if (L[Xom,Yom] in ['#',' ']) and
(L[Xom,Yom+1]<>'@') and
(L[Xom+1,Yom+1] in ['@','#']) then {dr}
begin
aux:=L[Xom,Yom]; L[Xom,Yom]:=' ';
Tipar(Xom,Yom);
L[Xom,Yom]:=aux; Tipar(Xom,Yom);
Inc(Yom); Omulet(Xom,Yom);
if L[Xom,Yom]='*' then
begin
L[XOm,YOm]:=' '; Dec(ciuperci);
Tipar(Xom,Yom); Omulet(Xom,Yom);
AfisPunctaj
end
end
end
end;
24
25
Aplicaia 2
27
@poartain.bmp
@panorab.bmp
@ortod_ai.bmp
JUDETUL ALBA
# Date generale
Judet in partea central-vestica a Romaniei, pe cursul mijlociu al
Muresului; 6,2 mii kmp; Resedinta: Alba-Iulia.
Orase: Sebes, Aiud, Cugir, Blaj, Ocna Mures, Zlatna,
Campeni si Abrud.
# Relieful si clima
Relief accidentat; in vest M-tii Metaliferi, Trascaului si Bihor, cu
cateva depresiuni montane (Zlatna, Abrud, Campeni); in est Valea
Muresului si culmile de vest ale Podisului Tarnavelor.
Clima temperat-continentala, cu ierni mai reci in zona montana;
precipitatiile variaza teritorial (600-1100 mm/an).
# Economia
Exploatari: forestiere, de minereuri auroargentifere (Zlatna, Baia
de Aries, Almasu Mare, Rosia Montana) si cuprifere (Bucium),
minereuri de cinabru (Izvoru Ampoiului), gaze naturale (Cetatea de
Balta), sare (Ocna Muresului), roci de constructie etc.
Cele mai importante ramuri industriale ale judetului sunt: extractia
minereurilor
neferoase si metalurgia neferoasa, exploatarea
si
prelucrarea lemnului, constructia de masini, chimica (soda calcinata
si caustica, antidaunatori), alimentara, materiale de constructie.
Suprafata agricola a judetului este de 352 mii ha, din care 158 mii
ha sunt terenuri arabile. Pe terenurile arabile ale judetului se
cultiva cereale (102,7 mii ha), floarea-soarelui, cartofi si sfecla de
zahar; viticultura (podgoriile Alba-Iulia, Blaj, Craciunelu de
Jos, Jidvei, Valea Lunga, Aiud); pomicultura; legumicultura. Cresterea
animalelor (bovine, porcine si ovine); avicultura.
# Turism
Zona turistica, cu numeroase locuri pitoresti (Pestera Scarisoara
si
Pojarul
Politei; Detunatele); monumente istorice
si
de
arhitectura.
Observai primele trei linii din acest fiier. Ele conin exact
numele acelor fiiere cu imagini, care sunt trecute n lista ListBox1
din dreapta sus a lui Form2 i sunt precedate de simbolul '@'.
Urmeaz textul referitor la judeul Alba, care se regsete n
componenta Memo1 din cadrul lui Form2.
n imaginea anterioar, s-a acionat pe al doilea item din list
i s-a afiat imaginea panoramic a municipiului Alba-Iulia, aflat n
fiierul 'panorab.bmp'. Atunci cnd vei realiza concret aplicaia
dumneavoastr, va trebui s dispunei de mai multe fiiere cu
imagini, pentru fiecare jude n parte, precum i de cte un fiier text
(l putei crea chiar dumneavoastr), pentru fiecare jude al rii. La
toate acestea se adaug imaginea cu harta administrativ a
Romniei, pe care o putei scana chiar dup pagina din carte, dac
dispunei de un scanner, sau o putei lua de pe Internet, dac
dispunei de o astfel de conexiune. Exist multe locaii web, unde
sunt date despre Romnia i de acolo ai putea chiar s luai nu doar
harta Romniei, ci i alte informaii, chiar texte referitoare la judeele
30
31
32
begin
ReadLn(f,numejudet);
ReadLn(f,x1,y1,x2,y2);
if (x1<=X) and (X<=x2) and
(y1<=Y) and (Y<=y2) then
gasit:=True
end;
if gasit then
Form1.Caption:=numejudet
else
numejudet:='';
CloseFile(f)
end;
33
34
Memo1.ScrollBars:=ssBoth;
Image1.Stretch:=True;
AssignFile(f,numejudet+'.txt');
{$I-}Reset(f);{$I+}
if IOResult=0 then
begin
while not eof(f) do
begin
ReadLn(f,s);
if s[1]='@' then
ListBox1.Items.Add(Copy(s,2,Length(s)-1))
else
Memo1.Lines.Add(s)
end;
CloseFile(f);
end
else
begin
Image1.Picture.Graphic:=nil;
ListBox1.Clear;
Memo1.Clear;
Memo1.Lines.Add('Nu detinem informatii');
Memo1.Lines.Add('despre acest judet!')
end
end;
35
Image1.Picture.Graphic:=nil;
Memo1.ScrollBars:=ssBoth;
Image1.Stretch:=True;
36
if s[1]='@' then
ListBox1.Items.Add(Copy(s,2,Length(s)-1))
else
Memo1.Lines.Add(s)
end;
CloseFile(f);
end
else
begin
Image1.Picture.Graphic:=nil;
ListBox1.Clear; Memo1.Clear;
Memo1.Lines.Add('Nu detinem informatii');
Memo1.Lines.Add('despre acest judet!')
end
end;
37
Aplicaia 3
39
1.LAB
2.LAB
3.LAB
####################
#%%%# # # ###
# ##
# ##
#
# #
# #
##*
# # #
#
##
## # # #
# #*###
## ##
#
#
$
##### ##
# ### *
#
#
#
#
# # # #
####################
####################
# $ #
###
# ##
# ### * # * # #
#
# #
#
#
#
##
# #
#
# #### ## ## ##
#
#
#
##
# ####### #* # %#
#
# %%#
####################
####################
#%%%%
#
###
#
##*##
* *
#
#$*
#
####
#
# #* #### #%##
#
# # #####
%## * #
#
* # # ##
#
### #
* ####### #
#%%
## #
####################
4.LAB
5.LAB
6.LAB
####################
## ##
%
%####
#
# # # #### #
# #
##
#
#
# **# #**
## ##
## *$## # ## ## ##
# #### # ##
##
#%% *
##
# #
##% ##
##% ##
####################
####################
## ##%
%%####
##% ##
# # ##
# #
##
#
#
# **# #* * ## ##
## *$## # ## ## ##
# #### # ##
##
#%% *
##
# #
#
# # # #### #
####################
####################
## %#
%###
#
## *
#
##
# *$## # ## ## #
# #### # ## * * #
# * %###
#
#
#
##
#
#
# * # #* * %# ##
#% # # #% ####% %#
####################
40
42
43
case p of
1: for i:=1 to NrLoc do
if (Abs(Loc[i].x-Xom)<2) and
(Abs(Loc[i].y-Yom)<2) and
(L[Loc[i].x,Loc[i].y] in [' ','$']) then
begin
Form1.Canvas.Pen.Color:=clBlue;
Form1.Canvas.Pen.Width:=2;
Form1.Canvas.Ellipse(lat*Loc[i].x+1,
lat*Loc[i].y+1,
lat*(Loc[i].x+1)-1,
lat*(Loc[i].y+1)-1)
end;
0: for i:=1 to NrLoc do
if L[Loc[i].x,Loc[i].y]=' ' then
begin
Form1.Canvas.Pen.Color:=clBlue;
Form1.Canvas.Pen.Width:=2;
Form1.Canvas.Ellipse(lat*Loc[i].x+1,
lat*Loc[i].y+1,
lat*(Loc[i].x+1)-1,
lat*(Loc[i].y+1)-1)
end
end;
for i:=1 to NrLoc do
if L[Loc[i].x,Loc[i].y]='$' then Tipar(Xom,Yom)
end;
45
ReadLn(F)
end;
CloseFile(F);
DisplayLoc(0)
end
end;
46
begin
dx:=Form1.ClientWidth div 22;
dy:=Form1.ClientHeight div 12;
if dx<dy then lat:=dx else lat:=dy;
CitesteLabirint(sir);
L[Xom,Yom]:=' '; Tipar(Xom,Yom);
L[Xom,Yom]:='$'; Tipar(Xom,Yom);
DisplayLoc(0)
end;
procedure TForm1.Joaca1Click(Sender: TObject);
begin
IncarcaSiDeseneazaTabla;
Form1.SetFocus
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.BorderStyle:=bsSingle;
Joaca1.Enabled:=False; sir:='0';
Form1.Caption:='Transporta marfurile'
end;
procedure TForm1.Terminare1Click(Sender: TObject);
begin
Application.Terminate
end;
procedure TForm1.Alegelabirint1Click(Sender: TObject);
begin
sir:=InputBox('Alegere labirint',
'Dati numarul labirintului','1');
sir:=sir+'.lab';
Joaca1.Enabled:=True
end;
47
38:
40:
37:
39:
DoMove(0,-1);
DoMove(0,+1);
DoMove(-1,0);
DoMove(+1,0)
end;
DisplayLoc(1);
if (LocuriOcupate) and (sir<>'0') then
ShowMessage('Joc terminat cu succes!')
end
end;
48
Aplicaia 4
49
50
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
51
begin
if Button1.Caption='Stop' then
Application.Terminate
else
begin
Val(Edit1.Text,n,c);
Button1.Caption:='Stop';
lat:=Width div (n+2);
for i:=0 to n-1 do
for j:=0 to n-1 do
begin
k:=n*i+j;
Buton[k]:=TButton.Create(Form1);
Buton[k].Parent:=Form1;
Str(k+1,s);
Buton[k].Left:=lat+lat*j;
Buton[k].Top:=100+lat*i;
Buton[k].Width:=lat;
Buton[k].Height:=lat;
Buton[k].Caption:=s;
Buton[k].Show;
Buton[k].OnClick:=ClickButon
end;
x:=n*n-1; {casuta libera}
Buton[x].Caption:=''; {are Caption vid}
ii:=n; jj:=n; {indicele casutei libere}
{ Amestecare imagini }
Buton[n*n-2].Click;
Buton[n*n-3].Click;
Randomize;
for i:=1 to 2000*n do
begin
k:=Random(n*n);
Buton[k].Click
end
end
end;
53
Aplicaia 5
54
55
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
56
57
end;
58
Form1.Image1.Picture:=nil;
{se deseneaza curbele pe axa Ox}
for i:=1 to nx do
begin
Form1.Image1.Canvas.MoveTo(Round((xx[i,1]-xmin)/ux),
dy-Round((yy[i,1]-ymin)/uy));
for j:=2 to ny do
Form1.Image1.Canvas.LineTo(Round((xx[i,j]-xmin)/ux),
dy-Round((yy[i,j]-ymin)/(uy)))
end;
{se deseneaza curbele pe axa Oy}
for j:=1 to ny do
begin
Form1.Image1.Canvas.MoveTo(Round((xx[1,j]-xmin)/ux),
dy-Round((yy[1,j]-ymin)/uy));
for i:=1 to nx do
Form1.Image1.Canvas.LineTo(Round((xx[i,j]-xmin)/ux),
dy-Round((yy[i,j]-ymin)/uy))
end;
end;
59
60
Aplicaia 6
61
63
64
unit parser1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls, Grids, ExtCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Edit1: TEdit;
Label1: TLabel;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
65
66
67
68
end
end;
69
LEX.TXT
Det->orice
Det->fiecare
Det->o
Det->un
Pron->el
N->barbat
N->femeie
V->iubeste
V->uraste
A->frumoasa
A->desteapta
C->si
C->sau
S->NP VP
NP->Pron
NP->N
NP->Det N
NP->NP AP
AP->A
AP->AP CP
CP->C A
VP->V VP
VP->V NP
Aplicaia 7
<html>
<head>
<title>Pagina mea web</title>
<frameset rows="25%,*">
<frame name="sus" src="sus.html" noresize>
<frameset cols="30%,*">
<frame name="stg" resizable src="stanga.html"
scrolling="yes">
<frame name="drp" resizable src="sub1.html" scrolling="yes">
<noframes>
</head>
<body>
Aceasta pagina are cadre, dar exploratorul dumneavoastra nu
le accepta.
</body>
</noframes>
</frameset>
</html>
<html>
<head><title>sus</title></head>
<body background="fundal.jpg">
<h1><i><font face="Arial" color="black">
<marquee behaviour="alternate" scrolldelay="30"
scrollamount="2" bgcolor="#00FFFF" height="25"
align=center>
Ioana Ionescu
</marquee>
</i></h1>
<h4>
<marquee scrolldelay="35"
bgcolor="#eeee88", height="20" align=top>
Si miine e o zi!
</marquee>
</h4>
</body></html>
72
73
74
<html><head><title>
(scrieti aici denumirea subiectului)
</title></head>
<body background="fundal.jpg">
<p>(tratati aici pe larg acest subiect)</p>
</body>
</html>
75
76
77
var
nr_sub_tratat: Integer;
subiect: array[1..3] of String;
78
ReadLn(f,s); Edit4.Text:=s;
subiect[nr_sub_tratat]:=Edit4.Text;
ReadLn(f,s); {</title></head>}
ReadLn(f,s);{f,'<body background="fundal.jpg">}
ReadLn(f,s);
if Copy(s,1,4)='<img' then
begin
ReadLn(f,s); { ghilimele, numele imaginii,
ghilimele }
Edit3.Text:=Copy(s,2,Length(s)-3);
end
else
Memo1.Lines.Add(Copy(s,4,Length(s)-7));
repeat
ReadLn(f,s);
if s<>'</body>' then
Memo1.Lines.Add(Copy(s,4,Length(s)-7))
{ fara <p> si </p>}
until s='</body>';
Memo1.Refresh;
if Edit3.Text='' then
Edit3.Text:='(dati numele fisierului)';
{ urmeaza, in fisier: </html>}
CloseFile(f);
end;
79
80
ReadLn(f,s); {</title></head>}
ReadLn(f,s);{f,'<body background="fundal.jpg">}
ReadLn(f,s);
if Copy(s,1,4)='<img' then
begin
ReadLn(f,s); { ghilimele, numele imaginii,
ghilimele }
Edit3.Text:=Copy(s,2,Length(s)-3);
end
else Memo1.Lines.Add(Copy(s,4,Length(s)-7));
repeat
ReadLn(f,s);
if s<>'</body>' then
Memo1.Lines.Add(Copy(s,4,Length(s)-7))
{ fara <p> si </p>}
until s='</body>';
Memo1.Refresh;
{ urmeaza, in fisier: </html>}
CloseFile(f);
OpenDialog1.Filter:='Fisiere Jpeg|*.JPG';
OpenDialog1.FilterIndex:=1;
AssignFile(f,'sus.html');
Reset(f);
for i:=1 to 7 do ReadLn(f,s);
{ se sare pana la nume }
ReadLn(f,s); Edit1.Text:=s;
for i:=1 to 5 do ReadLn(f,s);
{ se sare pana la motto }
ReadLn(f,s); Edit2.Text:=s;
CloseFile(f);
if Edit3.Text='' then
Edit3.Text:='(dati numele fisierului)'
end;
Procedura
TForm1.Button1Click
va
apela
la
OpenDialog1.Execute pentru a afia o fereastr de dialog i
pentru a alege un fiier de pe disc.
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit3.Text:=OpenDialog1.FileName;
end;
81
82
83
Aplicaia 8
84
Zodii de pamnt
Zodii de aer
Zodii de ap
berbec.bmp
taur.bmp
gemeni.bmp
rac.bmp
leu.bmp
fecioara.bmp
balanta.bmp
scorpion.bmp
sagetator.bmp
varsator.bmp
capricorn.bmp
pesti.bmp
Daniel Nitescu
barbat
11.12.1980
87
88
89
MainMenu1
lblZodia
Dialog
memZodia
imgZodia
txtNume
PersoanaNoua
rgSexul
spnZiua
lstLuna
spnAnul
BitBtn1
90
91
Pesti1: TMenuItem;
Compatibilitati1: TMenuItem;
Dezodii1: TMenuItem;
Depersoane1: TMenuItem;
Dialog: TOpenDialog;
imgZodia: TImage;
PersoanaNoua: TGroupBox;
lblZodia: TLabel;
Label1: TLabel;
txtNume: TEdit;
rgSexul: TRadioGroup;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
BitBtn1: TBitBtn;
memZodia: TMemo;
spnZiua: TSpinEdit;
lstLuna: TListBox;
spnAnul: TSpinEdit;
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Balanta1Click(Sender: TObject);
procedure Berbec1Click(Sender: TObject);
procedure Taur1Click(Sender: TObject);
procedure Gemeni1Click(Sender: TObject);
procedure Rac1Click(Sender: TObject);
procedure Leu1Click(Sender: TObject);
procedure Fecioara1Click(Sender: TObject);
procedure Scorpion1Click(Sender: TObject);
procedure Sagetator1Click(Sender: TObject);
procedure Capricorn1Click(Sender: TObject);
procedure Varsator1Click(Sender: TObject);
procedure Pesti1Click(Sender: TObject);
procedure Exit1Click(Sender: TObject);
procedure Dezodii1Click(Sender: TObject);
procedure Noua1Click(Sender: TObject);
procedure Veche1Click(Sender: TObject);
procedure Depersoane1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
92
93
94
95
repeat
ReadLn(f,s);
if s<>'$ Barbat' then
t := t + s + Chr(13) + Chr(10)
until s='$ Barbat';
repeat
ReadLn(f,s);
until s='$ Femeie';
t := t + s + Chr(13) + Chr(10);
while not eof(f) do
begin
ReadLn(f,s);
t := t + s + Chr(13) + Chr(10)
end
end;
Close(f);
Form1.memZodia.Text := t;
t := '';
Form1.imgZodia.Picture.LoadFromFile(zodia + '.bmp')
end;
97
98
99
100
AssignFile(f,Dialog.filename); Reset(f);
ReadLn(f,Nume); nume2 := Nume;
ReadLn(f,Sex); ReadLn(f,DataNast);
CloseFile(f);
zod2 := DeterminaZodia
end;
AfiseazaCompatib(zod1, zod2)
end;
101
Aplicaia 9
numele reetei
c1 a 1
c2 a 2
....
cn a n
modul de preparare al reetei respective,
pe unul sau mai multe rnduri
(un rnd liber)
ci sunt cantitile de alimente, iar ai sunt chiar denumirile acestor
alimente. ntre cantiti i denumirile alimentelor exist un spaiu.
Dup cum se vede, tocana de cartofi are nevoie de mrar
pentru a fi preparat, iar eliminarea mrarului din lista alimentelor
disponibile va nsemna c nu putem prepara tocana.
Aadar, exist un fiier special care cuprinde lista alimentelor
de care dispunem n buctria noastr: 'ALIMENTE.TXT'. Acest fiier
poate fi iniial vid, dar trebuie s existe. Practic, atunci cnd se fac
verificri asupra alimentelor disponibile, se lucreaz cu o list de
alimente, pstrat n memorie. Lista respectiv se actualizeaz
permanent n timpul programului, ori de cte ori se acioneaz
butoanele 'Adaug' i 'Elimin', de ctre utilizatorul programului.
Cu toate acestea, fiierul 'ALIMENTE.TXT' este necesar,
deoarece, la fiecare nou pornire a aplicaiei GASTRO, trebuie s
cunoatem lista curent de alimente. Aadar, la orice lansare n
execuie a aplicaiei se ncarc datele din acest fiier n lista cu
alimente, iar la orice oprire a programului, lista curent de alimente
este salvat n fiierul text 'ALIMENTE.TXT'.
n exemplul nostru, fiierul 'ALIMENTE.TXT' are urmtorul
coninut:
1000
1000
1000
1000
1000
1000
1000
1000
1000
1000
1000
bulion
cartofi
cascaval
cepe
faina
marar
oua
patrunjel
sare
sunca
ulei
104
txtCant
lstAlimente
lstRetete
cmdAdauga
cmdElimina
cmdRetete (invizibil)
cmdStop
memReteta
105
106
var
Form1: TForm1;
implementation
{$R *.DFM}
107
end;
CloseFile(f);
cmdRetete.Click;
end;
108
110
111
begin
ReadLn(f,denumire);
if denumire=lstRetete.Items[gasit] then
repeat
ReadLn(f,s);
if s <> '' then
t := t + s + Chr(13) + Chr(10)
until s = ''
else
repeat
ReadLn(f,s)
until s = ''
end;
CloseFile(f)
end;
memReteta.Text := t
end;
Poft bun!
112
PARTEA II
APLICAII N VISUAL BASIC
113
Aplicaia 10
Calculator de buzunar
10.1. Prezentare general
Pentru nceput ne propunem s realizm un calculator de
buzunar, aa cum este cel din mediile Windows, care s permit
realizarea de calcule aritmetice simple (adunri, scderi, nmuliri i
mpriri) cu numerele reale.
Pentru aceste patru operaii vom avea patru butoane distincte
n forma aplicaiei noastre. Un alt buton va fi pentru operaia de
schimbare de semn (+/-).
Pentru a lucra cu numere reale, deci cu zecimale, vom avea
nevoie i de un buton pentru virgula (punctul) zecimal. Dac greim
introducerea unui numr, atunci vom folosi un buton Clear pentru a
terge ecranul i a relua introducerea respectivului numr. De
asemenea, s nu uitm butonul egal care ne va afia rezultatul unei
operaii sau a unui ir de mai multe operaii consecutive.
n faza de proiectare, calculatorul nostru va arta ca n figura
de mai jos, n care butonul On este pentru pornirea efectiv a
calculatorului. Dup pornire, acest buton se schimb ntr-un buton
Off, de oprire a calculatorului. Butonul de terminare a aplicaiei este
butonul Stop.
115
......
(urmeaz descrierile componentelor din form)
End
116
TabIndex
End
118
119
120
v = v * Val(s)
Case "/"
If Val(s) <> 0 Then
v = v / Val(s)
Else
MsgBox "Impartire prin zero!", 48
s = ""
End If
End Select
If oper = "" Then v = Val(s)
s = Str(v)
txtEcran.Text = s
oper = ""
Else
Beep
End If
End Sub
121
Aplicaia 11
Prinde mutele
11.1. Prezentare general
Vom realiza mpreun un simplu joc de ndemnare n care,
ntr-un interval dat (s zicem un minut) mai multe mute vor apare pe
ecran pentru puin timp (fiecare musc are intervalul ei de existen
pe ecran), iar noi va trebui s le strivim, prin click cu mouse-ul.
Imaginea de mai jos red un moment din acest joc, unde avem trei
mute, din care dou vii i una moart, timpul de joc rmas este de
57 de secunde, iar punctajul realizat este 1.
122
'Fixed Double
'False
=
=
=
=
=
=
1095
4
5640
2 'Cross
4560
1095
123
Image1(0)
Label5
MMControl
Sunet
124
GAZAM.BMP
GAZAV.BMP
125
127
Aplicaia 12
Vntoarea de berze
12.1. Prezentare general
Jocul pe care vi-l propunem n acest capitol este foarte
asemntor celui din capitolul anterior. Dispunem de o puc cu
ajutorul creia trebuie s omorm mai multe berze ce apar n partea
superioar a ecranului, n una din trei poziii.
Puca se poate deplasa n trei poziii (stnga, centru i
dreapta), cu ajutorul tastelor de sgei (stnga i dreapta), iar
acionarea focului se face cu una din tastele: spaiu, sgeat sus i
sgeat jos.
128
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
&H00FFFF00&
3 'Fixed Double
"Vanatoarea de berze"
5865
2250
1605
5835
&H00000000&
6270
2190
"Form1"
5865
5835
1260
5955
n cadrul ei avem:
o etichet pentru punctajul realizat;
un array cu trei imagini (pentru cele trei berze, fiecare putnd
avea trei stri);
un array cu trei cronometre (pentru timpul de apariie al celor
trei berze);
o imagine pentru puc (care poate avea trei poziii fr foc i trei
cu foc);
un cronometru pentru focul putii.
Aceste controale sunt puse n eviden n figura de mai jos.
129
Label Label1
Image
b
(0
2)
Timer timp(0..2)
Timer timp_foc
Image pusca
130
2. BARZAM.BMP
131
0. PSTG.BMP
1. P.BMP
2. PDR.BMP
3. PFSTG.BMP
4. PF.BMP
5. PFDR.BMP
= LoadPicture("pstg.bmp")
= LoadPicture("p.bmp")
= LoadPicture("pdr.bmp")
= LoadPicture("pfstg.bmp")
= LoadPicture("pf.bmp")
132
Case 5:
pusca.Picture = LoadPicture("pfdr.bmp")
End Select
End Sub
134
Aplicaia 13
Tetris
13.1. Prezentare general
Tetris e numele dat unei ntregi clase de jocuri, cu cele mai
diferite nume (Tetris, Tetris for Windows, Sextris, TetWin, Hextris,
Pentix), jocuri care toate au la baz o idee de provenien ruseasc,
jocul clasic de Tetris. Jocul Tetris este foarte cunoscut n ntreaga
lume. l ntlnim i pe calculatoare (sub diferite variante) i sub forma
unor jocuri electronice de buzunar sau chiar la unele televizoare
color.
Este un joc solitar, n care dispui de o cutie dreptunghiular
din a crei parte superioar ncep s cad, una cte una, diferite
piese. Piesele sunt nite tetrominouri, adic piesele care pot fi
formate prin alipirea, n toate modurile posibile, a patru ptrele.
Alipirea se face doar pe laturi. Exist apte tipuri de piese, dac se
consider i oglindirile, nu ns i rotirile.
Piesele cad i se depun la baza cutiei dreptunghiulare,
lipindu-se de celelalte piese, care se afl deja la baza cutiei. Dac
prin aceste lipiri se formeaz una sau mai multe linii pline (din stnga
n dreapta), acestea se elimin automat, locul lor fiind luat de cele de
deasupra, care coboar.
n cderea lor piesele sunt controlate de juctor, prin patru
taste:
deplasare la stnga (sgeat stnga);
deplasare la dreapta (sgeat dreapta);
rotire cu 90 de grade (sgeat sus);
coborre forat (sgeat jos).
Juctorul trebuie s aeze fiecare pies n cutie ct mai bine,
n sensul interptrunderii ct mai mult a pieselor de la baza cutiei
ntre ele.
La umplerea/eliminarea unei linii, numrul de puncte (iniial
zero) crete, iar strategia de joc este de a obine ct mai multe
puncte, prin pstrarea ct mai goal a cutiei. Jocul se termin cnd
nu mai pot ptrunde alte piese n cutie, deoarece aceasta este
umplut pn la partea superioar a sa.
135
Este bine s folosii chiar valorile care sunt date mai jos,
pentru a obine un joc n care piesele (a cror mrime va fi stabilit
prin program) s se potriveasc bine n interiorul cutiei.
VERSION 2.00
Begin Form Form1
BackColor
=
Caption
=
ClientHeight
=
ClientLeft
=
ClientTop
=
ClientWidth
=
Height
=
Left
=
LinkTopic
=
ScaleHeight
=
ScaleWidth
=
Top
=
Width
=
Begin Timer Timer1
Interval
Left
Top
End
Begin Label Label1
Alignment
BackColor
BorderStyle
Caption
Height
Left
TabIndex
Top
Width
End
Begin Shape Shape1
BorderStyle
FillColor
FillStyle
Height
Index
Left
Top
Width
&H00FFFFFF&
"Tetris"
5985
2970
1455
3630
6390
2910
"Form1"
5985
3630
1110
3750
=
=
=
350
1560
600
=
=
=
=
=
=
=
=
=
2 'Center
&H0000FF00&
1 'Fixed Single
"Punctaj: 0"
255
480
0
5520
2535
=
=
=
=
=
=
=
=
0 'Transparent
&H000080FF&
0 'Solid
420
2
600
5000
2475
137
End
Begin Shape Shape1
BorderStyle
FillColor
FillStyle
Height
Index
Left
Top
Width
End
Begin Shape Shape1
BorderStyle
FillColor
FillStyle
Height
Index
Left
Top
Width
End
End
=
=
=
=
=
=
=
=
0 'Transparent
&H000080FF&
0 'Solid
5295
1
3010
120
375
=
=
=
=
=
=
=
=
0 'Transparent
&H000080FF&
0 'Solid
5295
0
240
120
385
Timer1
Shape1
Label
138
139
Sub Init_Mat ()
For i = 0 To 19
For j = 0 To 9
mat(i, j) = 0
Next j
Next i
For i = 0 To 9
mat(20, i) = 1
Next i
Randomize
gen_piesa = True
x00 = 615: y00 = 200
latx = 240: laty = 240
punctaj = 0
End Sub
y1,
y2,
y3,
y4,
c
c
c
c
140
Sub Rotire ()
Select Case fig
Case 0
Select Case poz
Case 0
ax1 = x2 - 1: ax2 = x2: ax3 = x2 + 1: ax4 = x2 + 2
ay1 = y2: ay2 = y2: ay3 = y2: ay4 = y2
poz = 1
Case 1
141
= x3 + 1: ax4 = x3 + 1: ax3 = x3 + 2
= y3: ay3 = y3: ay4 = y3 - 1
142
143
Stinga
Case 39
Dreapta
Case 38
Rotire
Case 40
Do
Jos
If pot_mut() Then
Df 0
x1 = ax1: x2 = ax2
x3 = ax3: x4 = ax4
y1 = ay1: y2 = ay2
y3 = ay3: y4 = ay4
Df 1
End If
Loop Until Not pot_mut()
End Select
If pot_mut() Then
Df 0
x1 = ax1: x2 = ax2: x3 = ax3: x4 = ax4
y1 = ay1: y2 = ay2: y3 = ay3: y4 = ay4
Df 1
End If
End Sub
144
(ax4 < 0) Or
(ax4 > 9) Then
= 1) Or
= 1) Then
145
x1 = 4: x2 = 5: x3 = 5: x4 = 6
y1 = 0: y2 = 0: y3 = 1: y4 = 1
Case 6
x1 = 4: x2 = 5: x3 = 5: x4 = 6
y3 = 0: y4 = 0: y1 = 1: y2 = 1
End Select
gata = False
If (mat(y1, x1) = 1) Or (mat(y2, x2) = 1) Or
(mat(y3, x3) = 1) Or (mat(y4, x4) = 1) Then
gata = True
End If
If gata Then MsgBox "Joc Terminat": End
Df 1
End If
Jos
If pot_mut() Then
Df 0
x1 = ax1: x2 = ax2: x3 = ax3: x4 = ax4
y1 = ay1: y2 = ay2: y3 = ay3: y4 = ay4
Df 1
gen_piesa = False
Else
mat(y1, x1) = 1: mat(y2, x2) = 1: mat(y3, x3) = 1
mat(y4, x4) = 1
lin = 19
Do While lin > 2
If plina(lin) Then
Beep
punctaj = punctaj + 10
For i = lin To 1 Step -1
For j = 0 To 9
mat(i, j) = mat(i - 1, j)
If mat(i, j) = 1 Then
Dp j, i, 1
Else
Dp j, i, 0
End If
Next j
Next i
For i = 0 To 9
mat(0, i) = 0
Next i
Else
lin = lin - 1
End If
Loop
gen_piesa = True
End If
Label1.Caption = "Punctaj: " & punctaj
End Sub
146
147
Aplicaia 14
Puzzle cu numere
14.1. Prezentarea general a problemei
Este vorba despre binecunoscutul joc solitar de Puzzle
(comercializat n Romnia mai demult sub numele de Perspico).
Pe o tabl cu nn spaii ptrate se afl aezate n2-1 piese
ptrate care se pot muta prin culisare n spaiul liber. Se mut doar
una din piesele alturate spaiului liber. La nceput se amestec
piesel, apoi trebuie refcut poziia lor iniial. De obicei se pleac de
la o poziie n care piesele (care sunt numerotate de la 1 la n2-1)
sunt aezate n ordine, pe linii, de la stnga la dreapta.
Iat un exemplu din jocul cu n=4 pe care l vom realiza n
cadrul acestui capitol:
Begin CommandButton
Command1(0..15)
Height
= 375
Index
= 0..15
Left
= 0
TabIndex = 0..15
Top
= 0
Visible = 0 'False
Width
= 375
End
148
150
Aplicaia 15
Puzzle cu imagini
151
285
240
0
120
2415
152
285
2880
1
"3"
120
615
"Despre program"
495
0
240
600
495
153
Image1
PicClip1
CommandButton
TextBox
TextBox Text1
'Fixed
=
=
=
=
=
=
=
=
=
=
=
=
=
=
"Form1"
5520
2325
1770
5400
6210
2265
"Form1"
0
'False
0
'False
5000
0 'User
5500
1140
154
155
For j = 0 To n - 1
Image1(n * i + j).Picture=PicClip1.GraphicCell(n*i+j)
Image1(n * i + j).Top = L * i + 500
Image1(n * i + j).Left = L * j
Image1(n * i + j).Width = L
Image1(n * i + j).Height = L
Image1(n * i + j).Visible = True
Image1(n * i + j).Stretch = True
Image1(n * i + j).Tag = n * i + j
Next j
Next i
Image1(n * n - 1).Picture = LoadPicture()
x = n * n - 1
ii = n: jj = n
' amestecare imagini
Image1_Click (n * n - 2)
Image1_Click (n * n - 3)
m = 0
Randomize
For i = 1 To 5000
mm = m
k = Int(Rnd * (n * n))
Image1_Click (k)
m = mm
Next i
Exit Sub
sf:
MsgBox "Imagine negasita!", 48, "Eroare"
End
End Sub
156
aux = Image1(x).Tag
Image1(x).Tag = Image1(Index).Tag
Image1(Index).Tag = aux
x = Index
ii = x \ n + 1: jj = x Mod n + 1
ok = True
For i = 0 To n * n - 1
If " " + Image1(i).Tag <> Str(i) Then ok = False
Next i
m = m + 1
If ok Then
MsgBox "Felicitari !" + Chr$(13) + Chr$(10) +
"Ai rezolvat problema in " & m & " mutari
!",
48, "Joc terminat"
Command1_Click
End If
End If
End Sub
157
Aplicaia 16
Bila
158
159
Timer
Spiner
Shape Paleta
Spiner Spiner3
Spiner
Label
161
162
Aplicaia 17
Test gril
163
164
Font3D
=
0 'None
Height
=
1575
Left
=
120
TabIndex
=
5
Top
=
120
Width
=
5535
Begin TextBox Intreb
Enabled
=
0
'False
Height
=
1095
Left
=
240
MultiLine
=
-1 'True
ScrollBars
=
3 'Both
TabIndex
=
8
Top
=
360
Width
=
5175
End
End
Begin SSFrame Raspunsuri
Caption
=
"Alegeti raspunsul"
Font3D
=
0 'None
Height
=
2775
Left
=
120
TabIndex
=
0
Top
=
2280
Width
=
8295
Begin SSCheck Raspuns
Font3D
=
0 'None
Height
=
375
Index
=
1
Left
=
360
TabIndex
=
6
Top
=
840
Width
=
7935
End
Begin SSCheck Raspuns
Font3D
=
0 'None
Height
=
375
Index
=
4
Left
=
360
TabIndex
=
4
Top
=
2280
Width
=
7935
End
Begin SSCheck Raspuns
Font3D
=
0 'None
Height
=
375
Index
=
3
Left
=
360
TabIndex
=
3
Top
=
1800
165
Width
=
7935
End
Begin SSCheck Raspuns
Font3D
=
0 'None
Height
=
375
Index
=
2
Left
=
360
TabIndex
=
2
Top
=
1320
Width
=
7935
End
Begin SSCheck Raspuns
Font3D
=
0 'None
Height
=
375
Index
=
0
Left
=
360
TabIndex
=
1
Top
=
360
Width
=
7935
End
End
Begin Image Imagine
Height
=
1935
Left
=
5760
Picture
=
INTREB.FRX:0000
Stretch
=
-1 'True
Top
=
120
Width
=
2655
End
End
166
SSFrame Intrebare
TextBox Intreb
SSFrame
SSCheck
167
i
o pasare
i
o floare
ELEFANT.BMP
BACAU.BMP
168
cor(i) = "i"
Next i
Open "test.tst" For Input As #1
punctaj = 0
End Sub
169
Imagine.Picture = LoadPicture(nume_desen$)
For i = 0 To 4
Input #1, cor(i + 1)
Input #1, rasp(i + 1)
raspuns(i).Caption = rasp(i + 1)
raspuns(i).Value = False
Next i
End Sub
170
Aplicaia 18
de cele trei texte aferente, fiecare din ele corespunznd exact unuia
dintre cele trei semne de circulaie din stnga.
Semnele rutiere din partea stng se deplaseaz n partea
dreapta prin agare i mutare cu mouse-ul (operaie numit drag
and drop). Trecerea la un nou triplet de semne rutiere se face cu
butonul Apasa! care se activeaz doar dup ce cele trei semne
au fost amplasate n csuele din dreapta.
Dac cele trei semne sunt amplasate corect, punctajul (iniial
zero) crete cu o unitate.
Observaie: aplicaia poate fi modificat de dumneavoastr n
funcie de necesiti. Se pot concepe astfel o serie de programe
educaionale, nu neaprat pe tema circulaiei rutiere.
O descriere minuioas a caracteristicilor formei aplicaiei i a
controalelor pe care aceasta le include este dat mai jos:
Begin Form Form1
BackColor
=
&H00C0C0FF&
BorderStyle
=
3 'Fixed Double
Caption
=
"Circulatia rutiera"
ClientHeight
=
5520
ClientLeft
=
2115
ClientTop
=
1650
ClientWidth
=
7080
Height
=
5925
Left
=
2055
LinkTopic
=
"Form1"
MaxButton
=
0
'False
ScaleHeight
=
5520
ScaleWidth
=
7080
Top
=
1305
Width
=
7200
Begin CommandButton btnStop
Caption
=
"Stop"
Height
=
375
Left
=
1800
TabIndex
=
5
Top
=
2520
Width
=
735
End
Begin CommandButton buton
Caption
=
"Apasa!"
Height
=
375
Left
=
1800
TabIndex
=
0
Top
=
4320
172
Width
=
End
Begin Label punctaj
Alignment
=
BorderStyle
=
Caption
=
Height
=
Left
=
TabIndex
=
Top
=
Width
=
End
Begin Label raspuns
BorderStyle
=
Height
=
Index
=
Left
=
TabIndex
=
Top
=
Width
=
End
Begin Label raspuns
BorderStyle
=
Height
=
Index
=
Left
=
TabIndex
=
Top
=
Width
=
End
Begin Label raspuns
BorderStyle
=
Height
=
Index
=
Left
=
TabIndex
=
Top
=
Width
=
End
Begin Image casuta
BorderStyle
=
Height
=
Index
=
Left
=
Stretch
=
Top
=
Width
=
End
Begin Image casuta
BorderStyle
=
735
2 'Center
1 'Fixed Single
"0"
255
1800
4
840
735
1 'Fixed Single
1455
2
2640
3
3840
2655
1 'Fixed Single
1455
1
2640
2
2040
2655
1 'Fixed Single
1455
0
2640
1
240
2655
1 'Fixed Single
1695
2
5400
-1 'True
3720
1575
'Fixed Single
173
Height
Index
Left
Stretch
Top
Width
End
Begin Image casuta
BorderStyle
Height
Index
Left
Stretch
Top
Width
End
Begin Image semn
Height
Index
Left
Stretch
Top
Width
End
Begin Image semn
Height
Index
Left
Stretch
Top
Width
End
Begin Image semn
Height
Index
Left
Stretch
Top
Width
End
End
=
=
=
=
=
=
1695
1
5400
-1 'True
1920
1575
=
=
=
=
=
=
=
1 'Fixed Single
1695
0
5400
-1 'True
120
1575
=
=
=
=
=
=
1695
2
120
-1 'True
3720
1575
=
=
=
=
=
=
1695
1
120
-1 'True
1920
1575
=
=
=
=
=
=
1695
0
120
-1 'True
120
1575
174
Label punctaj
Image
(0
Image
2)
CommandButton btnStop
Label
Raspuns(0..2
CommandButton
b t
GRNLIGHT.ICO
Apoi este nevoie de un fiier text, s zicem AUTO.TXT
structurat astfel:
nume-de-fiier-imagine-semn-de-circulaie-1 (pe un singur rnd)
explicaie-asociat-semnului-de-circulaie-1 (eventual pe mai multe rnduri)
#
nume-de-fiier-imagine-semn-de-circulaie-2 (pe un singur rnd)
explicaie-asociat-semnului-de-circulaie-2 (eventual pe mai multe rnduri)
#
175
Pentru primul
triplet de
ntrebri
Pentru al
doilea triplet
de ntrebri
SO7.BMP
SU13.BMP
ES22.BMP
SI4.BMP
SI6.BMP
SU30.BMP
176
ordine(0 To 2) As Integer
perm(6, 3)
s$(0 To 2)
cale As String
p As Integer
nr As Integer
S le explicm:
ordine este un vector care memoreaz ordinea n care vor
trebui aezate n csuele din dreapta semnele de circulaie din
stnga (ne referim la momentul execuiei aplicaiei);
perm este un tablou care conine toate cele ase permutri ale
mulimii {1,2,3}, n funcie de care se stabilete (pe cale
aleatoare) i coninutul curent al vectorului ordine;
s$ este un ir de lucru, care va reprezenta textul explicaiei
asociate unui anumit semn de circulaie; valoarea lui s$ va fi
pasat unei dintre etichetele vectorului raspuns (vezi descrierea
de la paragraful anterior)
p este punctajul realizat de juctor;
nr este numrul de ntrebri la care nu a dat nc rspuns
(pentru un anumit triplet de semne rutiere); la fiecare plasare a
unui semn ntr-o csu din stnga, variabila nr scade cu o
unitate, iar cnd devine zero, se verific dac aranjarea semnelor
este corect i n caz afirmativ, p crete cu o unitate;
cale este calea ctre locul unde se gsesc fiierele programului
i va trebui s o adaptai necesitilor dumneavoastr concrete;
avei ns grij ca s punei toate fiierele acestei aplicaii ntr-un
singur director.
177
For i = 0 To 2
semn(i).DragMode = 0
semn(i).DragIcon = LoadPicture(cale
semn(i).Tag = -1
Next i
Open cale + "AUTO.TXT" For Input As #1
perm(1, 1) = 1: perm(1, 2) = 2: perm(1,
perm(2, 1) = 1: perm(2, 2) = 3: perm(2,
perm(3, 1) = 2: perm(3, 2) = 1: perm(3,
perm(4, 1) = 2: perm(4, 2) = 3: perm(4,
perm(5, 1) = 3: perm(5, 2) = 1: perm(5,
perm(6, 1) = 3: perm(6, 2) = 2: perm(6,
End Sub
+ "grnlight.ico")
3)
3)
3)
3)
3)
3)
=
=
=
=
=
=
3
2
3
1
2
1
178
MsgBox "Ai obtinut " & p & " puncte.", 48, "Oprire"
End
End If
buton.Enabled = False
k = Int(1 + Rnd * 6)
For i = 0 To 2
ordine(i) = perm(k, i + 1) - 1
casuta(i).Picture = LoadPicture()
Input #1, fis_imag$
semn(i).Picture = LoadPicture(cale + fis_imag$ +
".bmp")
semn(i).Tag = i
semn(i).DragMode = 1
s$(i) = ""
Do
Input #1, un_text
If un_text <> "#" Then s$(i) = s$(i) + " " +
un_text
Loop Until un_text = "#"
Next i
For i = 0 To 2
raspuns(i).Caption = s$(ordine(i))
Next i
nr = 3
End Sub
179
End If
End If
End Sub
semnul de
circulaie care se
deplaseaz prin
drag and drop din
stnga n dreapta
Sub btnStop_Click ()
End
End Sub
181
Aplicaia 19
Bioritm
19.1. Prezentare general
Problema trasrii grafice a celor trei curbe corespunztoare
evoluiei fizice, psihice i intelectuale a unei persoane este studiat i
rezolvat n lucrarea mea, Aplicaii n C i C++ (vezi bibliografia).
Este vorba despre ceea ce specialitii numes bioritm.
Noi ne propunem s realizm o aplicaie cu mai multe
ferestre, ca n figura urmtoare:
182
183
Text
Text
Text
Command
Avem urmtoarele proprieti ale acestei forme:
Begin Form frmDate
BorderStyle=3'Fixed Double
Caption="Date despre persoana"
LinkTopic="Form1"
Visible=0 'False
184
....
End
fiierul BIORITM.FRM
Avem de a face acum cu principala form a aplicaiei, n care
se traseaz efectiv un triplet de curbe bioritmice. Descrierea sa este
dat mai jos:
Begin Form frmBioritm
AutoRedraw
=
-1 'True
Caption
=
":1"
LinkTopic
=
"Form1"
MDIChild
=
-1 'True
Visible
=
0
'False
Begin PictureBox Picture1
AutoRedraw
=
-1 'True
End
Begin Label Label3
BorderStyle
=
1 'Fixed Single
Caption = "rosu=fizic, verde=psihic,
albastru=intelect"
End
Begin Label Label2
BackColor
=
&H00C0C0FF&
Height
=
255
Left
=
120
Top
=
480
Width
=
3015
End
Begin Label Label1
BackColor
=
&H00C0C0FF&
Height
=
255
Left
=
120
TabIndex
=
0
Top
=
120
Width
=
3015
End
Begin Menu mnuFile
Caption
=
"&Persoane"
Begin Menu mnuFNew
Caption
=
"&Noua"
End
Begin Menu mnuFOpem
Caption
=
"&Veche"
End
Begin Menu mnuFClose
Caption
=
"&Sterge"
End
185
Label1
Label3
Label2
Picture
186
Const modal = 1
Const CASCADE = 0
Const TILE_HORIZONTAL = 1
Const TILE_VERTICAL = 2
Const ARRANGE_ICONS = 3
nume_pers As String
data_nast As String
data_ref As String
prima_data As Integer
Global Z(12)
Global Sters() As Integer
Global Persoana() As New frmBioritm
Avem:
nume_pers este numele persoanei curente, care va fi afiat n
antetul (proprietatea Caption) ferestrei copil de tip
frmBioritm, cnd se va reprezenta un nou bioritm;
data_nast este data de natere a persoanei pentru care se
reprezint bioritmul (este de forma zz.ll.aaaa, deci zilele i
lunile vor ocupa exact dou cifre, folosindu-se eventual zerouri n
fa; de exemplu, luna ianuarie se scrie sub forma 01); nu uitai
s scriei punctele despritoare (sau orice alt simbol);
data_ref este prima din cele 31 de zile pentru care se
reprezint curbele bioritmice (este n format zz.ll.aaaa);
n plus:
prima_data este o variabil boolean special, care indic dac
se reprezint primul bioritm sau nu; este utilizat pentru a indica
crearea (iniial) a celor doi vectori: Sters() i Persoana()
Persoana() - cuprinde ferestre de tip frmBioritm, generate
dinamic sau pe baza altora mai vechi, care au fost nchise (cnd
se nchide o fereastr i, acest lucru se marcheaz prin
Sters(i)=True)
187
188
189
Exit Sub
End If
NZ = NrZile(D2, M2, Y2) - NrZile(D1, M1, Y1)
Dim pas As Integer, L As Integer, x As Integer
pers.Picture1.Top = 1000
pers.Picture1.Left = 100
pers.Picture1.Width = pers.Width - 300
pers.Picture1.Height = pers.Height - 1500
pas = pers.Picture1.Width \ 31
x = pers.Picture1.Height - 200
L = Int(pers.Picture1.Height / 2.5)
Dim cul
For i = 1 To 3
Select Case i
Case 1: cul = RGB(255, 0, 0)
Case 2: cul = RGB(0, 255, 0)
Case 3: cul = RGB(0, 0, 255)
End Select
Q(i) = NZ Mod p(i)
UR = 2 * PI * Q(i) / p(i)
SR = Sin(UR)
SE = Int((SR + 1) * L)
For n = NZ To NZ + 31
Q(i) = n Mod p(i)
UR = 2 * PI * Q(i) / p(i)
SR = Sin(UR)
SEN = Int((SR + 1) * L)
pers.Picture1.Line (pas*(n-NZ-1),x-SE)(pas*(n-NZ),x-SEN),cul
SE = SEN
Next n
Next i
End Sub
191
Fiierul FRMDATE.FRM
Aici avem trei casete de text. Dup ce se completeaz fiecare
din ele, se poate trece mai departe (la urmtoarea, respectiv la
butonul Command1):
Sub Text1_KeyPress (keyAscii As Integer)
If keyAscii = 13 Then Text2.SetFocus
End Sub
Sub Text2_KeyPress (keyAscii As Integer)
If keyAscii = 13 Then Text3.SetFocus
End Sub
Sub Text3_KeyPress (keyAscii As Integer)
If keyAscii = 13 Then Command1.SetFocus
End Sub
Fiierul BIORITM.FRM
Acesta este fiierul care cuprinde codul corespunztor unei
ferestre copil, de tip frmBioritm. Subrutinele care urmeaz prezint
principalele operaii care se pot face cu o astfel de fereastr, aa
cum suntei obinuii n programele MDI de sub Windows:
a) nchiderea unei ferestre, din meniu - cuprinde un apel interesant
care nchide fereastra curent: Unload Me.
Sub mnuFClose_Click ()
Unload Me
End Sub
193
End Sub
194
195
Aplicaia 20
Editor de hri
acesta este
simbolul ateneului
=
=
=
=
=
=
=
-1 'True
"Harta orasului"
2430
4410
2055
3375
0
'False
197
FontItalic
=
0
'False
FontName
=
"Arial"
FontSize
=
8.25
FontStrikethru =
0
'False
FontUnderline
=
0
'False
Height
=
3390
Left
=
4350
LinkTopic
=
"Form1"
ScaleHeight
=
2430
ScaleWidth
=
3375
Top
=
1155
Width
=
3495
Begin Image ob
Height
=
735
Index
=
0
Left
=
120
Top
=
1080
Visible
=
0
'False
Width
=
615
End
Begin Image obiectiv
DragMode
=
1 'Automatic
Height
=
615
Index
=
0
Left
=
120
Top
=
120
Visible
=
0
'False
Width
=
615
End
Begin Menu mnuHartaNoua
Caption
=
"&Harta noua"
End
Begin Menu mnuClear
Caption
=
"&Stergere strazi"
End
Begin Menu mnuExit
Caption
=
"&Oprire program"
End
Begin Menu mnuDespre
Caption
=
"&Despre program"
End
End
Obiectiv(0)
Ob(0)
Fiierul HARTA_D.FRM
Un al doilea fiier este fiierul HARTA_D.FRM care conine
descrierea unei forme Form2, foarte simpl. Ea cuprinde o etichet
explicativ (Label1) i o caset de text (Text1). n respectiva
caset se va introduce denumirea obiectului (ob-ului) curent, care
urmeaz a se amplasa pe harta oraului.
Begin Form Form2
BorderStyle
=
3 'Fixed Double
Caption
=
"Form2"
ClientHeight
=
945
ClientLeft
=
3195
ClientTop
=
3345
ClientWidth
=
3930
Height
=
1350
Left
=
3135
LinkTopic
=
"Form2"
MaxButton
=
0
'False
MinButton
=
0
'False
ScaleHeight
=
945
ScaleWidth
=
3930
Top
=
3000
Width
=
4050
Begin TextBox Text1
Height
=
285
199
Left
=
TabIndex
=
Top
=
Width
=
End
Begin Label Label1
Caption
=
Enter!"
Height
=
Left
=
TabIndex
=
Top
=
Width
=
End
End
240
1
480
3495
Label1
Text1
200
Fiierul HARTA.FRM
n acest fiier avem urmtoarele declaraii generale:
Dim
Dim
Dim
Dim
Dim
Dim
Dim
201
202
MOVIES->Cinema
PHONE->Telefoane
PHARMACY->Farmacia
SEMINAR->Liceul
LUGGAGE->Agentia de voiaj
LETTERS->PTTR
CAR->Service auto
CROSS2->Cimitirul
TENNIS->Terenul de sport
COFFEE->Barul
CTYBLOCK->Zona rezidentiala
OFFICBLD->Institutia
TULIPS->Florarie
BOOKS->Biblioteca
DRAMA->Teatrul
WEDDING->Oficiul starii civile
OLYMPIAN->Sala de atletism
DESSERT->Cofetaria
EAGLE_GR->Primaria
CHURCH1->Catedrala
GRADUATE->Universitatea
DISCO->Discoteca
DISK->Firma de calculatoare
CONDUCTR->Ateneul
CHURCH2->Biserica
ELEPHANT->Gradina zoologica
ARTIST->Galeriile de arta
PLATE->Restaurantul
WINEBOTL->Crama
NEWYEAR->Monumentul/Statuia
CADUCEUS->Camera de comert
PALMTREE->Gradina botanica
ORBIT->Institutul
QUESTION->
Sub Form_Load ()
desen = False
n = 0: ns = 0
has = Form1.ScaleHeight \ 15
lat = has
x_min = 3 * has + 50
rap_x = 1: rap_y = 1
x_0 = ScaleWidth - x_min: y_0 = ScaleHeight
ChDir app.Path
Open "HARTA.TXT" For Input As #1
For j = 1 To 3
For k = 1 To 15
i = 15 * (j - 1) + k
Line Input #1, s
p = InStr(s, "->")
fis_ob = Left(s, p - 1) + ".WMF"
nume_ob = Right(s, Len(s) - p - 1)
Load obiectiv(i)
obiectiv(i).BorderStyle = 1
obiectiv(i).Stretch = True
obiectiv(i).Left = lat * (j - 1)
obiectiv(i).Top = has * (k - 1)
obiectiv(i).Width = lat
obiectiv(i).Height = has
obiectiv(i).Tag = nume_ob
obiectiv(i).Picture = LoadPicture(fis_ob)
obiectiv(i).DragMode = 1
obiectiv(i).Visible = True
Next k
Next j
Close #1
End Sub
204
X_min
pictograma cu
pachetul, care
reprezint un magazin
205
206
207
208
ob(i).Left=(ob(i).Left-x_min_vechi)*rap_x+x_min
ob(i).Top = ob(i).Top * rap_y
' calculez noile dimensiuni in functie de un obiectiv
ob(i).Width = obiectiv(1).Width
ob(i).Height = obiectiv(1).Height
'afisez din nou
ob(i).Visible = True
Next i
End Sub
Restul subrutinelor
prezentate mai jos:
(din
fiierul
HARTA.FRM)
209
sunt
Fiierul HARTA_D.FRM
Acest fiier conine doar o singur subrutin, uor de neles,
care acioneaz la finele introducererii unui text n caseta Text1:
210
Bibliografie
1. Bogdan Ptru - Aplicaii n Delphi, Editura Teora, Bucureti, 1998.
2. Bogdan Ptru - Aplicaii n Visual Basic, Editura Teora, Bucureti,
1998
*
*
211