+ All Categories
Home > Documents > 20 Aplicatii Delphi Si VB

20 Aplicatii Delphi Si VB

Date post: 17-Feb-2018
Category:
Upload: olaru-costin
View: 247 times
Download: 0 times
Share this document with a friend

of 212

Transcript
  • 7/23/2019 20 Aplicatii Delphi Si VB

    1/212

  • 7/23/2019 20 Aplicatii Delphi Si VB

    2/212

    Bogdan Ptru

    20 APLICAII DELPHI I VISUAL BASIC

    EduSoftBacu 2005

  • 7/23/2019 20 Aplicatii Delphi Si VB

    3/212

    2

    Redactor: Tiberiu Socaciu

    Copyright 2005 Editura EduSoftToate drepturile asupra prezentei ediii sunt rezervateEditurii EduSoft. Reproducerea parial sau integral aconinutului, prin orice mijloc, fr acordul scris al EdituriiEduSoft este interzisi se va pedepsi conform legislaiei

    n vigoare.

    Editura EduSoft600065 Bacu, str. 9 Mai, nr. 82, sc. C, ap. 13E-mail: [email protected], Web: www.edusoft.ro

    ISBN 973-87655-3-6

  • 7/23/2019 20 Aplicatii Delphi Si VB

    4/212

    3

    CUPRINS

    INTRODUCERE

    PARTEA I. APLICAII N DELPHI 51. Ciupercile - un joc de ndemnare i perspicacitate 72. Harta - un program despre Romnia turistic 263. Mrfuri - un joc de logic 384. Puzzle - un joc de perspicacitate 495. Supraf - reprezentarea grafica suprafeelor 546. Parser - analiza sintactici lexicala unei fraze 61

    7. AutoWeb - Creator de pagini web 718. Zodiac - ce ne este scris n stele? 849. Gastro - program pentru reete culinare 102

    PARTEA II. APLICAII N VISUAL BASIC 11310. Calculator de buzunar 11511. Prinde mutele 122

    12. Vntoarea de berze 12813. Tetris 13514. Puzzle cu numere 14815. Puzzle cu imagini 15116. Bila 15817. Test gril 16318. Test de circulaie rutier 171

    19. Bioritm 18220. Editor de hri 196

    BIBLIOGRAFIE 211

  • 7/23/2019 20 Aplicatii Delphi Si VB

    5/212

    4

    Introducere

    Prin aceast carte dorim s venim n sprijinul tuturor celorcare programeazsau doresc sprogrameze n mediul Windows icare vor srealizeze aplicaii Windows uor i repede.

    Aceastcarte este o colecie de aplicaii dezvoltate n mediilede programare vizual Delphi i Visual Basic, realizate icomercializate de firmele Inprise (Borland), respectiv Microsoft.

    Mediul de programare Delphi permite realizarea de programecare sse execute n Windows, cu interfee de tip Windows, pe bazaunui limbaj de programare de tip Pascal, iar mediul de programare

    Visual Basic se bazeazpe limbajul foarte simplu de nvat Basic.Interfeele aplicaiilor vizuale se implementeaz cu uurin, darproiectarea i dezvoltarea unor aplicaii inteligente i puternice nu sepoate realiza fr un efort de gndire din partea programatorului.

    Aceasta presupune proiectarea i implementarea n limbajul ObjectPascal, respectiv Visual Basic a unor algoritmi eficieni de rezolvarea problemelor n cauz.

    Aadar, cartea se adreseazprogramatorilor serioi, care aucunotinele suficiente de programare obiectuali vizualn mediilede programare menionate. Dar chiar i programatorii obinuii cumedii de programare mai simple pot nva uor programarea vizual

    n Delphi sau Visual Basic, pe baza unor exemple ca cele dinaceastlucrare.

    Exemplele de aplicaii prezentate n aceast lucrare sunt

    diferite prin temele pe care le trateaz. Am ncercat sacoperim unnumr suficient de situaii pe care orice programator le-ar ntlniatunci cnd ar dori selaboreze un program mai complex n Delphisau Visual Basic.

    Cititorii care doresc s intre n posesia surselor programelorprezentate n aceast carte i a fiierelor cu date (imagini, sunete,text) sunt rugai sne viziteze site-ul http://edusoft.inf.ro.

    Cu convingerea c oricine va studia cu atenie aplicaiileprezentate n aceast carte va face din programarea vizual opasiune, le doresc cititorilor lecturplcuti compilare frerori!

    Autorul

  • 7/23/2019 20 Aplicatii Delphi Si VB

    6/212

    5

    PARTEA I

    APLICAII N DELPHI

  • 7/23/2019 20 Aplicatii Delphi Si VB

    7/212

    6

  • 7/23/2019 20 Aplicatii Delphi Si VB

    8/212

    7

    Aplicaia 1Ciupercile - un joc de ndemnare i

    perspicacitate

    1.1. Prezentare general

    Ne propunem s realizm un joc de ndemnare iperspicacitate clasic, pe care l-am denumit Ciupercile i n care,mnuind un omule printr-un labirint de ziduri i scri, trebuie sculegem cu el ni

    te ciuperci amplasate n diferite pozi

    ii ale acestui

    labirint. De asemenea, trebuie sne ferim de dumani, care n cazulacestui joc sunt nite caracatie. Firete, dei scenariul pare imposibil(ciuperci, caracatie, omulei, ziduri i scri), trebuie sne gndim ctotul este doar un joc!

    Iatcum va arta jocul nostru n timpul execuiei programului:

  • 7/23/2019 20 Aplicatii Delphi Si VB

    9/212

    8

    Ceea ce observai dumneavoastr n imaginea de mai suseste un moment din timpul desfurrii jocului pe cazul unui labirintdat (vezi LAB3.LBR). De fapt, vom creea, separat, cu un editor detexte simplu (de pild Notepad) mai multe fiiere cu labirinturi, cacele de mai jos:

    LAB1.LBR

    @@@@@@@@@@@@@@@@@@@@@@@ @@ & ** * @@@@@@@@#@@@@@@@ @@#@@@ # # @@ & # # @@@@@@@@@@@@@@@@#@@@@@@

    @ # @@* $ # @@@@#@@@@@@@@@@@@@@@@@@@ # * @@ # @@@@@#@@ @@ # * # @@ @#@@@@ # @

    @ # & # & @@@@@@@@@@@@@@@@@@@@@@@

    LAB2.LBR

    @@@@@@@@@@@@@@@@@@@@@@@ * & * @@@@@@@@#@@@@@@@@@@@#@@@ * * # * # @@@@#@@@@@@ @@#@@@@@@@ # # @@@@#@@ @@@@@@@@@@#@@

    @ # $ * * # @@ #@@@#@@@@@@#@@ # @@ # * # # # @@ @#@@@# * @@@# @@@@@ # @@@ # @@ # ** @@@@@@@#@@@@ @@@@@@@@@

    @ * & * @@@@@@@@@@@@@@@@@@@@@@@

    LAB3.LBR@@@@@@@@@@@@@@@@@@@@@@@ * ** @@@@@@@@#@@@ @@@@@#@@@ ** & # * # @

    @@@#@@@@@@ @@#@@@#@@@* # * ** # * # @@@@#@@@ @@#@@@@@@@#@@@ # # & ** # @@ # @#@@@@@@#@@ # @@ *# $# * *# @@ @#@@@# * @@@# @@@@@ # @@@ # @@ * # & ** @@@@@@@ @@#@ @#@@@@@@@@ * & # # & * @@@@@@@@@@@@@@@@@@@@@@@

    LAB4.LBR@@@@@@@@@@@@@@@@@@@@@@@ @@ **& * * @@@@@@@@#@@@@@@@ @@#@@

    @ * # ** & # @@@@@#@@@@@ @@@#@#@@@@@ *# # # @@@@@#@ @@@@# # @@* # $ # # * @@@@#@@@@@@@@@@#@@#@@@@@ # * *# # @@ #@@@@ @@@@#@@# @@ # & * *# # @@ @#@@@@ @#@@@ @@ # ** & # * @@@@@@@@@@@@@@@@@@@@@@@

  • 7/23/2019 20 Aplicatii Delphi Si VB

    10/212

    9

    Aceste fiiere text conin, sub o form codificat, toateinformaiile necesare reprezentrii att a labirintului n care sedesfoar aciunea din jocul curent, ct i poziiile ciupercilor,poziiile iniiale ale caracatielor i a omuleului. Am spus "iniiale",deoarece, o datcu trecerea timpului, caracatiele vor avea micrialeatorii prin labirint, vor merge pe diferitele niveluri i vor trece de la

    un nivel la altul folosindu-se de scri. Micrile lor nu vor fi controlatede juctor, ci de un cronometru (Ti mer 1), pe cnd omuleul va fideplasat de ctre juctor, prin intermediul tastelor de cursor.

    Codificarea labirintului respect anumite reguli, de aceea,recomandm cititorului ca, nainte de a-i crea propriile fiiere culabirinturi (LBR), sle realizeze pe cele date ca model.

    Fiecare simbol folosit n fiierul LBR are o anumitsemnificaie:@= zid; #= scar; * = ciuperc;

    &= caracati; $= omuleul.

    Iatrestriciile folosite n crearea labirinturilor:

    un labirint este o matrice cu 22 coloane i 16 rnduri; labirintul este bordat pe margini cu ziduri (@); simbolul omuleului apare o singurdat($); scrile (#) pleacde deasupra unui zid i urcpnla un

    alt nivel, exact ntre douziduri; ciupercile (*) i caracatiele (&) stau pe ziduri;

    se va folosi simbolul ' ' (spaiu) pentru a marca spaiile ncadrul labirintului.

    O alt restricie impusde textul programului, aa dup cumse va vedea, este ca numrul de caracatie snu depeasc10, iarnumrul de ciuperci snu fie mai mare de 30.

    Dacvei crea un labirint greit, atunci vei avea probleme i

    de acest lucru v vei da seama n timpul execuiei programului. lvei opri i vei corecta labirintul pnnu vor mai aprea probleme.De asemenea, putei porni de la un labirint prezentat i l modificaidupdorin, respectnd restriciile de mai sus.

  • 7/23/2019 20 Aplicatii Delphi Si VB

    11/212

    10

    1.2. Textul explicat al programului

    n continuare vom prezenta unit-ul ci uper ci l e1. pas, folositn proiectul Delphi ci uper ci l e. dpr . Acest unit conine toatedeclaraiile de variabile i toate procedurile i alte elemente folosite

    n cadrul aplicaiei. Vom comenta fiecare din aceste proceduri i

    algortmii pe care ele i implementeaz.

    unit ciupercile1;

    interface

    usesWi ndows, Messages, SysUt i l s, Cl asses, Gr aphi cs, Cont r ol s,

    Forms,Di al ogs, Ext Ct r l s, St dCt r l s, Ext Dl gs;

    t ypeTFor m1 = cl ass( TFor m)

    Ti mer 1: TTi mer ;But t on1: TBut t on;Label 1: TLabel ;Label 2: TLabel ;

    pr ocedur e Ti mer 1Ti mer ( Sender : TObj ect ) ;pr ocedur e For mCr eat e( Sender : TObj ect ) ;pr ocedur e But t on1Cl i ck( Sender : TObj ect ) ;pr ocedur e For mKeyDown( Sender : TObj ect ; var Key: Word;

    Shi f t : TShi f t St at e) ;pr ocedur e For mPai nt ( Sender : TObj ect ) ;

    pr i vat e{ Pr i vat e decl ar at i ons }

    publ i c{ Publ i c decl ar at i ons }end;

    varFor m1: TFor m1;

    Declaraiile anterioare definesc o formsimplconinnd doar

    un buton, douetichete i un cronometru:

  • 7/23/2019 20 Aplicatii Delphi Si VB

    12/212

    11

    Toate celelalte lucruri care vor aprea n joc vor fi desenatedirect pe form, folosind metodele de desenare ce vor acionaasupra proprietii Canvas a formei For m1. Firete, imediat dup

    nceputul jocului, butonul But on1, coninnd acel text explicativ, vadisprea.

    i mpl ement at i on

    {$R *. DFM}

    n cadrul programului vom fi nevoii s desenm mai multefigurine (omuleul, ciupercile etc.). De aceea, vom folosi un procedeude desenare relativ, pixel cu pixel, a unor curbe, implementat deprocedura de mai jos.

    Am ncadrat n chenar aceast procedur, pentru c oconsiderm de interes general pentru cititor i la fel vom proceda icu alte proceduri de acest gen, n cadrul crii.

    procedure DeseneazaCurba(x0,y0,c: Integer; s: String);

    var i : Byt e; x, y: I nt eger ;begi n

    x: =x0; y: =y0;

    f or i : =1 t o Lengt h( s) dobegi n

    case s[ i ] of' 1' : Dec( y) ;' 2' : begi n I nc( x) ; Dec( y) end;' 3' : I nc( x) ;' 4' : begi n I nc( x) ; I nc( y) end;' 5' : I nc( y) ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    13/212

    12

    ' 6' : begi n Dec( x) ; I nc( y) end;' 7' : Dec( x) ;' 8' : begi n Dec( x) ; Dec( y) end

    end;For m1. Canvas. Pi xel s[ x, y] : =c

    endend;

    Aceastprocedurdeseneazo curb, punct cu punct, careare culoarea c. Punctul de plecare al curbei are coordonatele x0, y0,iar fiecare din urmtoarele puncte va avea coordonate n funcie decoordonatele punctului precedent. n acest sens se va folosi ocodificare prin cifrele '1'..'8', reprezentnd direciile de "deplasare"pentru desenarea punctului urmtor.

    De pild, pentru a desena curba din urmtoarea figur, vomapela procedura anterioarastfel:

    DeseneazaCurba(x0,y0,clBlack,'023354').

    Ciupercile i omuleul se deplaseazprin labirint. Deplasareava presupune tergerea figurinei din poziia veche i redesenarea ei

    n noua poziie. tergerea se va face cu ajutorul procedurii de mai

  • 7/23/2019 20 Aplicatii Delphi Si VB

    14/212

    13

    jos, ai crei parametri indiczona dreptunghiularcare urmeazsfie tears, prin colorarea tuturor punctelor sale n culoarea fondului(aici cl Bt nFace).

    procedure ClearView(x1,y1,x2,y2: Integer);

    var i , j : I nt eger ;begi n

    f or i : =x1 t o x2 dof or j : =y1 t o y2 do

    For m1. Canvas. Pi xel s[ i , j ] : =cl Bt nFaceend;

    Urmeaz declaraiile de constante, variabile i tipuri de datereferitoare la toate personajele din scenariul nostru:

    const l at =24;

    Aceast variabil reprezint mrimea laturii oricrui ptreldin labirint (fie ceste zid, scarsau altceva). Labrintul propriu-zis vafi stocat sub forma unei matrice cu 16 linii i 22 coloane:

    var L: ar r ay[ 1. . 16, 1. . 22] of Char ;

    Prin vi et i am notat numrul de viei ale omuleului, care va fiiniial 10 i va scdea de fiecare datcnd o caracatil va ntlni.Xom, Yomsunt coordonatele curente ale omuleului, iar Xom_i iYom_i sunt coordonatele sale iniiale.var vi et i , Xom, Yom, Xom_i , Yom_i : I nt eger ;

    Numrul maxim de ciuperci i numrul maxim de caracatieeste precizat prin declaraiile:

    const max_ci up=30; max_car ac=10;

    Urmeaz declaraiile unor tipuri de date obiectuale,TCi uper ca i TCar acat i t a. O ciuperc este caracterizat decoordonatele sale n labirint i ca metode avem I ni t pentru

    iniializare, Di spl ay pentru afiare i Cl ear , pentru tergere,folositatunci cnd omuleul a cules ciuperca n cauz.

    t ype TCi uper ca = obj ectx, y: I nt eger ;pr ocedur e I ni t ( x0, y0: I nt eger ) ;pr ocedur e Di spl ay;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    15/212

    14

    pr ocedur e Cl ear ;end;

    O caracatiare, n plus, un atribut mut care reprezintsensuldeplasrii caracatiei la un moment dat, deplasarea propriu-zisfcndu-se cu ajutorul metodei Move. Dupdefinirea tipului de dateTCar acat i t a urmeaz declararea vectorilor cu ciuperci i

    caracatie.t ype TCar acat i t a = obj ect

    x, y, mut : I nt eger ;pr ocedur e I ni t ( x0, y0: I nt eger ) ;pr ocedur e Di spl ay;pr ocedur e Cl ear ;pr ocedur e Move;

    end;

    var Ci up: ar r ay[ 0. . max_ci up] of TCi uper ca;Car ac: ar r ay[ 0. . max_car ac] of TCar acat i t a;

    Vom avea nevoie i de urmtoarele trei variabile,reprezentnd respectiv numrul de ciuperci rmase n labirint,numrul iniial de ciuperci, numrul de caracatie:

    var ci uper ci , ci uper ci _ i ni t i al e, car acat i t e: I nt eger ;

    Desenarea omuleului n ptrelul de coordonate i , j dinmatricea labirintului se va face cu procedura de mai jos, careapeleaz att procedura DeseneazaCur ba, ct i ale metodegrafice (Fl oodFi l l , Rect angl e) ce scriu direct n proprietatea

    Canvas a formei For m1.procedure Omulet(i,j: Integer);

    begi nDeseneazaCur ba( l at *j +3, l at *i +11, cl Bl ack,

    ' 0555443433336666653332321244443331' +' 8888833322221776676777777777888' ) ;

    For m1. Canvas. Br ush. St yl e: =bsSol i d;For m1. Canvas. Br ush. Col or : =cl Bl ue;

    For m1. Canvas. Fl oodFi l l ( l at *j +4, l at *i +14,cl Bl ack, f sBor der ) ;

    For m1. Canvas. Br ush. Col or : =cl Bl ue;For m1. Canvas. Fl oodFi l l ( l at *j +12, l at *i +16,

    cl Bl ack, f sBor der ) ;DeseneazaCur ba( l at *j +8, l at *i +7, cl Yel l ow,

    ' 0565454433333222118187777777' ) ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    16/212

    15

    For m1. Canvas. Br ush. Col or : =cl Yel l ow;For m1. Canvas. Fl oodFi l l ( l at *j +10, l at *i +9,

    cl Yel l ow, f sBor der ) ;For m1. Canvas. Pen. Col or : =cl Gr een;For m1. Canvas. Pen. Wi dt h: =1;For m1. Canvas. Br ush. Col or : =cl Gr een;For m1. Canvas. Rect angl e( l at *j +7, l at *i +3,

    l at * j +18, l at * i +6) ;

    For m1. Canvas. Pen. Col or : =cl Whi t e;For m1. Canvas. MoveTo( l at *j +11, l at *i +2) ;For m1. Canvas. Li neTo( l at *j +14, l at *i +2) ;DeseneazaCur ba( l at *j +10, l at *i +8, cl Fuchsi a, ' 0357' ) ;DeseneazaCur ba( l at *j +14, l at *i +8, cl Fuchsi a, ' 0357' ) ;DeseneazaCur ba( l at *j +10, l at *i +11, cl Red, ' 03533313' )

    end;

    Procedura Ti par realizeaz afiarea informaieicorespunztoare unei celule a matricei labirintului, n funcie deconinutul acesteia (dat de L [ i , j ] , unde i ij sunt linia, respectivcoloana acelei celule).

    procedure Tipar(i,j: Integer);

    begi ncase L[ i , j ] of

    ' ' : Cl ear Vi ew( l at * j +1, l at * i +1,l at *j +l at , l at *i +l at - 1) ;

    ' * ' : begi nCi up[ 0] . I ni t ( i , j ) ; Ci up[ 0] . Di spl ay

    end;{ ' &' : begi n

    Car ac[ 0] . I ni t ( i , j ) ; Car ac[ 0] . Di spl ayend; }

    ' #' : begi nFor m1. Canvas. Pen. Col or : =cl mar oon;For m1. Canvas. Pen. Wi dt h: =3;For m1. Canvas. Movet o( l at *j +l at di v 3, l at *i ) ;For m1. Canvas. Li neTo( l at *j +l at di v 3,

    l at * ( i +1) - 1) ;For m1. Canvas. MoveTo( l at *( j +1) - l at di v 3,

    l at *i ) ;For m1. Canvas. Li neTo( l at *( j +1) - l at di v 3,

    l at * ( i +1) - 1) ;For m1. Canvas. MoveTo( l at *j +l at di v 3,

    l at * i +l at di v 3) ;For m1. Canvas. Li neTo( l at *( j +1) - l at di v 3,

    l at * i +l at di v 3)end;

    ' @' : begi n

  • 7/23/2019 20 Aplicatii Delphi Si VB

    17/212

    16

    For m1. Canvas. Pen. Wi dt h: =1;For m1. Canvas. Pen. Col or : =cl Mar oon;For m1. Canvas. Br ush. Col or : =cl Red;For m1. Canvas. Br ush. St yl e: =bsDi agCr oss;For m1. Canvas. Rect angl e( l at *j +1, l at *i ,

    l at * ( j +1) - 1, l at * ( i +1) )end;

    ' $' : Omul et ( i , j )

    endend;

    n continuare, sunt prezentate cele trei metode ale obiectelorcele trei metode ale obiectelorTCi uper ca:

    procedure TCiuperca.Init;

    begi nx: =x0; y: =y0end;

    procedure TCiuperca.Display;

    var i , j : Byt e;begi n

    i : =x; j : =y;DeseneazaCur ba( l at *j +3, l at *i +9, cl Yel l ow,

    ' 0112223232323334334344445577678777777777767777' ) ;For m1. Canvas. Br ush. Col or : =cl Yel l ow;For m1. Canvas. Br ush. St yl e: =bsSol i d;For m1. Canvas. Fl oodFi l l ( l at *j +4, l at *i +8,

    cl Yel l ow, f sBor der ) ;DeseneazaCur ba( l at *j +5, l at *i +7, cl Red, ' 0313557' ) ;DeseneazaCur ba( l at *j +13, l at *i +7, cl Red, ' 01353' ) ;DeseneazaCur ba( l at *j +13, l at *i +3, cl Red, ' 0753' ) ;

    DeseneazaCur ba( l at *j +18, l at *i +6, cl Red, ' 0135' ) ;DeseneazaCur ba( l at *j +11, l at *i +10, cl Li me,' 05556565656544333332212181818111177' ) ;

    For m1. Canvas. Br ush. Col or : =cl Li me;For m1. Canvas. Br ush. St yl e: =bsSol i d;

    For m1. Canvas. Fl oodFi l l ( l at *j +11, l at *i +17, cl Li me, f sBor der )end;

    procedure TCiuperca.Clear;begi n

    Cl ear Vi ew( l at *y+1, l at *x+1, l at *y+l at - 1, l at *x+l at - 1)end;

    De asemenea, avem i metodele obiectelor de tipTCar acat i t a:

  • 7/23/2019 20 Aplicatii Delphi Si VB

    18/212

    17

    procedure TCaracatita.Init;

    begi nx: =x0; y: =y0;mut : =Random( 2) ;

    end;

    n metoda de iniializare, proprietatea (atributul) mut ia una din

    valorile 0 sau 1, pentru o deplasare pe orizontal.

    procedure TCaracatita.Display;

    var i , j : Byt e;begi n

    i : =x; j : =y;DeseneazaCur ba( l at *j +1, l at *i +15, cl Bl ue,

    ' 01222211112123132333433' +

    ' 44455555644344877877644444554881717171717755' +' 44535558181188166557555611211111' +' 767757557561121222177675773123' ) ;

    For m1. Canvas. Br ush. Col or : =cl Aqua;For m1. Canvas. Br ush. St yl e: =bsSol i d;For m1. Canvas. Fl oodFi l l ( l at *j +10, l at *i +4,

    cl Bl ue, f sBor der ) ;DeseneazaCur ba( l at *j +7, l at *i +6,

    cl Gr een, ' 02334557778333168' ) ;DeseneazaCur ba( l at *j +13, l at *i +6,cl Gr een, ' 0233455777825331' )

    end;

    procedure TCaracatita.Clear;

    begi nCl ear Vi ew( l at *y+1, l at *x+1, l at *y+l at - 1, l at *x+l at - 1) ;

    Ti par ( x, y)end;

    De remarcat cmetoda de Cl ear a metodeiTCar acat i t ase terminprin apelul proceduriiTi par , pentru a restabili coninutul"de sub" caracatidin celula de unde pleacacea caracati (carear putea fi spaiu, scarsau ciuperc).

    Urmeaz descrierea metodei TCar acat i t a. Move dedeplasare a unei caracatie. Ea apeleaz la o procedur intern cunumele Mut a, ce are ca argument sensul deplasrii (m: I nt eger ).

    procedure TCaracatita.Move;

    pr ocedur e Mut a( m: I nt eger ) ;begi n

  • 7/23/2019 20 Aplicatii Delphi Si VB

    19/212

    18

    Cl ear ; Ti par ( x, y) ;case m of

    0: y: =y- 1;1: y: =y+1;2: x: =x+1;3: x: =x- 1

    end;Di spl ay

    end;

    begi ncase L[ x, y] of

    ' ' , ' *' :i f L[ x+1, y] =' @' t hen

    case mut of0: i f y>2 t hen

    i f L[ x+1, y- 1] i n [ ' @' , ' #' ] t henMut a( mut )el se

    mut : =1el se

    mut : =1;1: i f y

  • 7/23/2019 20 Aplicatii Delphi Si VB

    20/212

    19

    el se mut : =0el se mut : =0;

    2: i f L[ x+1, y] =' @' t heni f Random( 10)

  • 7/23/2019 20 Aplicatii Delphi Si VB

    21/212

    20

    begi nvi et i : =10;ci uper ci : =0;Assi gnFi l e( F, nf ) ; Reset ( F) ;f or i : =1 t o 16 do

    begi nf or j : =1 t o 22 do

    begi n

    Read( F, L[ i , j ] ) ;{zi d, scar a sau omul et - > se deseneaza}i f L[ i , j ] i n [ ' #' , ' @' , ' $' ] t hen

    Ti par ( i , j ) ;i f L[ i , j ] =' $' t hen {omul et ul }

    begi n L[ i , j ] : =' ' ; Xom: =i ; Yom: =j end;case L[ i , j ] of

    ' * ' : begi n

    {ci uper ca se creeaza,i ni t i al i zeaza s i af i seaza}I nc( ci uper ci ) ;Ci up[ ci uper ci ] . I ni t ( i , j ) ;Ci up[ ci uper ci ] . Di spl ay

    end;' &' : begi n

    {car acat i t a se cr eeaza,i ni t i al i zeaza s i af i seaza}

    I nc( car acat i t e) ;Carac[ caracat i t e] . I ni t ( i , j ) ;Car ac[ car acat i t e] . Di spl ay;L[ i , j ] : =' '

    end;end

    end;ReadLn( F)

    end;Cl oseFi l e( F) ;Xom_i : =Xom; Yom_i : =Yom;ci uper ci _ i ni t i al e: =ci uper ci

    end;

    Urmtoarele douprocedurii afieazpunctajul curent realizatde juctor i numrul de viei ce i-au mai rmas omuleului. Punctajul

    se realizeaz pe baza diferenei dintre ci uperci _i ni t i al e ici uper ci , adic este dat de numrul ciupercilor colectate pnatunci.

    procedure AfisPunctaj;

    var s : St r i ng;begi n

  • 7/23/2019 20 Aplicatii Delphi Si VB

    22/212

    21

    St r ( ci uperci _i ni t i al e- ci uperci , s) ;For m1. Label 1. Capt i on: =' PUNCTAJ : ' +s;

    end;

    procedure AfisVieti;

    var s : St r i ng;begi n

    St r ( vi et i , s) ;

    For m1. Label 2. Capt i on: =' VI ETI RAMASE: ' +s;end;

    Numrul de viei i punctajul curent reprezint indicatori determinare a jocului. Astfel, dacnu au mai rmas ciuperci n labirint,aceasta nseamncjocul s-a terminat cu succes, iar dacomuleuli-a epuizat vieile, aceasta nseamncjocul s-a terminat cu eec.

    Procedura care se ocupde aceste testri este datmai jos. naintede a face cele dou testri, procedura verificdacnu cumva vreocaracati ntlnete n drum omuleul, ceea ce presupunepenalizarea juctorului prin pierderea unei viei a omuleului.

    procedure TestVietiSiPunctaj;

    var i : Byt e; gat a: Bool ean;begi n

    i : =1; gat a: =Fal se;whi l e ( i

  • 7/23/2019 20 Aplicatii Delphi Si VB

    23/212

    22

    Procedura Mut aCar acat i t e se ocup de deplasareantregului ansamblu de inamici ai omuleului i de testarareandeplinirii vreuneia dintre condiiile de terminare ale jocului. Iarmutarea efectiv este apelat la un anumit interval de timp, prinproceduraTFor m1. Ti mer 1Ti mer .

    procedure MutaCaracatite;

    var i : Byt e;begi n

    f or i : =1 t o car acat i t e doCar ac[ i ] . Move;

    Test Vi et i Si Punct ajend;

    procedure TForm1.Timer1Timer(Sender: TObject);

    begi nMut aCar acat i t e

    end;

    Procedura care creeazforma face anumite iniializri asupracaracteristicilor formei i asupra luiTi mer 1, pentru ca acesta snuacioneze ncasupra caracatielor.

    procedure TForm1.FormCreate(Sender: TObject);begi n

    Label 1. Hi de; Label 2. Hi de;Randomi ze; Ti mer 1. I nt er val : =0;Capt i on: =' Ci uper ci l e' ;Top: =50; Lef t : =50;Wi dt h: =580; Hei ght : =470;Bor der St yl e: =bsSi ngl e;

    Label 1. Lef t : =100; Label 2. Lef t : =400;Label 1. Top: =420; Label 2. Top: =420end;

    Abia dupce se acioneazbutonul de pornire, jocul ncepe.Mai nti va trebui s dai numrul labirintului, stabilit implicit la 3,apoi procedura TFor m1. But t on1Cl i ck apeleaz la o procedurde citire a labirintului din fiierul corespunztor i se d drumul lacronometru. Intervalul luiTi mer 1este stabilit invers proporional cunumrul de caracatie.

    procedure TForm1.Button1Click(Sender: TObject);

    var si r : St r i ng;begi n

    But t on1. Hi de;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    24/212

    23

    s i r : =I nput Box( ' Ci uper ci l e' ,' Dat i numar ul l abi r i nt ul ui [ 1. . 4] ! ' , ' 3' ) ;

    Ci t est eLabi r i nt ( ' LAB' +si r +' . LBR' ) ;Label 1. Show; Label 2. Show;Af i sVi et i ; Af i sPunct aj ;Ti mer 1. I nt er val : =1000 di v car acat i t e

    end;

    Introducerea numrului labirintului se realizeaz prin apelulfunciei I nput Box, care deschide o fereastr de dialog ca cea demai jos. Citirea labirintului se realizeaz de proceduraCi t est eLabi r i nt , care a fost prezentatmai nainte.

    Deplasarea omuleului o face juctorul prin intermediulevenimentelor de tastatur ce au loc asupra lui For m1. n acest

    sens, se folosete evenimentul OnKeyDown, adic metodaFor mKeyDown, n care Key reprezint codul tastei apsate. Celepatru numere (40, 38, 37 i 39) corespund celor patru sensuri dedeplasare ale omuleului: jos, sus, stnga i respectiv dreapta.Observai cdacL[ Xom, Yom] are valoarea ' * ' , adicomuleul a

    ntlnit o ciupercu, atunci punctajul crete, ciupercua dispare (seterge de pe ecran, iar variabila ciuperci descrete).

    procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

    Shift: TShiftState);

    var aux: Char ;begi n

    case Key of40: i f L[ Xom+1, Yom] ' @' t hen { j os }

    begi naux: =L[ Xom, Yom] ; L[ Xom, Yom] : =' ' ;

    Ti par ( Xom, Yom) ;L[ Xom, Yom] : =aux; Ti par ( Xom, Yom) ;I nc( Xom) ; Omul et ( Xom, Yom) ;i f L[ Xom, Yom] =' *' t hen

    begi nL[ XOm, YOm] : =' ' ; Dec( ci uper ci ) ;Ti par ( Xom, Yom) ; Omul et ( Xom, Yom) ;Af i sPunct aj

  • 7/23/2019 20 Aplicatii Delphi Si VB

    25/212

    24

    endend;

    38: i f ( L[ Xom, Yom] =' #' ) and( L[ Xom- 1, Yom] i n [ ' #' , ' ' , ' * ' ] ) t hen {sus}begi n

    aux: =L[ Xom, Yom] ; L[ Xom, Yom] : =' ' ;Ti par ( Xom, Yom) ;L[ Xom, Yom] : =aux; Ti par ( Xom, Yom) ;

    Dec( Xom) ; Omul et ( Xom, Yom) ;i f L[ Xom, Yom] =' *' t hen

    begi nL[ XOm, YOm] : =' ' ; Dec( ci uper ci ) ;Ti par ( Xom, Yom) ; Omul et ( Xom, Yom) ;Af i sPunct aj

    endend;

    37: i f ( L[ Xom, Yom] i n [ ' #' , ' ' ] ) and( L[ Xom, Yom- 1] ' @' ) and( L[ Xom+1, Yom- 1] i n [ ' @' , ' #' ] ) t hen {st g}begi n

    aux: =L[ Xom, Yom] ; L[ Xom, Yom] : =' ' ;Ti par ( Xom, Yom) ;L[ Xom, Yom] : =aux; Ti par ( Xom, Yom) ;Dec( Yom) ; Omul et ( Xom, Yom) ;i f L[ Xom, Yom] =' *' t hen

    begi nL[ XOm, YOm] : =' ' ; Dec( ci uper ci ) ;Ti par ( Xom, Yom) ; Omul et ( Xom, Yom) ;Af i sPunct aj

    endend;

    39: i f ( L[ Xom, Yom] i n [ ' #' , ' ' ] ) and( L[ Xom, Yom+1] ' @' ) and

    ( L[ Xom+1, Yom+1] i n [ ' @' , ' #' ] ) t hen {dr }begi naux: =L[ Xom, Yom] ; L[ Xom, Yom] : =' ' ;Ti par ( Xom, Yom) ;L[ Xom, Yom] : =aux; Ti par ( Xom, Yom) ;I nc( Yom) ; Omul et ( Xom, Yom) ;i f L[ Xom, Yom] =' *' t hen

    begi nL[ XOm, YOm] : =' ' ; Dec( ci uper ci ) ;

    Ti par ( Xom, Yom) ; Omul et ( Xom, Yom) ;Af i sPunct aj

    endend

    endend;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    26/212

    25

    Pentru a nu avea probleme n cazul n care fereastraaplicaiei noastre este acoperit, din ntmplare sau intenionat, de oalt fereastr, vom scrie o procedur de redesenare a ntreguluilabirint dupcum urmeaz:

    procedure TForm1.FormPaint(Sender: TObject);

    var i , j : I nt eger ;

    begi nf or i : =1 t o 16 do

    f or j : =1 t o 22 doi f L[ i , j ] i n [ ' #' , ' $' , ' @' , ' *' , ' &' ] t hen

    Ti par ( i , j )end;

    end.

    n acest moment, codul sursal unit-ului ci uper ci l e1. pas din aplicaia noastrs-a terminat.

  • 7/23/2019 20 Aplicatii Delphi Si VB

    27/212

    26

    Aplicaia 2Harta - un program despre Romnia turistic

    2.1. Prezentare general

    Aplicaia pe care o concepem n continuare poate constituimodel pentru o serie ntreag de programe complexe, n care sedorete prezentarea unor informaii pe o temdat. Informaiile vor figrupate pe articole i vor fi att texte, ct i imagini, selectabile dintr-o list

    de imagini disponibile. Alegerea articolului se va face n mod

    interactiv, dupun model similar celui din aplicaia "Harta".

    n acest program avem dou forme. Forma For m1 (primaactivat) va aprea ca mai sus. Trecnd cu mouse-ul peste judeeledin harta administrativa rii, vom alege un anumit jude. Alegerea

    judeului se face n funcie de coordonatele curente ale cursorului demouse. Nu se respectexact forma frontierelor de jude, ci doar nite

  • 7/23/2019 20 Aplicatii Delphi Si VB

    28/212

    27

    zone dreptunghiulare, alese corespunztor acestor judee. n figurade mai sus este reprezentatzona dreptunghiulara judeului Alba,precum i poziia cursorului de mouse n cadrul acestei zone. Deremarcat c zonele dreptunghiulare ale judeelor nu vor figura pehart, n timpul programului, deci ele vor fi invizibile pentru utilizatorulaplicaiei noastre. Aceste dreptunghiuri sunt memorate ntr-un fiier

    text special, cu numele r omap. t xt , fiier cu urmtoarea structur:nume judex1 y1 x2 y2..................

    Deci, sunt scrise numele judeelor rii, apoi, pentru fiecarejuden parte coordonatele colului stnga sus i ale colului dreaptajos a zonei dreptunghiulare ce ncadreazo mare parte din jude.

    Concret, coninutul fiierului r omap. t xt folosit n aplicaianoastreste:Al ba179 165 222 217Ar ad41 157 131 200Ar ges268 240 308 339Bacau

    360 136 445 195Bi hor101 99 148 148Bi st r i t a- Nasaud235 77 288 107Bot osani365 0 437 66Br asov279 208 347 248Br ai l a440 240 487 305Buzau376 234 435 303Cal ar asi380 343 473 371Car as- Sever i n75 242 139 309Cl uj164 127 233 159

    Const ant a480 305 546 396Covasna324 187 385 229Dambovi t a307 272 340 321Dol j173 339 241 402Gal at i

  • 7/23/2019 20 Aplicatii Delphi Si VB

    29/212

    28

    441 182 496 242Gi ur gi u337 348 377 396Gor j161 267 220 328Har ghi t a298 105 348 183Hunedoara137 188 186 266I al omi t a381 302 490 344I asi388 65 481 127I l f ov348 310 382 352Mar amur es197 48 276 68Mehedi nt i

    119 303 182 365Mur es247 136 293 180Neamt334 94 430 143Ol t238 315 277 403Pr ahova335 248 387 307Sat u Mar e123 17 188 69Sal aj155 86 201 115Si bi u222 199 267 236Suceava291 21 375 92Tel eor man277 339 343 413

    Ti mi s6 200 115 241Tul cea487 237 592 309Vasl ui429 114 496 189Val cea219 246 262 326Vr ancea384 185 438 241Bucur est i348 310 382 352

    Numele judeului deasupra cruia se afl cursorul de mouseva fi afiat n antetul (proprietatea Capt i on) ferestrei For m1 (vezifigura de mai sus). Selectarea unui jude pentru a obine informaii

  • 7/23/2019 20 Aplicatii Delphi Si VB

    30/212

    29

    despre el se face prin acionarea butonului de mouse n interioruldreptunghiului corespunztor lui. Astfel, de pild, dac se alege

    judeul Alba, se va ncrca o nou form, For m2, adic va apreafereastra a doua de mai jos, prima fiind dezactivat pn la

    nchiderea celei de a doua.

    Aadar, For m2 va conine un control de tip TI mage (stngasus), unul de tipTLi st Box(dreapta sus) i o casetde tipTMemo,pentru afiarea coninutului unui fiier text, asociat judeului selectat.Firete, avnd 42 de judee, vom avea tot attea fiiere text, al crornume, aa cum se va vedea n textul programului, vor fi chiar numele

    judeelor Romniei, completate cu extensia '. t x t '.

    Lista din dreapta sus conine numele unor fiiere '. bmp',coninnd imagini din judeul ales. Aceste nume sunt, de fapt,precizate n cadrul fiierului text al judeului, n primele linii (dar pot fii n alte linii), i sunt precedate de simbolul '@'. Astfel, de pild,fiierul al ba. t xt va avea coninutul urmtor:

  • 7/23/2019 20 Aplicatii Delphi Si VB

    31/212

    30

    @poar t ai n. bmp@panor ab. bmp@or t od_ai . bmp

    J UDETUL ALBA# Dat e gener al e

    J udet i n par t ea cent r al - vest i ca a Romani ei , pe cur sul mi j l oci u alMur esul ui ; 6, 2 mi i kmp; Resedi nt a: Al ba- I ul i a.Or ase: Sebes, Ai ud, Cugi r , Bl aj , Ocna Mur es, Zl at na,Campeni si Abr ud.# Rel i ef ul si cl i ma

    Rel i ef acci dent at ; i n vest M- t i i Met al i f er i , Tr ascaul ui si Bi hor , cucat eva depr esi uni mont ane ( Zl at na, Abr ud, Campeni ) ; i n est Val eaMur esul ui si cul mi l e de vest al e Podi sul ui Tar navel or .

    Cl i ma t emper at - cont i nent al a, cu i er ni mai reci i n zona mont ana;pr eci pi t at i i l e var i aza t er i t or i al ( 600- 1100 mm/ an) .# Economi a

    Expl oat ar i : f or est i er e, de mi ner eur i aur oar gent i f er e ( Zl at na, Bai ade Ar i es, Al masu Mar e, Rosi a Mont ana) si cupr i f er e ( Buci um) ,mi ner eur i de ci nabr u ( I zvor u Ampoi ul ui ) , gaze nat ur al e ( Cet at ea deBal t a) , sar e ( Ocna Mur esul ui ) , r oci de const r uct i e et c.

    Cel e mai i mpor t ant e r amur i i ndust r i al e al e j udet ul ui sunt : ext r act i ami ner eur i l or nef er oase si met al ur gi a nef er oasa, expl oat ar ea sipr el ucr ar ea l emnul ui , const r uct i a de masi ni , chi mi ca ( soda cal ci nat asi caust i ca, ant i daunat or i ) , al i ment ar a, mat er i al e de const r uct i e.

    Supr af at a agr i col a a j udet ul ui est e de 352 mi i ha, di n car e 158 mi iha sunt t er enur i ar abi l e. Pe t er enur i l e ar abi l e al e j udet ul ui secul t i va cer eal e ( 102, 7 mi i ha) , f l oar ea- soar el ui , car t of i si sf ecl a dezahar ; vi t i cul t ur a ( podgor i i l e Al ba- I ul i a, Bl aj , Cr aci unel u de

    J os, J i dvei , Val ea Lunga, Ai ud) ; pomi cul t ura; l egumi cul t ura. Cr est er eaani mal el or ( bovi ne, por ci ne si ovi ne) ; avi cul t ur a.# Tur i sm

    Zona t ur i st i ca, cu numer oase l ocur i pi t or est i ( Pest er a Scar i soar asi Poj ar ul Pol i t ei ; Det unat el e) ; monument e i st or i ce si dear hi t ect ur a.

    Observai primele trei linii din acest fiier. Ele conin exactnumele acelor fiiere cu imagini, care sunt trecute n lista Li st Box1din dreapta sus a lui For m2 i sunt precedate de simbolul '@'.Urmeaz textul referitor la judeul Alba, care se regsete ncomponenta Memo1din cadrul lui For m2.

    n imaginea anterioar, s-a acionat pe al doilea item din listi s-a afiat imaginea panoramica municipiului Alba-Iulia, aflat nfiierul 'panor ab. bmp'. Atunci cnd vei realiza concret aplicaiadumneavoastr, va trebui s dispunei de mai multe fiiere cuimagini, pentru fiecare juden parte, precum i de cte un fiier text

    (l putei crea chiar dumneavoastr), pentru fiecare jude al rii. Latoate acestea se adaug imaginea cu harta administrativ aRomniei, pe care o putei scana chiar duppagina din carte, dacdispunei de un scanner, sau o putei lua de pe Internet, dacdispunei de o astfel de conexiune. Exist multe locaii web, undesunt date despre Romnia i de acolo ai putea chiar sluai nu doarharta Romniei, ci i alte informaii, chiar texte referitoare la judeele

  • 7/23/2019 20 Aplicatii Delphi Si VB

    32/212

    31

    rii sau imagini de pe ntregul cuprins al patriei. ncercai, de pild,adresele ht t p: / / www. r ot r avel . comi ht t p: / / www. i ci . r o.

    Dupnchiderea formei For m2, se revine la forma For m1, deunde se poate alege un alt jude, pentru a fi afiate datecorespunztoare lui.

    2.2. Textul explicat al programului

    Proiectul nostru, har t a. dpr , va conine referiri la cele douunit-uri folosite: har t a1. pasi har t a2. pas:

    pr ogr am har t a;

    usesFor ms,har t a1 i n ' har t a1. pas' {For m1},har t a2 i n ' har t a2. pas' {For m2};

    {$R *. RES}

    begi nAppl i cat i on. I ni t i al i ze;Appl i cat i on. Cr eat eFor m( TFor m1, For m1) ;Appl i cat i on. Cr eat eFor m( TFor m2, For m2) ;Appl i cat i on. Run;

    end.

    Primul unit corespunde unei forme For m1 foarte simple, ncare se gsete o component I mage1, care imediat dupcreareaformei se ncarc cu coninutul fiierului r omani a. bmp. Deasemenea, procedura TFor m1. For mCr eat e va conine iinstruciuni de adaptare a dimensiunilor formei For m1la dimensiunileimaginii cu harta Romniei. Atenie la declaraia uses har t a2dinporiunea i mpl ement at i ona unit-ului har t a1.

    unit harta1;

    interface

    usesWi ndows, Messages, SysUt i l s, Cl asses, Gr aphi cs,

  • 7/23/2019 20 Aplicatii Delphi Si VB

    33/212

    32

    Cont r ol s, For ms, Di al ogs, Ext Ct r l s;

    t ypeTFor m1 = cl ass( TFor m)

    I mage1: TI mage;pr ocedur e For mCr eat e( Sender : TObj ect ) ;pr ocedur e I mage1MouseMove( Sender : TObj ect ;

    Shi f t : TShi f t St at e;

    X, Y: I nt eger ) ;pr ocedur e I mage1Cl i ck( Sender : TObj ect ) ;

    pr i vat e{ Pr i vat e decl ar at i ons }

    publ i c{ Publ i c decl ar at i ons }

    end;

    varFor m1: TFor m1;numej udet : St r i ng;

    implementation

    uses harta2;

    {$R *. DFM}

    procedure TForm1.FormCreate(Sender: TObject);

    begi nForm1. Top: =100; Form1. Lef t : =100;I mage1. Lef t : =0; I mage1. Top: =0;I mage1. Pi ct ur e. LoadFromFi l e( ' r omani a. bmp' ) ;I mage1. Aut oSi ze: =Tr ue;For m1. Cl i ent Wi dt h: =I mage1. Wi dt h;

    For m1. Cl i ent Hei ght : =I mage1. Hei ghtend;

    Va trebui, n continuare, s scriem procedura asociatevenimentului de deplasare a cursorului de mouse peste imagineahrii:

    procedure TForm1.Image1MouseMove(Sender: TObject;

    Shift: TShiftState; X,Y: Integer);var f : Text Fi l e;

    x1, y1, x2, y2: I nt eger ;gasi t : Bool ean;

    begi nAssi gnFi l e( f , ' r omap. t xt ' ) ;Reset ( f ) ; gasi t : =Fal se;whi l e ( not gasi t ) and ( not eof ( f ) ) do

  • 7/23/2019 20 Aplicatii Delphi Si VB

    34/212

    33

    begi nReadLn( f , numej udet ) ;ReadLn( f , x1, y1, x2, y2) ;i f ( x1

  • 7/23/2019 20 Aplicatii Delphi Si VB

    35/212

    34

    Cont r ol s, For ms, Di al ogs, Ext Ct r l s, St dCt r l s;

    t ypeTFor m2 = cl ass( TFor m)

    I mage1: TI mage;Memo1: TMemo;Li st Box1: TLi st Box;pr ocedur e For mCl ose( Sender : TObj ect ;

    var Act i on: TCl oseAct i on) ;pr ocedur e For mShow( Sender : TObj ect ) ;pr ocedur e Li st Box1Cl i ck( Sender : TObj ect ) ;

    pr i vat e{ Pr i vat e decl ar at i ons }

    publ i c{ Publ i c decl ar at i ons }

    end;

    varFor m2: TFor m2;

    Seciunea de implementare conine o referire la unit-ul descrisanterior, apoi este prezentat procedura care rspundeevenimentului de nchidere a formei, prin care controlul execuieiprogramului se d formei For m1, activat prin instruciunea

    For m1. Enabl ed: =Tr ue.

    implementation

    uses harta1;

    {$R *. DFM}

    procedure TForm2.FormClose(Sender: TObject;

    var Action: TCloseAction);begi n

    For m1. Enabl ed: =Tr ueend;

    Cnd se afieaz For m2, conform apelului dinTFor m1. I mage1Cl i ck, se va apela, de fapt, procedura de mai jos,care rspune evenimentului n cauz:

    procedure TForm2.FormShow(Sender: TObject);

    var i , j : I nt eger ; s: St r i ng; f : Text Fi l e;begi n

    nr _i magi ne: =- 1;Li st Box1. Cl ear ; Memo1. Cl ear ;I mage1. Pi ct ur e. Gr aphi c: =ni l ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    36/212

    35

    Memo1. Scr ol l Bar s: =ssBot h;I mage1. St r et ch: =Tr ue;Assi gnFi l e( f , numej udet +' . t xt ' ) ;{$I - }Reset ( f ) ; {$I +}i f I OResul t =0 t hen

    begi nwhi l e not eof ( f ) do

    begi n

    ReadLn( f , s) ;i f s[ 1] =' @' t henLi st Box1. I t ems. Add( Copy( s, 2, Lengt h( s) - 1) )

    el seMemo1. Li nes. Add( s)

    end;Cl oseFi l e( f ) ;

    end

    el sebegi nI mage1. Pi ct ur e. Gr aphi c: =ni l ;Li st Box1. Cl ear ;Memo1. Cl ear ;Memo1. Li nes. Add( ' Nu det i nem i nf or mat i i ' ) ;Memo1. Li nes. Add( ' despr e acest j udet ! ' )

    endend;

    S analizm pe ndelete procedura de mai nainte. Mai ntiau loc unele iniializri importante referitoare la Memo1, Li st Box1iI mage1, apoi se adaug componentei Memo1 ambele bare dederulare, pentru a putea citi textul ce va aprea acolo n ntregime,chiar dacs-a putea ca sfie prea lat sau prea lung.

    Apoi se configureazproprietatea Stretcha imaginii I mage1laadev

    rat (Tr ue), pentru ca imaginea s

    nu dep

    easc

    marginile

    stabilite. Firete, acest lucru poate provoca neplceri prin deformareaimaginii din Image1, de aceea este bine sse opteze pentru o soluiemai buncum ar fi: redimensionarea tuturor imaginilor astfel nct s ncap n

    componenta I mage1, chiar dac I mage1. St r et ch ar rmneFal se;

    realizarea unei redimensionri a lui Image1, astfel nct sexisteproporii corespunztoare ntre grosimea i nlimea imaginii dinfiierul '. bmp' i proprietile Wi dt hi, respectiv, Hei ght ale luiI mage1.

    nr _i magi ne: =- 1;Li st Box1. Cl ear ; Memo1. Cl ear ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    37/212

    36

    I mage1. Pi ct ur e. Gr aphi c: =ni l ;Memo1. Scr ol l Bar s: =ssBot h;I mage1. St r et ch: =Tr ue;

    n continuare se deschide fiierul text i se citete coninutulsu linie cu linie. Liniile care ncep cu simbolul '@' sunt prelucrateseparat i se adaug n lista Li st Box1. Celelalte sunt adugate n

    componenta Memo1. Firete, un fiier text poate fi ncrcat ntr-ocomponent de tip TMemomult mai simplu, printr-un apel de genulMemo1. Li nes. LoadFr omFi l e( numej udet +' . t xt ' ) , dar acestprocedeu nu putea fi aplicat aici, din cauz c trebuia s se preiaseparat liniile ce ncepeau cu '@'. Oricum, procedeul trebuie reinutpentru utilizri ulterioare.

    Observai, de asemenea, apariia a dou opiuni speciale decompilare ce ncadreaz pe Reset ( f ) . Prima are rolul de adezactiva controlul operaiilor de intrare-ieire de ctre compilator, iarcea de al doua are rolul de a reface activarea. Dezactivarea prin{$I - } determin compilatorul Pascal s nu reacioneze n cazulunui eec al lui Reset ( f ) printr-un mesaj de eroare a unei operaiide intrare/ieire. Astfel, dac o problem oarecare apare, controlul

    este preluat de programul nostru, care testeaz variabila de sistempredefinit I OResul t . Cnd aceasta are valoarea 0, nseamn ctotul este n regul, iar cnd nu este 0, valoarea ei indic tipul deeroare detectat. Noi am folosit opiunea de compilare {$I - } itestarea valorii lui I OResul t pentru a verifica dac fiierul ceurmeaza fi deschis pentru a prelua informaii din el existsau nu

    Dac acest fiier nu exist, atunci Memo1 va fi ncrcat cu

    dou linii coninnd un text explicativ corespunztor. De asemenea,prin apelul I mage1. Pi ct ur e. Gr aphi c: =ni l realizm o golire aimaginii din I mage1. Putem scrie i I mage1. Pi ct ur e: =ni l pentrua realiza acelai lucru.

    De asemenea Li st Box1. Cl ear realizeaz golirea listei cear conine numele fiierelor cu imagini '. bmp'.

    Assi gnFi l e( f , numej udet +' . t xt ' ) ;{$I - }Reset ( f ) ; {$I +}i f I OResul t =0 t hen

    begi nwhi l e not eof ( f ) do

    begi nReadLn( f , s) ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    38/212

    37

    i f s[ 1] =' @' t henLi st Box1. I t ems. Add( Copy( s, 2, Lengt h( s) - 1) )

    el seMemo1. Li nes. Add( s)

    end;Cl oseFi l e( f ) ;

    endel se

    begi nI mage1. Pi ct ur e. Gr aphi c: =ni l ;Li st Box1. Cl ear ; Memo1. Cl ear ;Memo1. Li nes. Add( ' Nu det i nem i nf or mat i i ' ) ;Memo1. Li nes. Add( ' despr e acest j udet ! ' )

    endend;

    n sfrit, dacse acioneaz n cadrul listei, se caut itemulselectat i se ncarcimaginea corespunztoare n I mage1.

    procedure TForm2.ListBox1Click(Sender: TObject);

    var i : I nt eger ;begi n

    f or i : =0 t o Li st Box1. I t ems. Count - 1 doi f Li st Box1. Sel ect ed[ i ] t hen

    I mage1. Pi ct ur e. LoadFr omFi l e( Li st Box1. I t ems[ i ] )

    end;

    end.

    Observaie. Funcia urmtoare se bazeaz pe explicaiile anterior

    prezentate, referitoare la opiunea de compilare {$I - }i la variabilade sistem I OResul t i testeazexistena unui fiier oarecare.

    f unct i on Fi l eExi st ( nf : St r i ng) : Bool ean;var F: Fi l e;begi n

    Assi gn( F, nf ) ; {$I - }Reset ( F) ; {$I +}i f I OResul t =0 t hen

    begi n Cl ose( F) ; Fi l eExi st : =Tr ue endel se Fi l eExi st : =Fal seend;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    39/212

    38

    Aplicaia 3

    Mrfuri - un joc de logic

    3.1. Prezentare general

    Jocul este o variant n Delphi a binecunoscutului Sokoban.Un omulese afl ntr-un depozit i trebuie sdeplaseze la n nitelocuri dinainte stabilite nite pachete cu marf.

    Este un alt joc cu un labirint, ca i Ciupercile. De aceastdatdispunem de un omule (aici reprezentat printr-un cerculealb ntr-unptrat rou (linia 4, coloana 2 n figur).

    El se plimbntr-un labirint cu 10 linii i 20 coloane, bordat cuziduri i avnd ziduri i n interior (vezi de pild csuele de pemargine, care vor fi desenate cu verde). Omuleul nostru tie doar sse deplaseze ortogonal prin spaiile dintre ziduri (alb-galbene saucele marcate cu cerculee).

    El are la dispoziie un numr de pachete cu marf(ptrelelecu marginea evideniat, ca cel din poziia 3, 3), pe care trebuie sleduc n locurile marcate cu cerculee (ca cele patru din linia 2 desus). Deplasarea mrfurilor se face doar prin mpingere i, pentru ca

  • 7/23/2019 20 Aplicatii Delphi Si VB

    40/212

    39

    problema s devin i mai dificil, nu se pot mpinge mai multepachete de marfmpreun!

    Aadar, de pild, n cazul din figura anterioar, omuleulnostru nu poate dect fie scoboare un rnd, fie sse deplaseze ndreapta cu o coloan, ceea ce duce i la mutarea cu o poziie ndreapta a pachetului alturat, care din poziia cu linia=4 i coloana=3

    se va duce n poziia cu aceeai linie dar coloana=4. Apoi, printr-omicare n sus, omuleul va poziiona corect marfa din celula decoordonate 3, 3 care va ajunge peste cerculeul din csua de pelinia sau rndul 2 i de pe coloana 3. Firete, va rmne cerculeulde coordonate 2, 2 neacoperit, ceea ce nu este bine, de aceea vatrebui ca pachetul de marfdespre care tocmai vorbea sajungncerculeul din celula 2, 2.

    Jocul se bazeaz, aadar, pe nite labirinturi bine elaborate,n sensul cele respectanumite condiii:

    un labirint are 10 rnduri (linii) i 20 coloane; fiecare labirint este bordat de ziduri; numrul de poziii destinaie (marcate cu cerculee) este identic

    cu numrul de pachete de marf; existcel puin nu pachet de marf; existexact un omule; problema are soluie (adic toate mrfurile pot fi deplasate pn

    la cerculeele destinaie).

    Firete, este de dorit ca problema s fie dificil, soluia s fie

    greu de gsit, eventual scuprindelemente de unicitate.Ca i n jocul Ciupercile, i aici labirintul va fi preluat dintr-un

    fiier text, n care sunt folosite diferite caractere pentru a codificaelementele componente ale labirintului.

    Astfel, simbolul '#' marcheaz zidurile, omuleul este '$',pachetele cu marfsunt simbolizate prin '* ', iar locurile de depozitare

    a mrfurilor sunt marcate cu '%'.

    Iat6 modele de labirinturi, toate solvabile, dar avnd gradediferite de dificultate:

  • 7/23/2019 20 Aplicatii Delphi Si VB

    41/212

    40

    1.LAB

    #####################%%%# # # ### # ### ## # # ## # ##* # # ## ## ## # # ## #*### ## ## ## $ ##### ##

    # ### * # # ## # # # #####################

    2.LAB##################### $ # ### # ### ### * # * # ## # # # ## ## # # ## #### ## ## ## ## # ##

    # ####### #* # %## # %%#####################

    3.LAB#####################%%%% # ### ###*## * * ##$* # #### ## #* #### #%## ## # ##### %## * ## * # # ## #

    ### # * ####### ##%% ## #####################

    4.LAB###################### ## % %##### # # # #### ## # ## # ## **# #** ## ##

    ## *$## # ## ## ### #### # ## ###%% * ## # ###% ## ##% ######################

    5.LAB###################### ##% %%######% ## # # ### # ## # ## **# #* * ## ##

    ## *$## # ## ## ### #### # ## ###%% * ## # ## # # # #### #####################

    6.LAB###################### %# %#### ## * # ### *$## # ## ## ## #### # ## * * #

    # * %### # ## ## # ## * # #* * %# ###% # # #% ####% %#####################

    3.2. Textul explicat al programului

    Pentru a nelege textul unit-ului mar f 1. pasva trebui, pentrunceput, sproiectm interfaa din forma aplicaiei. Form1 va conineun meniu principal Mai nMenu1(de tipTMai nMenu), cu trei comenzi,dupcum se vede n figur:

  • 7/23/2019 20 Aplicatii Delphi Si VB

    42/212

    41

    Aadar, vom avea interfaa lui mar f 1. pas:

    unit marf1;

    interface

    uses

    Wi ndows, Messages, SysUt i l s, Cl asses, Gr aphi cs,Cont r ol s, For ms, Di al ogs, St dCt r l s, Menus;

    t ypeTFor m1 = cl ass( TFor m)

    Mai nMenu1: TMai nMenu;Al egel abi r i nt 1: TMenuI t em;J oaca1: TMenuI t em;Ter mi nar e1: TMenuI t em;

    pr ocedur e J oaca1Cl i ck( Sender : TObj ect ) ;pr ocedur e For mCr eat e( Sender : TObj ect ) ;pr ocedur e Ter mi nar e1Cl i ck( Sender : TObj ect ) ;pr ocedur e Al egel abi r i nt 1Cl i ck( Sender : TObj ect ) ;pr ocedur e For mKeyDown( Sender : TObj ect ;

    var Key: Wor d; Shi f t : TShi f t St at e) ;pr ocedur e For mPai nt ( Sender : TObj ect ) ;

    pr i vat e

    { Pr i vat e decl ar at i ons }publ i c{ Publ i c decl ar at i ons }

    end;

    varFor m1: TFor m1;

    nainte de a trece la explicarea elementelor ce apar nseciunea de implementare a unit-ului, vom expune ideea derealizare a programului.

    Mai nti, comanda 'Joac' din meniu nu va fi disponibil, aacutilizatorul va fi nevoit saleagun labirint, care va fi citit dintr-unfiier cu extensia '. LAB' n memorie, ntr-o matrice de caractere, pecare am notat-o cu L. Dupalegerea labirintului, comanda de pornire

    a jocului devine activ. Acionarea ei determin afiarea labirintuluidirect n proprietatea Canvasdin For m1. Ca i la jocul Ciupercile, seva decodifica labirintul pe baza simbolurilor folosite ('#', '* ' etc., cumeniunea c i aici spaiul reprezint lipsa oricrui element dinlabirint, adiclocurile pe unde se poate deplasa omuleul).

    O funcie boolean, apelatde fiecare datdupo mutare aomuleului, va testa dacnu cumva toate mrfurile au fost aezate la

  • 7/23/2019 20 Aplicatii Delphi Si VB

    43/212

    42

    locurile lor, caz n care jocul s-a terminat. Nu exist o restricie detimp la acest joc (propunem cititorului so realizeze), dar e clar cexistsituaii cnd o mutare greitpoate duce la o situaie imposibilde rezolvat. Un exemplu ar fi cnd un pachet de marfajunge ntr-uncolformat de douziduri diagonal opuse.

    Deplasarea omului se va face pe baza comenzilor primite de

    la tastatur, folosind evenimentul OnKeyDown. O procedurspecialva realiza deplasarea omuleului, care ar putea fi nsoit i dedeplasarea n acelai sens a unui pachet de marf.

    i acum iatseciunea i mpl ement at i ona unit-ului:

    implementation

    {$R *. DFM}

    var l at : I nt eger ; si r : St r i ng;var L: ar r ay[ 1. . 20, 1. . 10] of Char ;

    Xom, Yom: I nt eger ;Loc: ar r ay[ 1. . 20] of r ecor d x, y: I nt eger end;Nr Loc: I nt eger ;

    Labirintul este dat de matricea L. Variabila l at coninemrimea laturii fiecrui ptrat din labirint, adic a fiecrei celule(csue). Xom,Yomsunt coordonatele omuleului n cadrul labirintului,iar vectorul Loc(cu Nr Loccomponente utilizate efectiv) reprezintomodalitate de memorare a locurilor destinaie pentru mrfuri.

    Procedura urmtoare deseneaz un dreptunghi colorat n

    culoarea c, avnd colurile stnga sus ( x1, y1) i dreapta jos( x2, y2) . Desenarea se face direct n For m1. Canvas.

    procedure Bar(x1,y1,x2,y2,c: Integer);

    var k: I nt eger ;begi n

    wi t h For m1. Canvas dobegi n

    Pen. Wi dt h: =1;Pen. Col or : =c;f or k: =0 t o ( x2- x1) di v 2 do

    Rect angl e( x1+k, y1+k, x2- k, y2- k)end

    end;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    44/212

    43

    Procedura Ti par ( i , j ) realizeaz afiarea coninutuluicelulei de pr rndulj i coloana i din labirint.

    procedure Tipar(i,j: Integer);

    begi ncase L[ i , j ] of

    ' #' : begi n {zi d}

    Bar ( l at * i +1, l at * j +1,l at *( i +1) - 1, l at *( j +1) - 1, cl Gr een)end;

    ' *' : begi n {mar f a}Bar ( l at * i +1, l at * j +1, l at *( i +1) - 1,

    l at * ( j +1) - 1, cl Bl ue) ;Bar ( l at * i +3, l at * j +3, l at *( i +1) - 3,

    l at *( j +1) - 3, cl Aqua)end;

    ' $' : begi n {omul et ul gest i onar }Bar ( l at * i +1, l at * j +1, l at *( i +1) - 1,

    l at *( j +1) - 1, cl Red) ;For m1. Canvas. Pen. Col or : =cl Whi t e;For m1. Canvas. El l i pse( l at *i +3, l at *j +3,

    l at * ( i +1) - 3, l at * ( j +1) - 3)end;

    ' ' : begi n {spat i u}

    For m1. Canvas. Pen. Wi dt h: =1;For m1. Canvas. Pen. Col or : =cl Yel l ow;For m1. Canvas. Rect angl e( l at *i +1, l at *j +1,

    l at * ( i +1) - 1, l at * ( j +1) - 1)end

    endend;

    Procedura Di spl ayLoc este responsabil de afiarealocurilor de destinaie a mrfurilor, de care procedura Ti par nu seocup. Aceasta deoarece, n urma poziionrii unui pachet de marf

    ntr-o celul destinaie sau a trecerii omuleului pe acolo, nu maitrebuie afiat cerculeul. ProceduraTi par nu ar proceda corect.

    Existdouvariante de afiare, date de parametrul p: Byt e.Prima (cu p=1) se folosete cnd se deplaseazomuleul i ine cont

    de observaia fcutde noi referitoare la omuleul care ar ajunge prinzonele marcate ca destinaii. A doua variant (cu p=0) este folositatunci cnd au loc desenri sau redesenri ale labirintului.

    procedure DisplayLoc(p: Byte);

    var i : I nt eger ;begi n

  • 7/23/2019 20 Aplicatii Delphi Si VB

    45/212

    44

    case p of1: f or i : =1 t o Nr Loc do

    i f ( Abs( Loc[ i ] . x- Xom)

  • 7/23/2019 20 Aplicatii Delphi Si VB

    46/212

    45

    Dacnu existun asemenea fiier (lucru testat de IOResult,ca i n aplicaia Harta), atunci jocul se oprete). Dacnsel exist,prin doucicluri f or se citete informaia depozitatn el referitoarela labirint. Dacse ntlnete simbolul '$', atunci se memoreazXom

    i Yom. Dac se ntlnete simbolul '%', atunci se memoreaz nvectorul Loc coordonatele acestui loc destinaie. La sfrit, seapeleazDi spl ayLocpentru a afia i aceste locuri.

    procedure CitesteLabirint(nume_fis: String);

    var F: Text Fi l e; i , j : I nt eger ;begi n

    Nr Loc: =0;

    Assi gnFi l e( F, nume_f i s) ; {$I - }Reset ( F) ; {$I +}i f I OResul t 0 t hen

    begi nShowMessage( ' Labi r i nt i nexi st ent ! ' ) ;Appl i cat i on. Ter mi nat e

    endel se

    begi n

    f or j : =1 t o 10 dobegi nf or i : =1 t o 20 do

    begi nRead( F, L[ i , j ] ) ;i f L[ i , j ] =' $' t hen

    begi n Xom: =i ; Yom: =j end;i f L[ i , j ] =' %' t hen

    begi n

    I nc( Nr Loc) ;Loc[ Nr Loc] . x: =i ;Loc[ Nr Loc] . y: =j ;L[ i , j ] : =' '

    end;Ti par ( i , j )

    end;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    47/212

    46

    ReadLn( F)end;

    Cl oseFi l e( F) ;Di spl ayLoc( 0)

    endend;

    Procedura Sch interschimbvalorile a doucsue din labirint.procedure Sch(x1,y1,x2,y2: Integer);

    var aux: Char ;begi n

    aux: =L[ x1, y1] ;L[ x1, y1] : =L[ x2, y2] ;L[ x2, y2] : =aux;Ti par ( x1, y1) ;Ti par ( x2, y2)

    end;

    Procedura urmtoare realizeaz efectiv desenrile necesare,precum i actualizrile asupra coninutului labirintului (matricea L), ncazul n care se execut o mutare a omuleului din poziia curentXom,Yom, n noua poziie. Deplasarea omuleului se face pe axa OXcu dx, iar pe axa OYcu dy. Aadar, noile coordonate ale omuleului

    vor fi Xom+dx,Yom+dy. Vom vedea cvalorile lui dx i dy pot fi -1, 0sau 1.

    procedure DoMove(dx,dy: Integer);

    begi ni f L[ XOm+dx, YOm+dy] =' ' t hen

    begi nSch( Xom, Yom, XOm+dx, YOm+dy) ;

    I nc( Xom, dx) ; I nc( Yom, dy)end

    el sei f ( L[ Xom+dx, Yom+dy] =' *' ) and

    ( L[ Xom+dx+dx, Yom+dy+dy] =' ' ) t henbegi n

    Sch( Xom+dx+dx, Yom+dy+dy, Xom+dx, Yom+dy) ;Sch( Xom+dx, Yom+dy, Xom, Yom) ;I nc( Xom, dx) ; I nc( Yom, dy)

    endend;

    Procedurile urmtoare se explicsingure:

    procedure IncarcaSiDeseneazaTabla;

    var dx, dy: I nt eger ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    48/212

    47

    begi ndx: =For m1. Cl i ent Wi dt h di v 22;dy: =For m1. Cl i ent Hei ght di v 12;i f dx

  • 7/23/2019 20 Aplicatii Delphi Si VB

    49/212

    48

    38: DoMove( 0, - 1) ;40: DoMove( 0, +1) ;37: DoMove( - 1, 0) ;39: DoMove( +1, 0)

    end;Di spl ayLoc( 1) ;i f ( Locur i Ocupat e) and ( si r ' 0' ) t hen

    ShowMessage( ' J oc t er mi nat cu succes! ' )

    endend;

    n fine, pentru a evita problemele de acoperire a ferestrei aplicaieinoastre de alte ferestre, este bine srealizm procedura FormPaintcare restaureaz coninutul labirintului prin reafiarea acestuia i alocaiilor destinaie.

    procedure TForm1.FormPaint(Sender: TObject);

    var i , j : I nt eger ;begi n

    f or i : =1 t o 20 dof or j : =1 t o 10 do

    Ti par ( i , j ) ;Di spl ayLoc( 0)

    end;

    end.

    Dac ai reuit s elaborai aceast aplicaie, atunci vpropunem screai cu Notepadcele ase fiiere reprezentnd aselabirinturi de diferite nivele de dificultate i, dac inventaidumneavoastr labirinturi mai dificile, ateptm propunerile

    dumneavoastrprin e-mail.

  • 7/23/2019 20 Aplicatii Delphi Si VB

    50/212

    49

    Aplicaia 4

    Puzzle - un joc de perspicacitate

    4.1. Prezentare general

    Dorim srealizm un joc de puzzle, n care dispunem de n2-1piese numerotate cu 1, 2, 3, ... n2-1, dispuse sub forma unei matriceptratice pe o tabl cu n rnduri i n coloane. Rmne un spaiuliber, n care poate fi deplasatoricare piesdin cele adiacente lui(din stnga, din dreapta, de sus sau de jos).

    La nceputul programului, se introduce ntr-o caset Edit1

    numrul n de piese, apoi piesele se amestec(prin mutri legale).Scopul jocului este ca, prin mutri kegake s se aranjezepiesele n matrice, n ordinea 1, 2, ..., n(pe primul rnd), n+1, n+2, ...pe al doilea rnd .a.m.d.. Colul din dreapta jos va rmne liber.

  • 7/23/2019 20 Aplicatii Delphi Si VB

    51/212

    50

    Mutrile legale n cazul de mai sus sunt: piesa 11 jos, piesa18 sus, piesa 8 la dreapta, piesa 23 la stnga. Cnd se muto piesadiacentspaiului liber, practic se realizeazo interschimbare ntrecele douptrele.

    4.2. Textul explicat al programuluiForma aplicaiei noastre aratastfel:

    n continuare s trecem la scrierea codului asociat acesteiforme. Interfaa unit-ului puzzl e1. pas aratclasic astfel:

    unit puzzle1;

    interface

    usesWi ndows, Messages, SysUt i l s, Cl asses, Gr aphi cs,Cont r ol s, For ms, Di al ogs,St dCt r l s ;

    t ypeTFor m1 = cl ass( TFor m)

    Edi t 1: TEdi t ;But t on1: TBut t on;pr ocedur e But t on1Cl i ck( Sender : TObj ect ) ;pr ocedur e For mCr eat e( Sender : TObj ect ) ;

    pr i vat epr ocedur e Cl i ckBut on( Sender : TObj ect ) ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    52/212

    51

    { Pr i vat e decl ar at i ons }publ i c

    { Publ i c decl ar at i ons }end;

    varFor m1: TFor m1;

    Ct privete implementarea unit-ului, aici vom declara unvector de butoane, adic variabila But on de tip array, cucomponente de tip TBut t on. Elementele acestui vector vor figenerate i iniializate n mod dinamic, imediat dup acionareabutonului But t on1.

    n continuare, variabilele i i ij j sunt linia i coloana csuei

    libere, x este chiar indicele csuei libere. De asemenea n estenumrul de linii i coloane, adic sunt n2 csue cu butoane.Numerotarea csuelor se face de la 0 la n2-1.

    implementation

    {$R *. DFM}

    const MaxBut oane = 121;

    var But on: ar r ay[ 0. . MaxBut oane- 1] of TBut t on;i i , j j , n, x: I nt eger ;

    Cnd se acioneaz butonul But on1, dac el este buton deoprire (Capt i on='Stop'), atunci se oprete aplicaia. DacnsavemCapt i on='Start', atunci nseamn c jocul pornete: se creeaz i

    iniializeazcsuele matricei (adicelementele din vectorul But on).n principal, trebuie reinute urmtoarele linii de program:

    But on[ k] : =TBut t on. Cr eat e( For m1) ;But on[ k] . Par ent : =For m1;Pentru a determina indicele csuei de pe linia i i coloanaj ,

    vom folosi formula: k: =n*i +j ; .OnCl i ckdetermince se ntmplcnd se va apsa pe un

    buton din tablou. De aceea, va trebui sscriem ceva de genulBut on[ k] . OnCl i ck: =Cl i ckBut on

    urmnd ca mai trziu sdescriem procedura Cl i ckBut on.

    procedure TForm1.Button1Click(Sender: TObject);

    var i , j , k, c, l at : I nt eger ; s: St r i ng;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    53/212

    52

    begi ni f But t on1. Capt i on=' St op' t hen

    Appl i cat i on. Ter mi nat eel se

    begi nVal ( Edi t 1. Text , n, c) ;But t on1. Capt i on: =' St op' ;l at : =Wi dt h di v ( n+2) ;

    f or i : =0 t o n- 1 dof or j : =0 t o n- 1 do

    begi nk: =n*i +j ;But on[ k] : =TBut t on. Cr eat e( For m1) ;But on[ k] . Par ent : =For m1;St r ( k+1, s) ;But on[ k] . Lef t : =l at +l at * j ;

    But on[ k] . Top: =100+l at *i ;But on[ k] . Wi dt h: =l at ;But on[ k] . Hei ght : =l at ;But on[ k] . Capt i on: =s;But on[ k] . Show;But on[ k] . OnCl i ck: =Cl i ckBut on

    end;x: =n*n- 1; {casut a l i ber a}But on[ x] . Capt i on: =' ' ; {ar e Capt i on vi d}

    i i : =n; j j : =n; {i ndi cel e casut ei l i ber e}{ Amest ecar e i magi ni }But on[ n*n- 2] . Cl i ck;But on[ n*n- 3] . Cl i ck;Randomi ze;f or i : =1 t o 2000*n do

    begi nk: =Random( n*n) ;

    But on[ k] . Cl i ckendend

    end;

    Procedura urmtoare conine anumite iniializri ale formei.

    procedure TForm1.FormCreate(Sender: TObject);

    begi nCapt i on: =' Puzzl e cu i magi ni ' ;Hei ght : =400; Wi dt h: =300;But t on1. Capt i on: =' St ar t '

    end;

    Aadar, s descriem procedura Cl i ckBut on, care verificmai nti cine este emitorul, adic ce valoare are argumentul

  • 7/23/2019 20 Aplicatii Delphi Si VB

    54/212

    53

    Sender , ceea ce nseamn c se determin indicele butonuluiacionat.

    Apoi se determin linia i coloana butonului pe care s-aapsat cu mouse-ul, memorate n i 1ij 1. Dacacest buton estevecin cu butonul corespunztor csuei libere (dat de i i i j j ),atunci se interschimbproprietile Capt i onale celor doubutoane

    ntre ele. De asemenea, se actualizeazvalorile lui x, i i ij j . Apoi,folosind variabila boolean ok, se testeaz dac toate butoanelesunt la locul lor, iar dacda, okia valoareTr uei jocul se oprete.

    procedure TForm1.ClickButon(Sender: TObject);

    var k, i , i 1, j 1: I nt eger ; ok: Bool ean; s : St r i ng;begi n

    f or i : =0 t o n*n- 1 doi f But on[ i ] =Sender t hen

    k: =i ;i 1: =k di v n + 1; j 1: =k mod n + 1;i f ( ( i i =i 1) and ( abs( j j - j 1) =1) ) or

    ( ( j j =j 1) and ( abs( i i - i 1) =1) ) t henbegi n

    But on[ x] . Capt i on: =But on[ k] . Capt i on;

    But on[ k] . Capt i on: =' ' ;x: =k;i i : =i 1; j j : =j 1;ok: =Tr ue;f or i : =0 t o n*n- 1 do

    begi nSt r ( i +1, s) ;i f ( But on[ i ] . Capt i on' ' ) and

    ( But on[ i ] . Capt i ons) t hen ok: =Fal seend;

    i f ok t henbegi n

    ShowMessage( ' Br avo! Ai r ezol vat puzzl e- ul ! ' ) ;Appl i cat i on. Ter mi nat e

    endend

    end;

    end.

    n lucrareaAplicaii n Visual Basicam prezentat i o varianta acestui program care folosete imagini ce trebuie refcute.

  • 7/23/2019 20 Aplicatii Delphi Si VB

    55/212

    54

    Aplicaia 5

    Supraf - reprezentarea grafica suprafeelor

    5.1. Prezentare general

    Urmtoarea aplicaie Delphi va reprezenta grafic o suprafa,ntr-o proiecie bidimensional a spaiului tridimensional. Suprafaava fi datprintr-o ecuaie, n care cota este o funcie de abscisiordonat: z=f ( x, y) .

    Expresia funciei ce va fi reprezentat este scris n textulprogramului, iar n cazul figurii anterioare ea este:

    f unct i on f ( x, y: r eal ) : r eal ;begi n

    f : =si n( sqr t ( abs( x*x- y*y) ) )end;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    56/212

    55

    Reprezentarea grafica acestei funcii va fi o suprafacarepoate fi privitdintr-un punct de observare care depinde de cele treiunghiuri (al f a, bet a, gama) corespunztoare celor trei axe decoordonate. Cele ase butoane care pot fi vzute n figura anterioarvor fi folosite pentru modificarea prin scdere sau adunare a acestortrei unghiuri.

    Dupcum se poate observa i n figur, reprezentarea graficva fi fcutprintr-o reea discretde curbe care se intersecteaz nanumite puncte.

    Pentru ca s fie reprezentat alt funcie, ar trebui ca textulsursal programului sfie rescris, adicsse rescrie funcia f, carea fost prezentat anterior. Aceasta nseamn c aplicaia nu poatefunciona ca fiier executabil, fiind dependentatt de textul sursal

    programului, ct i de mediul Delphi.Ideal ar fi ca sadugm programului un evaluator de expresiicu douvariabile, care, n plus, sverifice i corectitudinea sintactica unei expresii algebrice. O variant de evaluator matematic ianalizor sintactic pentru o expresie algebriccu o singurvariantafost prezentatn lucrarea mea "nvai limbajul Pascal n 12 lecii".Propunem cititorului ca, plecnd de la acele proceduri, valabile

    pentru curbe, srealizeze proceduri similare pentru suprafee, astfelnct aplicaia Suprafs fie ct mai utili independentde mediulDelphi, dupcompilarea i creare fiierului executabil.

    5.2. Textul explicat al programului

    Unitul de bazal acestui program are urmtoarea seciune deinterfa:

    unit supraf1;

    interface

    uses

    Wi ndows, Messages, SysUt i l s, Cl asses, Gr aphi cs,Cont r ol s, For ms, Di al ogs, Ext Ct r l s, Menus, St dCt r l s;

    t ypeTFor m1 = cl ass( TFor m)

    I mage1: TI mage;But t on1: TBut t on;But t on2: TBut t on;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    57/212

    56

    But t on3: TBut t on;But t on4: TBut t on;But t on5: TBut t on;But t on6: TBut t on;pr ocedur e But t on1Cl i ck( Sender : TObj ect ) ;pr ocedur e But t on2Cl i ck( Sender : TObj ect ) ;pr ocedur e But t on3Cl i ck( Sender : TObj ect ) ;pr ocedur e But t on4Cl i ck( Sender : TObj ect ) ;

    pr ocedur e But t on5Cl i ck( Sender : TObj ect ) ;pr ocedur e But t on6Cl i ck( Sender : TObj ect ) ;pr ocedur e For mCr eat e( Sender : TObj ect ) ;

    pr i vat e{ Pr i vat e decl ar at i ons }

    publ i c{ Publ i c decl ar at i ons }

    end;

    varFor m1: TFor m1;

    Aadar, forma aplicaiei are o imagine I mage1 i asebutoane n partea de sus, cu proprietile Capt i ondupcum se vd

    n figura urmtoare:

  • 7/23/2019 20 Aplicatii Delphi Si VB

    58/212

    57

    Urmeaz descrierea procedurilor care acioneaz asupraacestei forme, n cadrul seciunii de implementare a unit-ului.Procedura de baz ReprezentareSuprafata se bazeaz pe unrezultat teoretic i un program prezentate n lucrarea Limbajul TurboPascal(vezi bibliografia).

    Constantele i variabile folosite n program sunt urmtoarele:

    implementation

    {$R *. DFM}

    const nx=40; ny=40; pas=5;a=- 6; b=6; c=- 6; d=6;

    var dy: I nt eger ;x, y, z, ux, uy: Real ;

    xmi n, xmax, ymi n, ymax: Real ;xx, yy: ar r ay[ 1. . nx, 1. . ny] of Real ; {r et eaua}al f a, bet a, gama: I nt eger ; {unghi ur i l e expr i mat e i n gr ade}al , be, ga: Real ; {unghi ur i l e expr i mat e i n r adi ani }c1, c2, c3, s1, s2, s3: Real ;

    {cosi nusur i l e si si nusur i l e unghi ur i l or }

    Astfel, nxeste numrul de puncte din reeaua de reprezentare

    folosite pe axa OX, ny este numrul de puncte din aceeai reea,folosite pentru axa Oy, iar pas este pasul cu care se modificfiecaredin cele trei unghiuri folosite n reprezentarea suprafeei.

    Variabilele x, y, zsunt coordonatele curente ale unui punct depe suprafa, iar ux i uy sunt unitile de reprezentare pe cele douaxe Ox i Oy. Funcia va fi reprezentat pentru x lund valori nintervalul [ a, b] , iar y lund valori n intervalul [ c, d] . Reeauapunctelor de reprezentare este memoratprin vectorii xxi yy.

    Expresia suprafeei este scrisn funcia urmtoare:

    function f(x,y: real): real;

    begi nf : =si n( sqr t ( abs( x*x- y*y) ) )

    end;

    O funcie special permite folosirea unghiurilor exprimate nradiani (aa cum este nevoie n funciile trigonometrice).

    function radiani(u: integer): real;

    begi nr adi ani : =u/ 180*pi

  • 7/23/2019 20 Aplicatii Delphi Si VB

    59/212

    58

    end;

    Urmeazprocedura de reprezentare a suprafeei:

    procedure ReprezentareSuprafata;

    var i , j : Byt e;begi n

    {se t r ansf or ma unghi ur i l e di n gr ade i n r adi anisi se cal cul eaza cosi nusur i l e si si nusur i l e l or }al : =r adi ani ( al f a) ; c1: =cos( al ) ; s1: =si n( al ) ;be: =r adi ani ( bet a) ; c2: =cos( be) ; s2: =si n( be) ;ga: =r adi ani ( gama) ; c3: =cos( ga) ; s3: =si n( ga) ;{se det ermi na uni t at ea de masur a pe Ox si pe Oy}ux: =abs( b- a) / ( nx- 1) ; uy: =abs( d- c) / ( ny- 1) ;{se det er mi na val or i l e mi ni me si maxi me pent r u xx si yy}x: =a; y: =c; z: =f ( x, y) ;

    xx[ 1, 1] : =x*c1+y*c2+z*c3;yy[ 1, 1] : =x*s1+y*s2+z*s3;

    xmi n: =xx[ 1, 1] ; xmax: =xmi n;ymi n: =yy[ 1, 1] ; ymax: =ymi n;f or i : =1 t o nx do

    begi ny: =c;f or j : =1 t o ny do

    begi n{cot a est e f unct i e decel el al t e doua coor donat e}

    z: =f ( x, y) ;{se det er mi na cel e doua punct e al e pr oi ect i ei }xx[ i , j ] : =x*c1+y*c2+z*c3;yy[ i , j ] : =x*s1+y*s2+z*s3;i f xmi n>xx[ i , j ] t hen

    xmi n: =xx[ i , j ]

    el sei f xmaxyy[ i , j ] t hen

    ymi n: =yy[ i , j ]el se

    i f ymax

  • 7/23/2019 20 Aplicatii Delphi Si VB

    60/212

    59

    For m1. I mage1. Pi ct ur e: =ni l ;{se deseneaza cur bel e pe axa Ox}f or i : =1 t o nx dobegi nFor m1. I mage1. Canvas. MoveTo( Round( ( xx[ i , 1] - xmi n) / ux) ,

    dy- Round( ( yy[ i , 1] - ymi n) / uy) ) ;f or j : =2 t o ny doFor m1. I mage1. Canvas. Li neTo( Round( ( xx[ i , j ] - xmi n) / ux) ,

    dy- Round( ( yy[ i , j ] - ymi n) / ( uy) ) )end;

    {se deseneaza cur bel e pe axa Oy}f or j : =1 t o ny dobegi nFor m1. I mage1. Canvas. MoveTo( Round( ( xx[ 1, j ] - xmi n) / ux) ,

    dy- Round( ( yy[ 1, j ] - ymi n) / uy) ) ;f or i : =1 t o nx do

    For m1. I mage1. Canvas. Li neTo( Round( ( xx[ i , j ] - xmi n) / ux) ,dy- Round( ( yy[ i , j ] - ymi n) / uy) )end;

    end;

    n cadrul procedurii anterioare, am pus n chenar formulelecare stau la baza reprezentrii proieciei punctului P( x, y, z) dinspaiul tridimensional n planul ecranului, n punctulQ( xx[ i ] , yy[ i ] ) .

    Urmtoarele ase proceduri corespund celor ase butoane iconstau n modificarea cu valoarea pas a valorilor unghiurilor al f a,bet ai gamai reprezentarea din nou a suprafeei.

    procedure TForm1.Button1Click(Sender: TObject);

    begi n

    al f a: =al f a- pas;Repr ezent ar eSupr af at aend;

    procedure TForm1.Button2Click(Sender: TObject);

    begi nal f a: =al f a+pas;Repr ezent ar eSupr af at a

    end;

    procedure TForm1.Button3Click(Sender: TObject);

    begi nbet a: =bet a- pas;Repr ezent ar eSupr af at a

    end;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    61/212

    60

    procedure TForm1.Button4Click(Sender: TObject);

    begi nbet a: =bet a+pas;Repr ezent ar eSupr af at a

    end;

    procedure TForm1.Button5Click(Sender: TObject);

    begi ngama: =gama- pas;Repr ezent ar eSupr af at a

    end;

    procedure TForm1.Button6Click(Sender: TObject);

    begi ngama: =gama+pas;

    Repr ezent ar eSupr af at aend;

    Crearea formei presupune o iniializare a celor trei unghiuri,precum i o primreprezentare a suprafeei. Programul este gata.

    procedure TForm1.FormCreate(Sender: TObject);

    begi n

    al f a: =165; bet a: =- 135; gama: =135;Capt i on: =' Repr ezent ar e supr af at a' ;Repr ezent ar eSupr af at a

    end;

    end.

  • 7/23/2019 20 Aplicatii Delphi Si VB

    62/212

    61

    Aplicaia 6Parser - analiza sintactici lexicala unei fraze

    6.1. Prezentare general

    Programul, de o complexitate deosebit, face parte dincategoria programelor de prelucrare a limbajului natural. Seintroduce ntr-o csu de text o fraz, iar programul spune dacfraza este corect sau nu, n conformitate cu un vocabular i o

    mulime de reguli sintactice aprioric stabilite i care formeaz ogramatic.

    De pild, n figura de mai sus, s-a introdus fraza "orice brbatiubete o femeie frumoasi deteapt", care a fost acceptat, dreptcorect. n tabel este reprezentatdiagrama de analizsintacticafrazei, care n rndul etichetat cu "0" i coloana etichetat cu"deteapt".

  • 7/23/2019 20 Aplicatii Delphi Si VB

    63/212

    62

    Lexicul folosit n analiz, scris n fiierul text 'LEX.TXT', a fosturmtorul:

    Det - >or i ceDet - >f i ecar eDet - >o

    Det - >unPr on- >elN- >bar batN- >f emei eV- >i ubest eV- >ur ast eA- >f r umoasaA- >dest eapt aC- >siC- >sau

    Astfel, fraza considerat anterior conine doar cuvinte dinvocabularul ales. Pe de altparte, fraza "orice cine urte o pisic",dei corectsintactic n limba romn, nu este acceptat, deoarececon

    ine cuvinte ce nu sunt trecute n vocabularul nostru.

    Fiierul conine, pe fiecare rnd, o regulde forma:categorie gramatical(sau parte de vorbire) -> cuvnt din limba romn

    Regulile de sintax (din fiierul 'GRAM.TXT') sunt osubmulime a regulilor de sintaxale limbii romne:

    S- >NP VPNP- >Pr onNP- >NNP- >Det NNP- >NP APAP- >AAP- >AP CPCP- >C AVP- >V VP

    VP- >V NPAstfel, folosind notaiile consacrate (S (sentence) = propoziie,

    NP (noun phrase) = grup verbal, VP (verb phrase) = grup verbal, N(noun) = substantiv, Det (determiner) = determinator (de pildarticolnehotrt), AP = grup adjectival, A (adjective) = adjectiv, C =

  • 7/23/2019 20 Aplicatii Delphi Si VB

    64/212

    63

    conjuncie, V = verb, CP = grup format dintr-o conjuncie i unadjectiv.

    Regulile de sintaxsunt date, cte una pe linie, astfel:categorie gramatical1 -> categ. gram. 2 categ. gram. 3,

    cu sensul c prima categorie gramatical se formeaz dinconcatenarea celorlalte dou, din dreapta sgeii.

    Conform regulilor de sintaxfolosite n aplicaia noastr, frazaconsideratla nceput este corect, pe cnd n figura urmtoare esteprezentat un caz considerat incorect.

    De remarcat calgoritmul implementat de noi folosete doargramatici scrise n forma normalChomsky (CNF). O gramaticCNFeste o gramaticliberde context, n care produciile sunt de forma:

    A -> B C, n care A este un neterminal, iar B i C sunt neterminali saupreterminali. De asemenea, am considerat ca acceptabile i reguli deforma A->B. Aadar, n partea dreapta regulilor de producie vor fi

    dousau doar un singur element.Detalii referitoare la subiectul tratat, pentru cititorul neavizat,pot fi studiate n lucrri cu un pronunat caracter tiinific, ca celemenionate la bibliografie.

  • 7/23/2019 20 Aplicatii Delphi Si VB

    65/212

    64

    n continuare, vom prezenta algoritmul de baz de analiz(numit i parsare "chart-parsing") elaborat de Cocke, Kasami iYounger i numit algoritmul CKY de baz.

    Algoritmul folosete o matrice (o diagram) char t ca cele dinfigurile anterioare.

    Mai nti avem nevoie de nite definiii:Se definete operaia:Star(X,Y)=C|(A este n X) i (B este n Y) i C->AB este o

    reguldin gramatic.Aceasta reprezint faptul c produsul a dou celule din

    matrice este creat prin combinarea tuturor perechilor de itemi dincele doucelule ce satisfac nite reguli din gramatic.

    O altoperaie ce se definete este:Closure(S) = A|(A este n S) sau ((B este n Closure(S)) i (A->Beste o reguldin gramatic.

    Aceasta reprezint faptul c nchiderea unei celule S esteformatdin coninutul lui S plus rezultatul adugrii oricrei categoriice derivdintr-un membru existent al nchiderii lui S. De pild, dacN este n S atunci N aparine lui Closure(S); apoi, dac exist o

    regulNP->N, i NP va fi adugat n Closure(S); lucrurile continunacest mod ct timp se mai pot aduga noi membri n Closure(S).n fine, existi o funcie Lookup, de forma:

    Lookup(k) = A|A->cuvntul k,adicne dlista de categorii gramaticale pe care le cuvntul al k-leadin fraza noastr (uneori un cuvnt poate avea mai multe categoriigramaticale, de pild"duce" poate fi att verb, ct i substantiv).

    Cu definiiile de mai nainte, algoritmul de bazCKY este:

    f or k: =1 t o n dobegi n

    char t [ k- 1, k] : =Cl osur e( Lookup( k) ) ;f or i : =k- 2 downt o 0 do

    begi n

    char t [ i , k] : =;f or j : =k- 1 downt o i +1 do

    char t [ i , k] : =char t [ i , k] St ar ( char t [ i , j ] , char t [ j , k] ;

    char t [ i , k] : =Cl osur e( char t [ i , k] ) ;end

    end;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    66/212

    65

    i f S char t [ 0, n] t hen Accept el se Rej ect

    Algoritmul prezentat mai sus va fi implementat n programulcare urmeaz, n care se vor realiza proceduri pentru cele trei funciidefinite, din cauza unor restricii ale limbajului Pascal.

    6.2. Textul explicat al programului

    unit parser1;

    interface

    usesWi ndows, Messages, SysUt i l s, Cl asses, Gr aphi cs,

    Cont r ol s, For ms, Di al ogs, St dCt r l s, Gr i ds, Ext Ct r l s;

    t ypeTFor m1 = cl ass( TFor m)

    St r i ngGr i d1: TSt r i ngGr i d;Edi t 1: TEdi t ;Label 1: TLabel ;pr ocedur e Edi t 1KeyPr ess( Sender : TObj ect ; var Key: Char ) ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    67/212

    66

    pr ocedur e For mCr eat e( Sender : TObj ect ) ;pr i vat e

    { Pr i vat e decl ar at i ons }publ i c

    { Publ i c decl ar at i ons }end;

    var

    For m1: TFor m1;

    implementation

    {$R *. DFM}

    const max=20; maxr eg=20; maxcuv=5; maxcuvi nt e=20;

    Pentru a memora elementele care apar n stnga i n dreaptaunei reguli din gramatic, folosim tipul Cuvi nt .

    t ype Cuvi nt =St r i ng[ 30] ;Mul t i meDeCuvi nt e=obj ect

    nc: I nt eger ;cuv: ar r ay[ 1. . maxcuv] of Cuvi nt ;pr ocedur e Adauga( c: Cuvi nt ) ;

    end;O regulare doupri, una n stnga i una n dreapta, iar ogramaticeste constituitdin mai multe astfel de reguli.

    r egul a=r ecor dst , dr : Cuvi nt

    end;

    t ype Gr amat i ca=obj ect nr : I nt eger ;r eg: ar r ay[ 1. . maxr eg] of r egul a;pr ocedur e Ci t est e( nf : St r i ng) ;

    end;

    Diagrama este o matrice n care fiecare celuleste o mulimede cuvinte. G este gramatica cu regulile, iar D este, de fapt,

    dicionarul de cuvinte folosit.var char t : ar r ay[ 0. . max, 0. . max] of Mul t i meDeCuvi nt e;

    G: Gr amat i ca;D: Gr amat i ca;Pr opoz: ar r ay[ 1. . maxcuvi nt e] of Cuvi nt ;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    68/212

    67

    Desenarea diagramei se face conform coninutului matriceichar t , folosind controlul St r i ngGr i d1:

    procedure DeseneazaChart(i,j: Integer);

    var t : St r i ng; k, kk: I nt eger ;begi n

    i f char t [ i , j ] . nc>=1 t hen

    begi nt : =' {' ;f or k: =1 t o char t [ i , j ] . nc- 1 do

    t : =t +char t [ i , j ] . cuv[ k] +' , ' ;t : =t +char t [ i , j ] . cuv[ char t [ i , j ] . nc] +' }' ;For m1. St r i ngGr i d1. Cel l s[ j , i +1] : =t ;For m1. St r i ngGr i d1. Ref r esh

    endend;

    Funcia urmtoare verificdacun cuvnt dat xse aflsau nuntr-o mulime de cuvinte M.

    function EsteIn(x: Cuvint; M: MultimeDeCuvinte): Boolean;

    var est e: Bool ean; i : I nt eger ;begi n

    est e: =Fal se;f or i : =1 t o M. nc doi f x=M. cuv[ i ] t hen est e: =Tr ue;

    Est eI n: =est eend;

    Pentru obiectele de tip Mul t i meDeCuvi nt eam prevzut oprocedurde adugare a unui nou cuvnt:

    procedure MultimeDeCuvinte.Adauga(c: Cuvint);

    begi nnc: =nc+1; cuv[ nc] : =c

    end;

    Pe baza ultimelor dou subprograme descrise, putem definioperaiile St ar , Cl osur ei Lookup, precum i operaia de citire a

    unei gramatici, a crei reguli sunt scrise ntr-un fiier text dat.

    procedure Star(X,Y: MultimeDeCuvinte;

    var Z: MultimeDeCuvinte);

    var i , j , k: I nt eger ;begi n

    Z. nc: =0;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    69/212

    68

    f or i : =1 t o X. nc dof or j : =1 t o Y. nc do

    f or k: =1 t o G. nr doi f G. r eg[ k] . dr =X. cuv[ i ] +' ' +Y. cuv[ j ] t hen

    Z. Adauga( G. r eg[ k] . st )end;

    procedure Closure(S: MultimeDeCuvinte;

    var C: MultimeDeCuvinte);var i : I nt eger ; gat a: Bool ean;begi n

    C: =S;r epeat

    gat a: =Tr ue;f or i : =1 t o G. nr do

    i f EsteI n( G. r eg[ i ] . dr , C) t hen

    i f not EsteI n( G. r eg[ i ] . st , C) t henbegi nC. Adauga( G. r eg[ i ] . st ) ;gat a: =Fal se

    endunt i l gat a

    end;

    procedure Gramatica.Citeste(nf: String);

    var f : Text Fi l e; s : St r i ng; p: Byt e;begi n

    nr : =0;Assi gnFi l e( f , nf ) ;Reset ( f ) ;whi l e not eof ( f ) do

    begi nnr : =nr +1;

    ReadLn( f , s) ;p: =Pos( ' - >' , s) ;r eg[ nr ] . st : =Copy( s, 1, p- 1) ;r eg[ nr ] . dr : =Copy( s, p+2, Lengt h( s) - ( p+1) )

    end;Cl oseFi l e( f )

    end;

    procedure Lookup(k: Integer; var L: MultimeDeCuvinte);

    var i : I nt eger ;begi n

    L. nc: =0;f or i : =1 t o D. nr do

    i f D. r eg[ i ] . dr =Pr opoz[ k] t henbegi n

    L. nc: =L. nc+1;L. cuv[ L. nc] : =D. r eg[ i ] . st

  • 7/23/2019 20 Aplicatii Delphi Si VB

    70/212

    69

    endend;

    n fine, procedura urmtoare realizeazanaliza gramaticalafrazei date (ss), pe baza algoritmului descris teoretic n primulparagraf.

    procedure Parseaza(ss: String);

    var i , j , k, kk: I nt eger ;n: I nt eger ; p: Byt e;L, C, S: Mul t i meDeCuvi nt e; t : St r i ng;

    begi nss: =ss+' ' ;n: =0;whi l e ss' ' do

    begi np: =Pos( ' ' , ss) ;n: =n+1;Pr opoz[ n] : =Copy( ss, 1, p- 1) ;For m1. St r i ngGr i d1. Cel l s[ n, 0] : =Pr opoz[ n] ;St r ( n- 1, t ) ;For m1. St r i ngGr i d1. Cel l s[ 0, n] : =t ;Del et e( ss, 1, p)

    end;Form1. St r i ngGr i d1. RowCount : =1+n;For m1. St r i ngGr i d1. Col Count : =1+n;For m1. St r i ngGr i d1. Show;f or k: =1 t o n do

    begi nLookup( k, L) ;Cl osur e( L, C) ;char t [ k- 1, k] : =C;

    f or i : =k- 2 downt o 0 dobegi nchar t [ i , k] . nc: =0;f or j : =k- 1 downt o i +1 do

    begi nSt ar ( char t [ i , j ] , char t [ j , k] , S) ;f or kk: =1 t o S. nc do

    i f not Est eI n( S. cuv[ kk] ,char t [ i , k] ) t hen

    char t [ i , k] . Adauga( S. cuv[ kk] )end;

    Cl osur e( char t [ i , k] , C) ;char t [ i , k] : =C

    endend;

    f or i : =0 t o n do

  • 7/23/2019 20 Aplicatii Delphi Si VB

    71/212

    70

    f or j : =0 t o n do DeseneazaChar t ( i , j ) ;i f Est eI n( ' S' , char t [ 0, n] ) t hen

    For m1. Label 1. Capt i on: = ' Fraza accept at a. 'el se

    For m1. Label 1. Capt i on: = ' Fr aza r ej ect at a. 'end;

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key:

    Char ) ;begi n

    i f Key=Chr ( 13) t henPar seaza( Edi t 1. Text )

    end;

    procedure TForm1.FormCreate(Sender: TObject);

    begi n

    Capt i on: =' Basi c CKY Par ser ' ;St r i ngGr i d1. Hi de;G. Ci t este( ' gr am. t xt ' ) ;D. Ci t est e( ' l ex. t xt ' ) ;

    end;

    end.

    Iat coninuturile celor dou fiiere (gramatica i dicionarul)folosite de noi n exemplele considerate:

    GRAM.TXT

    S- >NP VPNP- >Pr on

    NP- >NNP- >Det NNP- >NP APAP- >AAP- >AP CPCP- >C AVP- >V VPVP- >V NP

    LEX.TXT

    Det - >or i ceDet - >f i ecar eDet - >o

    Det - >unPr on- >elN- >barbatN- >f emei eV- >i ubest eV- >ur ast eA- >f r umoasaA- >dest eapt aC- >si

    C- >sau

    Atenie! Algoritmul funcioneaz doar dac n partea dindreapta a fiecrei reguli din gramaticsunt cel mult dousimboluri,deci va trebui savei grijsrescriei gramaticile pe care le folosiiastfel nct sndeplineascaceastrestricie.

  • 7/23/2019 20 Aplicatii Delphi Si VB

    72/212

    71

    Aplicaia 7

    AutoWeb - Creator de pagini web

    7.1. Prezentare general

    Ne propunem, n continuare, s realizm un program cuajutorul cruia s realizm pagini web personale, dup un anumitformat, redat n figura de mai jos:

    Dupcum se poate observa n figur, o paginweb creatcuprogramul nostru, pe care l-am denumit AutoWeb, este compus

    din

    trei cadre (frames) i are urmtoarea structur: un cadru n partea de sus, neredimensionabil, n care este scris

    numele persoanei i deviza (motto-ul); un cadru n partea din stnga, redimensionabil, ce cuprinde

    hiperlegturi ctre diferite subiecte ce vor fi tratate n fiiere htmlseparate i vor fi afiate n dreapta;

  • 7/23/2019 20 Aplicatii Delphi Si VB

    73/212

    72

    un cadru n partea din dreapta, n care vor fi afiate fiierele htmlla care se face referindin cadrul cuprinsului din cadrul stng.

    Structura fiierului principal i ndex. ht ml este urmtoarea:

    Pagi na mea web

    Aceast a pagi na ar e cadr e, dar expl or at or ul dumneavoast r a nul e accept a.

    Aadar, am definit doutrei cadre:

    susavnd coninutul din fiierul sus. ht ml ; st gcu sursa luatdin fiierul st anga. ht ml ; dr p, care se ncarc, pentru nceput, cu fiierul sub1.html,

    referitor la subiectul 1.Coninutul fiierului sus. ht ml este simplu:

    sus

    I oana I onescuSi mi i ne e o zi !

  • 7/23/2019 20 Aplicatii Delphi Si VB

    74/212

    73

    Cu excepia rndurilor subliniate, care reprezint numelepersoanei i motto-ul su, toate celelalte linii ale fiierului vor figenerate prin program i rmn neschimbate. Totui, trebuie ca sexiste un fiier sus. ht ml creat aprioric. Acesta va fi ca cel descrisanterior, n care n locurile subliniate apar doutexte sugestive: '(datinumele dumneavoastra aici)' i '(dati motto-ul dumneavoastra aici)'.

    Numele persoanei i motto-ul su vor fi introduse saumodificate n timpul execuiei aplicaiei AutoWeb, care va generaacest fiier. De asemenea, se presupune existena n directorulcurent a unui fiier pentru realizarea fundalului, cu numelef ond. j pg.

    Atenie! Pagina web creatva putea fi afiatdoar n InternetExplorer (din cauza modului de definire a cadrelor, ca i din cauza

    faptului cse definesc cele doucsue de text defilant, cu ajutorulmarcatorului mar quee. Dac dorii s realizai o variant care sfuncioneze i n Netscape Communicator, propunem srenunai detot la cadrul sus, punnd coninutul acestuia n cadrul din stnga.

    Cadrul st g va conine ntotdeauna fiierul stg.html, care aravea o structurde cuprins cu referiri la diferite fiiere html ce vor fiafiate n cadrul drp. De aceea va trebui sfolosii atributul t ar get

    n cadrul definirii hiperlegturilor. Astfel, atunci cnd se alege unsubiect din cuprinsul din stnga, datoritfaptului cinta este cadruldrp, trimiterea se va face ctre un fiier ce va fi afiat n partea dindreapta. Dac atributul t ar get ar lipsi, noul fiier s-ar afia tot ncadrul din stnga.

    Meni ul Cupr i ns: Despr e mi ne

    Pasi uni l e mel eFami l i a mea

  • 7/23/2019 20 Aplicatii Delphi Si VB

    75/212

    74

    Cu excepia rndurilor subliniate, care vor fi introduse deutilizatorul aplicaiei AutoWeb, toate celelalte rnduri ale fiieruluist anga. ht ml de mai sus vor fi generate prin program.

    Corespunztor celor trei subiecte la care se face referin ncadrul lui st anga. ht ml , vor exista trei fiiere sub1. ht ml ,

    sub2. ht ml i sub3. ht ml . Acestea vor conine fraze simple,neformatate, dar e posibil sexiste i o imagine n interior. Daceaexist, numele ei este precizat de ctre utilizatorul programului iimaginea va fi afiatnaintea textului.

    De pild, n exemplul nostru, am folosit fiierul sub1. ht ml cuurmtorul coninut, n care rndurile subliniate au fost introduse de latastatur, iar restul au fost generate prin program:

    Despr e mi ne

    Ma numesc I oana I onescu.

    Si nt el eva i n cl asa a X- a, l a Col egi ul Nat i onal "Fer di nandI " di n Bacau.

    Si nt nascut a i n zodi a Gemeni si am 17 ani .

    Celelalte pagini (sub2. ht ml i sub3. ht ml ) vor fi create

    asemntor.Dup cum am spus, toate aceste fiiere sunt scrise de

    programul AutoWeb, aplicaie pe care o vom prezenta mai jos.Excepie face fiierul i ndex. ht ml care va fi realizat dedumneavoastrmanual i nu l vei modifica. Fiierele sub1. ht ml ,sub2. ht ml i sub3. ht ml vor fi i ele create anterior, dar vor fimodificate de ctre program.

    La nceput, ele vor arta ca mai jos (pstrai propoziiile scrisentre parenteze rotunde, pentru c ele trebuie s se regseasc nacea procedur din textul programului care se ocup de salvarea

    ntregii pagini web).

  • 7/23/2019 20 Aplicatii Delphi Si VB

    76/212

    75

    ( scr i et i ai ci denumi r ea subi ect ul ui )

    ( t r at at i ai ci pe l ar g acest subi ect )

    Pentru a le edita, putei folosi un editor de texte precumNotepad.

    n timpul execuiei, aplicaia AutoWeb arat ca n figuraurmtoare.

    Aadar, exist o csu de text n care se introduce numele

    persoanei, una n


Recommended