curs del phi

Download Curs Del Phi

If you can't read please download the document

Upload: vitalik095

Post on 03-Jul-2015

1.627 views

Category:

Documents


1 download

TRANSCRIPT

Dorin Bocu

(Elemente de programare vizuala utiliznd Delphi)

Metode evoluate de programare

Cuvnt nainte Sintagma Metode evoluate de programare este discutabil. ntrebarea Care metode de programare sunt evoluate i care nu ne aduce pe un teren relativist i controversat. Relativist, deoarece ceea ce astzi este revoluionar sau evoluat, mine devine fapt comun. Controversat, deoarece linia de demarcaie ntre metodele evoluate de programare i restul lumii este departe de a fi recunoscut de ntreaga comunitate a programatorilor. Programarea orientat pe obiecte este o metod evoluat de programare? Programarea care insist pe un anumit tip de modularizare este o metod evoluat de programare? Programarea bazat pe componente este o metod evoluat de programare? Oare modelul de dezvoltare are vreun impact asupra metodei de programare? Multe sunt ntrebrile care ar putea face obiectul discursului acestui curs. Cert este c activitatea de programare nu se mai poate desfura dup canoanele anilor 60, nici mcar dup canoanele anilor 80. Sistemele de operare moderne propun, de regul, o anumit viziune asupra caracteristicilor unei aplicaii. Referindu-ne la sistemul de operare Windows, de exemplu, vom vorbi despre aplicaii Windows, care au caracteristici precum: interfa grafic cu utilizatorul, acces potenial la capabilitile multitasking ale sistemului de operare, posibiliti nelimitate de utilizare a memoriei, acces la tehnologiile Microsoft (DDE, OLE-ACTIVEX, DIRECTX, COM, DCOM, etc.). De asemenea, activitatea de programare nu mai poate fi conceput n afara sprijinului oferit de mediile de programare. Acestea sunt sisteme soft care integreaz o serie de elemente suport (editor de texte, compilator, debuger, gestionare proiecte, editor de resurse, etc.), n conformitate cu o strategie de abstractizare adecvat, cu scopul de a mri randamentul activitii de programare precum i indicele de calitate al programelor (fiabilitate, corectitudine, interfa ergonomic, etc.) Dei nu este locul pentru a epuiza subiectul, utilizarea mediilor de programare pentru a trece la producia industrial a softului, nu este posibil fr a contientiza imortana modelelor de dezvoltare n procesul de realizare a sistemelor soft. Astfel de probleme ne vor preocupa n acest curs, cu intenia clar de a mai face un pas nainte pe drumul nelegerii importanei relaiei modelare-implementare, sub auspiciile unui mediu de programare, n meseria de dezvoltator de sisteme soft. Mediul de programare cobai pentru prezenul curs poate fi Delphi sau C-Builder. Prezentul suport de curs se va axa pe prezentarea unora dintre liniile de for eseniale ale mediului vizual de programare Delphi, recunoscut pentru accesibilitatea i elegana soluiilor pe care le propune pentru realizarea de aplicaii Windows, n principal. Mediul vizual de programare Delphi se bazeaz pe limbajul Object Pascal, un urma puternic al limbajului Pascal (viziunea Borland). n Object Pascal i sub Delphi, exist suport pentru a face modularizare metodic, orientare pe obiecte metodic, tratare structurat a excepiilor, etc. Trecerea la C-Builder nu ridic dect probleme de acomodare cu limbajul C++, dac acestea exist. Mediul vizual de2

programare C-Builder este, abstracie fcnd de limbajul din spate, identic cu mediul vizual de programare Delphi. De aceea, va fi uor pentru fanii mptimii ai C++ s cocheteze cu C-Builder, dup ce au descoperit strategia de lucru sub Delphi. Dat fiind ntinderea universului problematic al unui mediu vizual de programare (Delphi sau C-Builder), o parte dintre aceste probleme vor fi, din fericire, abordate la cursul opional de Programare Windows. * Programarea n Pascal, din perspectiv DOS, reprezint un prilej de afirmare a unor principii foarte clare ale modelului clasic de rezolvare a unei probleme cu ajutorul calculatorului:

Fiecare program se bazeaz pe existena a trei seciuni: citirea datelor deintrare, efectuarea prelucrrilor specifice i afiarea rezultatelor. Ordinea determinant pentru execuia instruciunilor este ordinea secvenial. Odat lansat n execuie, posibilitile de comunicare operativ ale unui program cu mediul, sunt, principial, extrem de reduse. Interactivitatea program-utilizator, ntr-o form ct mai complex, nseamn efort uria de programare pentru realizarea interfeelor (proiectare + gestiunea evenimentelor asociate).

Acest model de abordare a problemelor de programare rmne dominant i n varianta orientat pe obiecte a limbajului Pascal. Dei orientarea pe obiecte creaz premize pentru eliminarea multor neajunsuri ale paradigmelor clasice, barierele impuse de sistemul de operare limiteaz beneficiile poteniale (Sistemele de operare compatibile DOS sunt monotasking, monouser i, ceea ce este extrem de neproductiv pentru programatori, sunt strine de preocuparea de a promova nite standarde relativ la filozofia de proiectare, programare i execuie a sistemelor soft). Pentru eliminarea neajunsurilor eseniale ale sistemelor de operare compatibile DOS, o alternativ a fost i este mediul de operare Windows. De menionat faptul c exist numeroase alte familii de sisteme de operare (OS, UNIX, etc.) care, n viziunea unor specialiti sunt chiar mai puternice i mai interesante dect Windows. Noutatea adus de mediul de operare Windows poate fi rezumat astfel:

Interactivitate ridicat a utilizatorului cu aplicaia; Introducerea datelor i comunicarea rezultatelor n form grafic; execuia simultan a mai multor programe sau a mai multor instane aleaceluiai program; comunicarea datelor ntre programe.

Toate aceste caracterisrici i gsesc suport n Windows, care este, prin ntreaga lui ofert de servicii, un mediu deschis de operare i programare. Prin sintagma de mai sus nelegem faptul c mediul Windows ofer toate facilitile necesare pentru ca orice programator s dezvolte i s adauge aplicaii care s se comporte asemntor celorlaltor componente livrate odat cu mediul Windows. Mai exact, programatorul are la dispoziie o mulime

3

impresionant de funcii, constante i structuri de date care i permit s creeze aplicaii conform standardelor Windows. Toate aceste faciliti sunt grupate n interfaa de programare a aplicaiilor (Win32API - Applicaion Programming Interface). Cum am mai spus, mai multe detalii pe teme de programare Windows se pot afla la cursul opional de Programare Windows sau din nenumratele surse de informare care exist n librrii i, din pcate, mai puin n bibliotecile colilor noastre. Firma Borland a oferit programatorilor ansa de a programa n spirit Windows prin intermediul pachetului Borland Pascal for Windows al kitt-ului Borland Pascal 7.0. Evoluia galopant a paradigmelor n materie de comunicaie electronic i n materie de gestiune a coleciilor de date a scos la ramp mediile vizuale de programare a sistemelor soft utilizator. Dei pionier n aceast direcie, Visual Basic are o serie de neajunsuri pe care specialitii de la Borland le-au sesizat i le-au rezolvat prin propunerea mediului Delphi de dezvoltare a aplicaiilor utilizator i nu numai (a se vedea C-Builder sau J-Builder!). Delphi este un mediu vizual de dezvoltare de aplicaii cu adevrat orientate pe obiecte i modularizate, pornind de la platforma Windows. Prin aceasta Delphi devine un instrument ideal pentru aplicarea n practic a paradigmei RAD (Rapid Applications Development). Dei nu este un mediu CASE (Computer Aided Software Engineering), Delphi este o platform care permite rezolvarea multor probleme a cror soluie se bazeaz pe prototipizare (=construirea unor versiuni sau componente simplificate ale sistemului soft propus, care pot fi analizate nainte de a se continua dezvoltarea). * Ucenicul care ncepe urcuul pe panta programrii vizuale, trebuie s neleag c are de parcurs un drum lung, plin de surprize i, firete, obstacole, care trebuie surmontate investind timp i, dac este cazul, pasiune i inteligen. n programarea vizual perspectivele se deschid larg pentru programator, dar, n egal msur, este nevoie i de o nou abordare n partea de proiectare pentru a nu eua graios, mai devreme sau mai trziu.

4

Ce nouti ofer DELPHI ?Delphi este o colecie integrat de capabiliti de dezvoltare a sistemelor soft care, mnuite n spiritul care a dus la specificarea lor, pot simplifica mult existena, ndeosebi a programatorilor implicai n derularea unui proiect de sistem soft. Ceva mai exact putem spune c Delphi este un mediu de programare vizual, obiect orientat, pentru dezvoltare rapid i cu scop general a aplicaiilor Windows 95, 98, 2000 i NT, XP, etc.. Dintre caracteristicile principale ale sistemului Delphi, semnalm: Mediul de dezvoltare poate fi personalizat. Este cunoscut faptul c, de civa ani, mediile vizuale de programare au adugat clasicelor IDE (Integrated Development Environment), care integrau trei instrumente de baz n programare( editor, compilator i depanator), capabiliti de realizare a interfeelor cu suport vizual i de generare automat a codului aferent. Delphi merge un pas mai departe, permind utilizatorului s personalizeze IDE Delphi cu ajutorul serviciilor oferite de componenta Open Tools API. Orientarea pe obiecte Limbaje precum Visual Basic sunt pseudo-obiect orientate, folosind obiecte i metode fr a oferi suport pentru ncapsulare, motenire i polimorfism. Limbajul Pascal Object, care st la baza aplicaiilor Delphi, este un limbaj cu adevrat obiect orientat, care permite combinarea datelor i a codului asociat pentru a defini clasele (ncapsulare), crearea de descendeni ai acestor clase (motenire) i tratarea unei clase descendente n relaia cu o clas printe din perspectiv polimorfic. Biblioteca de componente Toate elemenetele cu ajutorul crora sunt realizate, n mod uzual, interfeele aplicaiilor Windows sunt standardizate i puse la dispoziia programatorilor ca i componente, pstrate n biblioteca de componente a sistemului. Dac exist programatori care vor s modifice funcionalitatea componentelor oferite de Delphi, o pot face elegant, printr-o derivare adecvat, dar cu un efort de programare considerabil mai mare dect n cazul simplei utilizri a componentelor. Suport OCX i ActiveX Delphi tolereaz obiecte care sunt create cu alte limbaje (ca de exemplu C++) i sunt distribuite conform standardului OCX. Obiectele OCX sunt, n general, furnizate de companii de soft specializate, asigurnd o gam larg de funcionaliti. ActiveX este o redezvoltare a modelului OCX, cu utilizare larg, ndeosebi pentru browserele de Internet. OCX, ActiveX, COM, DCOM, OLE, etc. sunt tehnologii Microsoft importante pentru a nelege mai exact puterea oferita programatorilor de paradigma Windows de programare. Din nou fac trimitere la optionalul de programare Windows sau la autoinstruire.

5

abloane Delphi recunoate patru tipuri de abloane: forma, aplicaia, componenta i codul. abloanele de tip form, aplicaie i component permit reutilizarea coleciilor de obiecte n programe diferite sau ca baz pentru realizarea unui program nou. abloanele de tip cod simplific procesul de scriere a codului aferent unor enunuri Delphi standard. Compilare adevrat Multe medii de dezvoltare Windows genereaz executabile semi-compilate (pcod). Deoarece p-codul nu este executabil pe o main fizic, el trebuie translatat n momentul execuiei, ceea ce nseamn o semnificativ penalizare a performanei unui program. Delphi produce cod executabil autentic care, n plus, nu pretinde performane deosebite din partea mediului de execuie gazd. Totodat, filozofia Delphi permite lucrul cu componente DLL, fapt ce are implicaii asupra performanelor programului i mediului de execuie. Orientarea pe componente DLL a aplicaiilor realizate n spirit Windows creeaza, este drept, niste probleme de portabilitate de la sisteme puternic configurate la sisteme mai modeste, att din punct de vedere hard cat si din punct de vedere al forei sistemului de operare. Aplicaii robuste Sunt cunoscute de la alte limbaje dificultile legate de tratarea de ctre programator a excepiilor care pot s apar n timpul execuiei unui program. Delphi rezolv aceste probleme propunnd enunuri de limbaj adecvate pentru soluionarea lor. Aceste enunuri nu fac altceva dect s transpun n sintax Object Pascal, semantica cunoscut de la abordarea C++ pentru tratarea excepiilor. Gestiunea coleciilor de date Specialitii de la Borland sunt contieni de faptul c foarte multe aplicaii sunt realizate n jurul ideii de gestiune a datelor. De aceea, Delphi ofer obiecte i componente care reduc semnificativ efortul de realizare a aplicaiilor cu baze de date. Delphi este, n felul lui, un mediu de dezvoltare mamut care permite o deschidere aproape total ctre toate capabilitile specifice aplicaiilor Windows (aplicaiile grafice, aplicaiile multimedia, locale sau n reea). A mai aduga inc un motiv important n alegerea mediului Delphi pentru a face programare vizual: uurin a nvrii protocoalelor de dezvoltare asistat a aplicaiilor Delphi, comparativ cu alte medii (Visual Basic sau Visual C++).

6

2. Fundamentele limbajului Object PascalDei capabilitile mediului Delphi permit realizarea unor aplicaii utiliznd, esenial, doar click-ul de mouse, adevratele aplicaii utilizator presupun, nc, efort de programare pentru rezolvarea unor probleme specifice acestora. Limbajul prin intermediul cruia se face inseria de comportament specific n aplicaiile Delphi este limbajul Object Pascal. Schema de principiu dup care un programator combin capabilitile Delphi de generare a codului cu activitatea de adugare a codului specific poate fi dedus fcnd o scurt trecere n revist a disciplinei Delhpi de realizarea a unei aplicaii.

2.1. Componentele de baz ale mediului de dezvoltare DelphiPentru a simplifica procesul de dezvoltare a aplicaiilor, Delphi pune la dispoziia programatorului patru componente eseniale: editorul de forme, editorul de cod, inspectorul de obiecte i biblioteca de componente Delphi (VCL). n procesul de dezvoltare a unei aplicaii, interaciunea dintre aceste componente este permanent. Invarea semanticii acestei interaciuni este cheia succesului n programarea Delphi, alturi, evident, de cunoaterea limbajului Object Pascal. n Delphi, forma este un obiect special, destinat s preia toate proprietile ferestrei care va fi vizibil n momentul lansrii n execuie a proiectului. La fiecare lansare n execuie, sistemul Delphi creaz o form, care nu conine nici o component. S remarcm, totui, faptul c, aceast form este deja nzestrat cu o serie de funcionaliti ascunse n caseta de activare a meniului sistem(deplasare fereastr, redimensionare fereastr, minimizare fereastr, maximizare fereastr, nchidere feresatr). Pe form se pot aeza componente vizuale i nevizuale cu ajutorul crora se realizeaz interfaa program-utilizator. O aplicaie poate conine mai multe forme (dintre acestea una corespunde ferestrei principale a aplicaiei, celelalte fiind asociate altor ferestre de dialog, subordonate funcional ferestrei principale). Fiierul corespunztor unei forme are extensia .DFM. Numele implicit al formei este Unit1.DFM. Codul care descrie o form nu este de tip text ASCII. Pentru vizualizarea ASCII a codului care descrie o form se poate efectua un click pe butonul drept al mouse-ului ntr-o poriune neocupat a formei. Din meniul local afiat se va alege comanda View as Text . Textul afiat este urmtorul: object Form1:Tform1 Left =200 Top =110 Width =544 Height =375 Caption =Form1 Font.Charset =DEFAULT_CHARSET Font.Color =clWindowText Font.Height =-11 Font.Name =MS Sans Serif Font.Style =[] PixelsPerInch=96

7

TextHeight end

=13

Dac dorete, programatorul poate modifica unele dintre proprietile care apar n vizualizarea de mai sus. Revenirea de la reprezentarea de tip text la reprezentarea vizual a unei forme se poate face cu ajutorul comenzii View as Form (Alt+F12), accesibil n meniul local al reprezentrii de tip text. Inspectorul de obiecte este o component a mediului Delphi, responsabil de actualizarea proprietilor de tip cmp sau eveniment, asociate componentelor care contribuie la funcionalitatea unei aplicaii. Este vorba de acele proprieti ale obiectelor unei aplicaii care sunt publicabile (se va vedea mai precis sensul acestei sintagme cnd se va prezenta perspectiva Object Pascal asupra conceptului de clas). Pentru programator este important faptul c, inspectorul de obiecte este instrumentul care permite adaptarea proprietilor obiectelor unei aplicaii la cerinele concrete ale aplicaiei, coopernd permanent cu editorul de forme i cu editorul de cod. Impactul dinamicii relaiei inspector de obiecte - editor de cod - editor de forme poate fi apreciat corect doar rezolvnd efectiv probleme cu ajutorul mediului Delphi.

2.2. Conceptul de proprietatePentru descrierea obiectelor care alctuiesc o aplicaie se utilizeaz conceptul de proprietate. n Delphi obiectele pot avea proprieti (un concept nou pe care l vom lmuri din interiorul limbajului Object Pascal). Aceste proprieti pot fi de tip cmp sau de tip eveniment. Proprietile de tip cmp optimizeaz procesul de gestiune a atributelor informaionale ale unui obiect. Proprietile de tip eveniment optimizeaz procesul de gestiune a atributelor comportamentale ale unui obiect, implicate n gestiunea mesajelor unei aplicaii, tiut fiind faptul a o aplicaie Windows este puternic dirijat de evenimente i n consecin intens preocupat de tratarea diverselor mesaje care apar pe timpul execuiei acestei aplicaii. De exemplu, proprietatea Width a unei forme descrie limea acesteia. Evenimentul OnClick n contextul unei forme se refer la efectuarea unui click de mouse pe form. Aceleai consideraii sunt valabile i relativ la o component oarecare. Prin intermediul proprietilor stabilim caracteristicile vizuale sau funcionale ale formelor sau componentelor. Unele proprieti au valori implicite; valorile altora pot fi selectate dintr-o mulime de alternative. Totodat, proprietile pot fi modificate i n timpul execuiei aplicaiei. De fapt, proprietatea de tip cmp este un concept cu ajutorul cruia se obine un spor de flexibilitate n ceea ce privete accesul la cmpurile unui obiect. n spatele proprietilor de tip eveniment se vor afla ntotdeauna metode ale claselor care le abstractizeaz. Evident, acestor metode le asociem cod Object Pascal care reprezint tratarea evenimentului cu care sunt solidare. Conform strategiei Delphi de organizare a codului scris de programator, fiecare form are asociat i un fiier cu extensia .PAS n care se pstreaz att codul generat automat de Delphi ct i codul adugat de programator structurat dup exigenele conceptului de unit, cunoscut din Pascal. Mai multe forme ntr-o aplicaie nseamn

8

mai multe unit-uri. Legarea formelor, astfel nct acestea s formeze o aplicaie este realizat cu ajutorul conceptului de proiect. Nu este interzis ca o form s i implementeze funcionalitatea cu ajutorul mai multor unit-uri, dac este necesar din punct de vedere al modularizrii.

2.3. Conceptul de proiectn timp ce unit-urile corespunztoare formelor reprezint modalitatea prin care Delphi organizeaz obiectele unei aplicaii, prin conceptul de proiect se ofer o prghie de reprezentare a structurii de prelucrare a aplicaiei la un nivel nalt de abstractizare (care ar putea imita oarecum ideea de program principal din Pascal sau TVision). Astfel c putem spune c, programului principal al unei aplicaii, Delphi i asociaz un fiier cu extensia .DPR . Implicit, numele fiierului proiect este Proiect1.DPR. n cazul unei aplicaii cu o singur form codul asociat este: program Proiect1; uses Forms, Unit1 in Unit1.pas {Form1} {$R *.RES} begin Application.Initialize; Application.CreateForm(Tform1,Form1); Application.Run; end. Aadar, aplicaiile Delphi nc se mai bazeaz pe abilitatea programatorilor de a scrie cod. Date fiind particularitile limbajului Object Pascal, putem concluziona c procesul de realizare a aplicaiilor Delphi nu este ntotdeauna un exerciiu n care rutina i automatismele nseamn totul. Aplicaiile adevrate presupun cunotine temeinice de algortimic, modelare obiect orientat, modularizare, precum i o cunoatere profund a tuturor posibilitilor oferite de binomul Object Pascal IDE Delphi.

2.4. Tipuri de date n Object PascalPrin intermediul tipurilor de date compilatorul este informat cu privire la modul n care vor fi organizate datele programului n memorie. Ori de cte ori se declar o variabil, este necesar raportarea la un tip de dat. Anumite tipuri de date sunt deja definite n limbaj (predefinite); alte tipuri pot fi definite de ctre utilizator. Pascal a fost unul dintre primele limbaje de programare care a permis programatorului s defineasc tipuri de date noi, conform cerinelor programelor. Despre limbajele care ofer suport pentru declararea de tipuri utilizator (date ,pointer sau procedurale, n general) se spune c sunt limbaje cu suport pentru tipizare. Sintaxa Pascal referitoare la definirea i instanierea tipurilor de date este valabil i n Object Pascal.

9

Observaie n mod uzual, identificatorii de tip n Object Pascal pot fi utilizai doar n contextul definirii unui nou tip sau n contextul unei declaraii de variabile. Exist, totui, cteva rutine care folosesc identidicatorii de tip ca parte a unei instruciuni executabile. De exemplu, SizeOf( T ) returneaz numrul de octei necesari pentru o instan de tip T. Tipuri de date simple Fiecare tip de dat din lumea real, orict de complicat, poate fi exprimat cu ajutorul unor componente simple, uor de manipulat la nivel de microprocesor. n Object Pascal, astfel de tipuri de date simple sunt separate convenional n dou grupe: tipurile ordinale (care reprezint informaia cu ajutorul unor componente de mrime variat, uor de manipulat de ctre microprocesor) i tipul real (care aproximeaz informaii ce pot fi reprezentate prin numere reale. Tipuri ordinale Dintre tipurile de date simple, cele mai simple sunt tipurile ordinale. Tipurile ordinale reprezint informaia prin elemente discrete. Relaia ntre elementele discrete i modul n care acestea sunt reprezentate n memorie instituie o relaie de ordine natural ntre elemente. De aici denumirea de ordinal. Object Pascal are trei grupe predefinite de tipuri ordinale: ntregi, caractere i valori booleene. Grupele de tipuri ordinale definite de utilizator sunt: enumerrile i subdomeniile. Valorile oricrui tip ordinal formeaz o secven ordonat astfel nct valoarea ordinal a oricrei valori de tip ordinal este determinat de poziia valorii nuntrul secvenei ordonate. Exceptnd valorile de tip ntreg, care pot fi att pozitive ct i negative, primul element al unui tip ordinal are indexul de poziie 0, al doilea are indexul de poziie 1 .a.m.d.. Indexul de poziie al unei valori de tip ntreg este chiar valoarea. n acest context, toate tipurile ordinale partajeaz anumite operaii comune care permit manipularea valorilor lor conform Tabelului 2.1. Observaie Pentru toate tipurile ordinale, Object Pascal asigur un mecanism typecasting pentru convertirea valorilor ntregi n valoarea ordinal corespunztoare, asftel: Dac T este numele unui tip ordinal i X este o expresie ntreag, atunci T(X) returneaz o valoare de tip T a crui valoare ordinal este X. Low(T) High(T) Ord(X) Funcie; returneaz valoarea minim a tipului ordinal T. Funcie; returneaz valoarea maxim a tipului ordinal T. Funcie; returneaz valoarea ordinal a

10

Pred(X) Succ(X) Dec(V) Inc(V)

expresiei ordinale X, relativ la tipul ordinal gazd. Funcie; returneaz predecesorul valorii expresiei X. Pentru expresii ntregi returneaz X-1. Funcie; returneaz succesorul valorii expresiei X. Pentru expresii ntregi returneaz X+1. Procedur; decrementeaz variabila V; Efectul ei este echivalent cu V:=Pred(V). Procedur; incrementeaz variabila V; Efectul ei este echivalent cu V:=Succ(V). Tabelul 2.1 Proceduri i funcii relativ la tipurile ordinale

Tipuri ntregi Tipurile ntregi reprezint informaia ca numere ntregi. n Object Pascal tipurile ntregi predefinite se mpart n tipuri fizice (fundamentale) i tipuri logice (generice). n mod uzual n aplicaii sunt preferate tipurile logice deoarece acestea sunt implementate astfel nct s asigure cele mai bune performane pe o main i un sistem de operare date. Tipurile ntregi fizice sunt utile atunci cnd se dorete un control strns asupra numrului de octei afectai ntregilor cu care lucreaz programul. Distribuia exact pe cele dou tipuri a varietilor de ntregi o prezentm n Tabelul 2.2 i Tabelul 2.3. Tip ShortInt SmallInt LongInt Byte Word Ordin de mrime -128..127 -32768..32767 -2174486648..2147483647 0..255 0..65535 Reprezentare fizic 8 bii /cu semn 16 bii/cu semn 32 bii/ cu semn 8 bii/fr semn 16 bii/fr semn Tabelul 2.2 Tipurile fizice

Tip reprezentare fizic 16 bii/cu semn/SmallInt 32 bii/cu semn/LongInt 16 bii/fr semn/Word 32 bii/fr semn/LongInt Tabelul 2.3 Tipurile logice S binevoim fa de cititor i s-i spunem c, utiliznd tipurile fizice punem nite contre mai mari sau mai mici portabilitii programelor noastre, ceea ce, la un anumit nivel de profesionalism nu este lipsit de importan. Tipurile de date ntregi partajeaz toate operaiile specifice tipurilor ordinale avnd i operaii specifice numerelor. n Tabelul 2.4 prezentm lista acestor operaii.

Tip Integer Integer Cardinal Cardinal

Ordin de mrime -32768..32767 -2147483648..2147483647 0..65535 0..2147483647

11

Rezultatul Returneaz valoarea absolut a ntregului din X Returneaz ctul mpririi ntregului X la ntregul Y Returneaz restul mpririi ntregului X la ntregul Y Returneaz TRUE dac X este impar i FALSE dac X este par Returneaz ptratul lui X Tabelul 2.4 Alte operaii cu numere ntregi Tipuri caracter Implementrile pe calculatoarele compatibile IBM-PC ale limbajului Pascal au folosit de la nceput pentru reprezentarea noiunii de caracter codul ASCII (American Standard Code for Information Interchange). Schema de codificare ASCII utilizeaz efectiv apte bii ai unei locaii de memorie pentru reprezentarea unui caracter. n mod evident, bitul suplimentar dubleaz numrul de caractere care pot fi reprezentate pe opt bii. Actuala definiie a sistemului Delphi utilizeaz o variant extins a codului ASCII numit Schema de codificare extins ANSI (American National Standard Institute). Codul extins ANSI permite, pe diferite platforme de operare, includerea de caractere suplimentare, utile n comunicarea ct mai complet cu utilizatorii calculatoarelor. Pentru acoperirea tuturor cerinelor de comunicare a calculatoarelor cu utilizatorii, n contextul internaionalizrii comunicaiei prin Internet, a fost specificat codul pe 16 bii UNICODE, n care primele 256 de intrri corespund direct celor 256 caractere definite n codul ANSI. Pentru a facilita utilizarea acestor tipuri de reprezentare a caracterelor, Object Pascal definete dou tipuri fizice de date de tip caracter i un tip generic sau logic de dat de tip caracter. Tipurile fizice sunt prezentate n Tabelul 2.5. Tipul AnsiChar WideChar Caracteristici Caractere orientate byte, ordonate conform setului de caractere extins ANSI Caractere orientate word, ordonate conform setului de caractere UNICODE. Primele 256 caractere UNICODE corespund setului extins de caractere ANSI. Tabelul 2.5 Tipuri fizice de caractere utilizabile n Delhpi

Operaia Abs(X) X Div Y X Mod Y Odd(X) Sqr(X)

Tipul generic de caracter n Delphi se numete simplu char. n limbajul Pascal clasic exista doar tipul char. n Delphi tipul char corespunde ntotdeauna tipului fizic AnsiChar. Apelul funciei Ord (C) unde C este o valoare de tip caracter, returneaz o valoare de tip ntreg folosit la reprezentarea caracterului C n memoria microprocesorului. De asemenea, Chr(X) este o funcie care convertete ntregul X n caracterul corespunztor codului X. n Delphi, acest apel este echivalent cu Char( X ). Avem la dispoziie i funcia UpCase care convertete,dac este cazul, un singur caracter la valoarea lui majuscul. Tipuri logice

12

Programatorii se lovesc de timpuriu de necesitatea de a lucra cu variabile cu dou stri. n Pascalul clasic tipul predefinit care rspunde unei astfel de cerine este tipul boolean care poate lua una din valorile true sau false. n limbajul C valoarea numeric o este asimilat cu false iar o valoare numeric nenul este asimilat cu true. n Delphi exist patru tipuri logice predefinite, prezentate n Tabelul 2.6. Tip Boolean ByteBool WordBool LongBool 1 octet 1 octet 2 octei 4 octei Tabelul 2.6 Tipuri logice n Delphi Variabilele de tip Boolean pot lua numai valorile False sau True. Variabilele de tip ByteBool, WordBool i LongBool pot lua alte valori ordinale interpretate prin convenie ca False pentru 0 sau True pentru orice valoare nenul. Tipuri enumerate n mod uzual, un tip enumerat este capabil s reprezinte valori discrete care au nume. Tipul Boolean din Object Pascal este un exemplu de tip enumerat predefinit astfel: type Boolean=(False, True); Cele mai multe tipuri enumerate sunt pur i simplu liste de identificatori unici pe care programatorul i va utiliza n situaii dedicate. Sintaxa de declarae este: type =(Identificator_1, Identificator_n,, Identificator_n); Tipul enumerat este ordinal. Prin urmare, identificatorii din lista enumerat au asociat un numr numit valoare ordinal asociat. Primul identificator are valoarea ordinal 0, al doilea are valoarea ordinal 1 .a.m.d.. Tipuri subdomeniu Un tip subdomeniu reprezint informaii care pot lua valori de un anumit ordin al unui tip ordinal corespunztor, altul dect subdomeniu. Sintaxa de declarare a tipului subdomeniu rmne aceeai din Pascal: type =..; Variabilele tipului subdomeniu partajeaz toate caracteristicile tipului definitor. Tipuri reale Tipurile reale reprezint informaii numerice care pot avea att parte ntreag ct i parte fracionar. Object Pascal are ase specii de tipuri reale. Aceste tipuri se Mrimea reprezentrii n octei

13

deosebesc prin ordinul de mrime asociat i precizia reprezentrii corespunztoare, fapt ilustrat mai precis n Tabelul 2.7. Tipul Real Single Double Extended Comp Currency Minimum n valoare absolu 2.9E-39 1.5E-45 5.0E-324 3.4E-4932 1.0 0.0001 Maximum n Cifre Nr. valoare absolut semnificative octei 1.7E38 11-12 6 3.4EE38 7-8 4 1.7E308 15-16 8 1.1E4932 19-20 10 9.2E18 19-20 8 9.2E14 19-20 8 Tabelul 2.7 Tipuri reale n Delphi

Numerele reale, n neles Object Pascal, nu sunt acelai lucru cu numerele reale ca neles matematic. Un tip real Object Pascal este o submulime strict a lui R,ale crei elemente pot fi reprezentate n virgul mobil utiliznd un registru cu numr specific de bii, conform standardului IEEE (Institute of Electrical and Electronic Engineers). ntr-o msur mult mai mare dect numerele ntregi, numerele reale ridic probleme dintre cele mai neateptate celor care au aplicaii n care precizia reprezentrii i ordinul de mrime sunt eseniale. Unit-ul Delphi System pune la dispoziia programatorilor o serie de rutine pentru manipularea numerelor reale. Cele mai uzuale dintre ele sunt prezentate n Tabelul 2.8. Alte rutine de interes n acest scop sunt disponibile n unit-urile SysUtils i Math. Funcia Abs(x) ArcTan(x) Cos(x) Exp(x) Frac(x) Int(x) Ln(x) Pi Round(x) Ce returneaz Valoare absolut a lui x Arctangenta lui x Cosinusul argumentului x, considerat n radiani Puterea x a numrului e Partea fracionar a lui x Partea ntreag a lui x. Atenie! Int returneaz o valoare de tip real. Logaritmul natural al numrului x Numrul (3.1416) Numrul ntreg cel mai apropiat de x. Rezultatul returnat de Round este de tip nreg. Formula cel mai apropiat de x devine ambigu cnd partea fracionar este 0.5. Delphi las pe seama sistemului s decid cum efectuiaz rotunjirea n aceast situaie. n mod uzual, cu procesor INTEL, recomandarea IEEE este de a se rotunji la cel mai apropiat numr nreg par. Sinusul trigonometric al argumentului x, considerat n radiani. Ptratul lui x. Adic x*x. Rdcina ptrat a lui x. Partea ntreag a lui x. Spre deosebire de Int, Trunc returneaz o valoare de tip ntreg.

Sin(x) Sqr(x) Sqrt(x) Trunc(x)

14

Tabelul 2.8 Funcii pentru lucrul cu numere reale Tipuri ir n expresii, Delphi suport trei specii de iruri de caractere format fizic : -scurt (ShortString); -lung (AnsiString); -mrit (WideString). AnsiString, ShortString i WideString pot fi utilizate combinat n atribuiri i expresii, Delphi executnd automat conversiile necesare. Att tipul AnsiString ct i tipul WideString pstreaz caracterele n vectori alocai dinamic, a cror lungime este plafonat doar de lungimea fizic a memoriei. Diferena ntre aceste dou tipuri const n faptul c AnsiString pstreaz caracterele ntr-un arrray de caractere de tip char iar WideString pstreaz caracterele ntr-un array de caractere de tip WideChar. n mod uzual este utilizat tipul AnsiString, tipul WideString fiind indispensabil dac se realizeaz aplicaii care utilizeaz setul de caractere UNICODE. Fizic, tipul ShortString este pstrat ca un array [0..255] of char. Prima poziie n ir pstreaz lungime dinamic a irului, care poate varia ntre 0 i 255 caractere. Caracterele efective ocup poziiile de la 1 pn la 255. Tipul ShortString a fost introdus din motive de compatibilitate cu Borland Pascal i versiunile timpurii ale mediului Delphi. Tipul ir de caractere generic este cunoscut n Delphi ca string. Cu ajutorul directivei de compilare {$H} putem stabili dac string se refer la ShortString sau AnsiString. Pentru {$H+}, care este starea implicit a directivei, string se refer la un AnsiString. Din motive de compatibilitate cu alte limbaje, Delphi suport o clas de iruri de caractere numite iruri de caractere null-terminate. Nu exist cuvinte rezervate sau identificatori speciali pentru a indica folosirea irurilor de caractere null-terminate. irurile de caractere null-terminate se compun din caractere nenule urmate de caracterul null (#0). Spre deosebire de tipurile Object Pascal AnsiString, ShortString i WideString, irurile de caractere null-terminate nu au indicator de lungime separat. Tabelul 2.9 prezint cteva rutine utile n lucrul cu iruri de caractere. Funcia Concat (S1, S2, S3) Copy (S, Pos, Len) Delete (S, Pos, Len) Insert ( Sursa, Dest, Pos) Length (S) Descrierea Returneaz rezultatul concatenrii irurilor S1, S2, S3. Returneaz un subir de lungime cel mult Len caractere, care ncepe din poziia Pos a irului de caractere S. terge cel mult Len caractere din irul S, ncepnd cu poziia Pos Insereaz irul de caractere Sursa n variabila ir Dest ncepnd din poziia Pos. Returneaz lungimea dinamic a irului S. Similar funciei LEN din Basic sau funciei

15

strlen( ) din C/C++. Pos (Subs,S) Returneaz poziia primei apariii a subirului Subs n irul S. Similar funciei SUBSTR din Basic sau funciei strstr( ) din C/C++. SetLength(S, NewLen) Seteaz lungimea dinamic a variabilei ir S. SetString Seteaz coninutul unui ir de caractere. Str (X, S) Convertete expresia numeric X n irul de caractere S. StringOfCharS Returneaz un un ir de un numr dat de caractere. Val (S, V, Code) Convertete irul S la reprezentarea numeric corespunztoare. Tabelul 2.9 Rutine sistem utile n lucrul cu iruri de caractere Tipuri de date structurate La nivel elementar, cele mai utile tipuri de date sunt acelea care pot conine numere sau informaii de tip caracter sau ir de caractere. Pornind de la tipurile elementare de date, putem crea alte tipuri de date utile, prin combinarea mai multor instane ale tipurilor elementare. Tipurile de date structurate furnizeaz capabiliti de creare a unor tipuri de date noi, prin extinderea definiiei unor tipuri de date anterior definite, astfel nct, n esen, mai multe valori ale tipului anterior definit, s poat fi manipulate ct se poate de comod i eficient. Aadar, componentele tipurilor structurate pot fi manipulate individual, sau ca ntreg i pot fi ele nsele de tip structurat. Tipurile structurate din Delphi sunt: -Tipul nregistrare (record); -Tipul tablou(array); -Tipul mulime; -Tipul fiier; -Tipul clas; -Tipul referin la clas; Dup cum se va vedea, noutatea fa de Pascal o reprezint introducerea tipului clas, prin care se opereaz nu doar o schimbare de nume ci o nou abordare a problemelor specifice programrii obiect orientate. Tipul referin la clas, aduce un argument n plus n ceea ce privete ncercarea platformei Delphi de a se apropia de alte limbaje importante pentru paradigma obiect orientat. Tipul nregistrare Cuvntul rezervat record permite gruparea diferitelor tipuri de date ntr-un singur tip. Sintaxa general a declaraiei unui tip nregistrare este: type : =record :; :;

16

: :; [case : of :; :; : :;] end; sau: type : =record :; :; : :; [case of :; :; : :;] end; Dup cum se vede, sintaxa general permite, opional, definirea de nregistrri cu lungime variabil, n dou moduri: n prima variant, alegerea prii variabile se face prin intermediul unei variabile selector introdus de clauza case. n varianta a doua, alegerea prii variabile se face n funcie de valoarea unui cmp discriminator care face parte din lista de cmpuri a prii fixe. n acest caz clauza case case introduce doar tipul selectorului. Este cunoscut faptul c, diferitele instane ale unui tip nregistrare cu format variabil, ocup n memorie acelai numr de octei. De asemenea, procedeele de adresare a cmpurilor unei variabile de tip nregistrare, sunt cele cunoscute de la Borland Pascal: calificarea individual cu punct sau calificarea global cu ajutorul clauzei with astfel: : var Inreg:; : Inreg . : var Inreg:; : with Inreg do17

: : end; Putem remarca faptul c tipul struct din C este echivalent cu tipul record fr parte variabil din Delphi. De asemenea, tipul union din C este echivalent cu tipul record cu lungime variabil din Delphi. Tipul array Structurile de tip array pot exista n variante unidimensionale sau multidimensionale. Sintaxa general pentru declararea unui tip array este urmtoarea: : type : =array [,,,] of ; : Dei este utilizat n varianta trivial, n care tipurile ordinale dup care se face indexarea sunt subdomenii ale unor varieti de ntregi, tipul array are i posibiliti de indexare dup alte tipuri ordinale, n funcie de particularitile problemei de rezolvat. Tipul mulime Cu ajutorul cuvntului rezervat set, se pot defini colecii ordonate de cel mult 256 valori ordinale distincte. Sintaxe de declarare a tipului mulime este: : type : =set of ; : Declararea variabilelor de tip mulime respect sintaxa cunoscut: : var : private : protected : published

39

: end; Domenii de vizibilitate Componentele unei clase pot avea domenii de vizibilitate diferite, n funcie de directiva de specificare a vizibilitii sub a crei inciden se afl. Dup cum se vede i mai sus, aceste directive de specificare a vizibilitii sunt: private, protected, public i published. Aceste directive restricioneaz vizibilitatea componentelor n situaia n care alte unit-uri foreaz accesul la ele. n interiorul unit-ului n care este definit clasa, toate componentele sunt vizibile. Observaie Spre deosebire de muli ali identificatori utilizai n declararea tipurilor, directivele de specificare a vizibilitii nu sunt cuvinte rezervate n afara contextului care ocazioneaz declararea clasei. n practic se recomand, totui, s le tratm ca i cnd ar fi cuvinte rezervate, n adevratul sens al cuvntului. Directivele de specificare a vizibilitii nu trebuie menionate explicit pentru fiecare membru al clasei. Regula este ca dup o directiv de specificare a vizibilitii s urmeze toi membrii care au acelai tip de vizibilitate. Un domeniu de vizibilitate se termin n momentul n care este ntlnit alt directiv de specificare a vizibilitii. Specificatorul de vizibilitate private Acest specificator este cel mai restrictiv. Membrii privai ai unei clase nu se vd n afara unit-ului n care este definit clasa. De obicei se declar ca private componente ale cror valori sunt critice pentru comportamentul instanelor clasei respective. Dac avem nevoie de dou clase care trebuie s aib acces reciproc la componentele lor, atunci aceste clase se vor defini n acelai unit. Detaliile de implementare sunt complet ascunse fa de end-user. Specificatorul de vizibilitate protected Specificatorul de vizibilitate protected relaxeaz restriciile de vizibilitate, n sensul c, componente declarate ca protected ntr-o clas pot fi accesate de obiecte care fac parte din domeniul clasei; altfel spus, descendenii unei clasei au acces la componentele din seciunea protected a acesteia. Detaliile de implementare rmn n continuare ascunse fa de end-user. Specificatorul de vizibilitate public Componentele publice sunt vizibile oriunde este vizibil i clasa. Nu se aplic alte restricii asupra componentelor publice ale unei clase. Specificatorul de vizibilitate published Declararea unei componente ca fiind de tip published, informeaz compilatorul c trebuie s genereze informaii de tip run-time (RunTime Type InformationRTTI) pentru componenta respectiv.

40

Informaiile de tip run-time permit unei aplicaii externe s afle date despre cmpurile, metodele sau proprietile unui obiect, despre clasa definitoare a obiectului, etc. Pe timpul execuiei unui program, din punct de vedere al vizibilitii, o component published se comport ca i cnd ar fi o component de tip public. Toate componentele published sunt vizibile n orice unit unde clasa care le ncapsuleaz este vizibil. Diferena const n faptul c, o aplicaie extern poate obine informaii de tip run-time despre componentele published. Ca un exemplu, inspectorul de obiecte al sistemului Delphi folosete interfeele published ale obiectelor din Paleta de Componente a sistemului Delphi pentru a determina ce proprieti i evenimente trebuie vizualizate n timpul proiectrii unei aplicaii. Exist anumite restricii n ceea ce privete modul de utilizarea al directivei published. O clas poate avea componente published dac este compilat sub incidena directivei {$M} avnd starea {$M+} sau dac este derivat dintr-o clas care deja a fost compilat astfel nct s aib componente published. Directiva {$M} controleaz generarea RTTI. Un cmp definit ntr-o seciune published trebuie s fie de tip clas. Cmpurile de orice alt tip trebuie plasate n seciunile public, protected sau private. Proprietile published sunt restricionate din punct de vedere al tipului. Sunt acceptate proprieti de tip: -ordinal; -real(Single, Double, Extended, Comp, nu i real); -ir de caractere; -mulime (small set); -clas; -identificator de metod (dar nu tip procedural global) Small set desemneaz un tip mulime al crui tip de baz este ordinal i ale crui valori ordinale sunt cuprinse ntre 0 i 50. Metode n procesul de definire a unei clase, metodele leag codul cu tipurile de date pe care codul este abilitat s le manipuleze. n acest scop, metodele au dreptul s acceseze cmpurile unui obiect fr ca acestea s-i fie trimise explicit ca parametri. Declararea unei metode are dou pri: declararea signaturii metodei n procesul de definire a clasei i implementarea corpului metodei n afara definiiei clasei, dar n acelai unit n care s-a definit i clasa. De la programarea Pascal OO se tie c declararea signaturii este asemntoare unei declaraii forward de procedur sau funcie. De subliniat ceea ce, de asemenea, se tie de la Pascal OO i anume faptul c implementarea corpului metodei presupune ca antetul ei s specifice numele clasei din a crei definiie face parte metoda. Referitor la implementarea unei metode mai facem urmtoarele precizri: n interiorul corpului unei metode, o instruciune care apeleaz o funcie sau o procedur permite utilizarea designatorilor de metod calificat pentru a activa o anumit metod a unei clase. Un designator de metod poate fi o variabil referin la

41

un obiect sau o referin la o clas. Cuvntul rezervat inherited desemneaz strmoul tipului obiect care include metoda. Prezentm n continuare un exemplu de definire a unei clase mpreun cu implementarea metodei aferente n care se utilizeaz i cuvntul rezervat inherited. type TFramedLabel = class(TLabel) protected procedure Paint; override; end; : procedure TFramedLabel.Paint; begin inherited Paint; with Canvas do begin Brush.Color := clWindowText; Brush.Style := bsSolid; FrameRect(ClientRect); end; end; n interiorul blocului care corespunde implementrii unei metode, regulile de vizibilitate sunt, dup cum poate c s-a neles, diferite de regulile de vizibilitate pentru proceduri i funcii oarecare. Accesul la componentele unui obiect din interiorul unei metode este simplificat datorit inserrii automate n codul unei metode a unei calificri de tipul: with Self do begin ... end; Variabila Self este o variabil de acelai tip cu clasa n care apare metoda. Implicit metodele sunt statice. Object Pascal propune ns i alte tipuri de metode, din perspectiva modului de rezolvare a apelului acestora. Le prezentm n Tabelul 3.1. Directiv Virtual Dynamic Message Abstract Override Class Efect Metoda apelat este determinat cu ajutorul tabelei VMT Metoda apelat este determinat cu ajutorul tabelei de metode dinamice Metoda apelat este determinat cu ajutorul mecanismului de transmitere a mesajelor Metoda nu are implementare dar trebuie redefinit n aval Metoda redefinete o metod virtual sai dinamic Apel de metod fr a utiliza variabila implicit Self Tabelul 3.1 Tipuri de metode n Object Pascal

42

Evident, n Object Pascal pot fi metode :procedurile, funciile, constructorii i destructorii. n linii mari, constructorii i destructorii se utilizeaz cu semnificaia care se cunoate de la limbajul Pascal. Metode statice Metodele declarate ntr-o clas sunt implicit statice. Nu este necesar un identificator special pentru a desemna o metod de tip static. Cnd este apelat o metod static, tipul variabile este cel care determin ce metod urmeaz s fie executat. Compilatorul determin exact adresa metodei n timpul compilrii. Avantajul fundamental al metodelor statice const n faptul c executarea lor este foarte rapid. Prin contrast, metodele virtuale i dinamice rezolv n timpul execuiei problema legrii codului care trebuie executat, ceea ce lungete timpul de execuie al programelor dac se abuzeaz de apelul la metode virtuale sau dinamice. O metod static nu poate fi schimbat cnd este motenit de un descendent al clasei n care aceasta este definit. Altfel spus, dac declarai o clas care include n definiie o metod static, atunci derivnd o nou clas din aceasta, clasa derivat partajeaz exact aceeai metod, situat la aceeai adres. Aceasta nseamn c nu putem redefini static metodele. n exemplul de mai jos, prima clas declar dou metode statice. Cea de-a doua clas declar dou metode statice cu acelai nume, care nlocuiesc metodele motenite de la prima clas. : type TFirstComponent =

TSecondComponent =

class(TComponent) procedure Move; procedure Flash; end; class(TFirstComponent) procedure Move; { diferit de metoda motenit, acelai antet} function Flash(HowOften: Integer): Integer; {Evident, diferit de metoda motenit } end;

: Metode virtuale Spre deosebire de apelul metodele statice, apelurile metodelor virtuale nu sunt rezolvate n faza de compilare. Metoda care urmeaz s fie executat, n cazul virtual este determinat n timpul execuiei printr-un procedeu numit legare ntrziat. Orice metod poate fi fcut virtual prin menionarea unei directive virtual la sfritul definiiei metodei n lista de componente a clasei. Noutatea metodelor virtuale const n urmtorul mecanism: dac ntr-un lan de derivare, o anumit metod, declarat virtual n clasa rdcin, apare n descendeni redefinit (marcat de directiva override), atunci un apel la metoda respectiv, fcut din contextul unei variabile compatibil cu lanul de derivare, va fi rezolvat n funcie de tipul curent al

43

variabilei. Tipul variabilei este stabilit n momentul crerii instanei, de ctre constructorul corespunztor clasei context. Alegerea metodei corespunztoare contextului se face cu ajutorul tabelelor VMT, unice, asociate claselor care au metode virtuale i create la apelarea constructorilor. Metode dinamice Un mecanism oarecum similar metodelor virtuale este utilizat i n cazul metodelor dinamice. Din punctul de vedere al utilizatorului nu se poate face diferena ntre cele dou tipuri de metode. Codul generat, ns, difer semnificativ, astfel: apelurile metodelor virtuale sunt mai rapide dar genereaz creterea codului; apelurile metodelor dinamice sunt mai lente, dar genereaz cod mai mare. n mod uzual, metodele virtuale sunt preferate dac se dorete exploatarea capabilitilor polimorfice ale unui lan de derivare. Dac, ns, se dorete crearea unei clase de baz din care se deriveaz un numr mare de descendeni, i n fiecare descendent se redefinete un numr mic de metode virtuale motenite. Metode de tip mesaj Aceste metode sunt o form specializat a metodelor dinamice, fiind indispensabile n manipularea eficient a mesajelor unei aplicaii Delphi. Compilatorul Object Pascal genereaz cod de apel specific acestor metode dac sunt declarate cu directiva message. Mecaismul de apel utilizat este aproape identic cu cel utilizat n cazul metodelo dinamice. Exist, ns, i elemente specifice de care programatorul trebuie s in cont cnd utilizeaz aceste tipuri de metode. Aceste elemente specifice sunt legate de protocolul de gestiune a mesajelor unei aplicaii ntr-o aplicaie Windows, n genere i ntr-o aplicaie Delphi, n particular. Prezentm, n continuare, un exemplu de specificare a unui handler utilizator de mesaje. const CM_CHANGECOLOR = WM_USER + 400; type TMyComponent = class(TControl) ... protected procedure CMChangeColor(var Message: TMessage): message CM_CHANGECOLOR; end; procedure TMyComponent.CMChangeColor(var Message: TMessage); begin Color := Message.lParam; inherited; end; Recomand studierea atent a help-ului on-line Delphi i a exemplelor demonstrative, pentru a aprofunda problematica lucrului cu mesajele n aplicaiile Delphi.

44

Metode abstracte De regul cnd se specific o metod n lista de componente asociat definiiei unei clase, compilatorul se ateapt s gseasc implementarea metodei n seciunea corespunztoare a unit-ului gazd. Pe de alt parte, atunci cnd se specific o metod n clasa de baz, se stabilete un comportament implicit al tuturor descendenilor, relativ la metoda respectiv. Pentru a schimba comportamentul n descendeni, trebuie redefinit metoda n descendeni. Dac nu are sens asocierea n clasa de baz a unui comportament implicit, se poate utiliza directiva abstract, pentru a semnala compilatorului c nu va fi implementat o metod implicit. De precizat faptul c orice metod declarat abstract trebuie s fi, totodat virtual sau dinamic, ca n exemplul de mai jos. type Base = class procedure DaliVision; virtual; abstract; procedure TellyVision; dynamic; abstract; end; Metode redefinite (override) Atunci cnd logica unui lan de derivare impune redefinirea unor metode ( virtuale sau dinamice), n descendeni se anuna redefinirea cu ajutorul directivei override. Pentru a ilustra ideea, prezentm i exemplul de mai jos. type TFirstComponent = class(TCustomControl) procedure Move; { metod static } procedure Flash; virtual; { metod virtual } procedure Beep; dynamic; { metod dinamic } end; TSecondComponent = class(TFirstComponent) procedure Move; { declarare metod nou } procedure Flash; override; { redefinire metod motenit } procedure Beep; override; { redefinire metod motenit } end; Metode de tip clas Metodele de tip clas nu sunt altceva dect metode ce pot fi apelate ca orice alte proceduri sau funcii obinuite, fr a fi nevoie de vreo instaniere a clasei care le-a definit. Acest tip de metode sunt uor de recunoscut prin prefixarea lor cu directiva class ca n exemplul de mai jos. Trebuie reinut ns c metodele de tip clas nu trebuie s modifice informaii relative la instane. Programatorii Java recunosc asemnarea cu metodele statice. Astfel c, n exemplul:

45

type Tclass1 = class Nume:string; class procedure ModificNume (NumeNou:string); end; class procedure ModificNume (NumeNou:string); begin Nume:=NumeNou; end; compilatorul va semnala eroare deoarece metoda de tip clas ModificNume ncearc s modifice valoarea cmpului Nume, care este o variabil de instan a clasei Tclass1. Unit-ul System definete dou tipuri, TObject i TClass, care sunt tipuri rdcin pentru toate tipurile clas i referin la clas, despre care vom discuta n continuare. Rdcina TObject conine o bogat colecie de metode de tip clas pe care le putem apela fr a fi nevoie s instaniem clasa. type TObject = class; TClass = class of TObject; TObject = class constructor Create; destructor Destroy; virtual; class function ClassInfo: Pointer; class function ClassName: ShortString; class function ClassNameIs(const Name: string): Boolean; class function ClassParent: TClass; function ClassType: TClass; procedure CleanupInstance; procedure DefaultHandler(var Message); virtual; procedure Dispatch(var Message); function FieldAddress(const Name: ShortString): Pointer; procedure Free; procedure FreeInstance; virtual; class function InheritsFrom(AClass: TClass): Boolean; class function InitInstance(Instance: Pointer): TObject; class function InstanceSize: Longint; class function NewInstance: TObject; virtual; class function MethodAddress(const Name: ShortString): Pointer; class function MethodName(Address: Pointer): ShortString; end;46

Conceptul de proprietate Conceptul de proprietate nu este absolut nou. n Turbo Pascal, proprietile se confundau cu nregistrrile sau cmpurile unui obiect. n Delphi, noiunea de proprietate, ca i concept nou, pare s fie strns legat de necesitile programrii vizuale. Este adevrat doar n parte deoarece noiunea de proprietate are o valoare de ntrebuinare care depete cerinele programrii vizuale. O definiie de proprietate ntr-o clas permite declararea unui anumit atribut al obiectelor unei clase i a aciunilor asociate cu citirea i scrierea atributelor. Exemple de astfel de proprieti sunt : proprietatea Caption a unei forme, mrimea fontului intr-un derivat TMemo, etc. Putem spune c proprietile sunt o extensie natural a cmpurilor unui obiect. Att cmpurile ct i proprietile pot fi utilizate pentru a exprima atributele unui obiect, dar, n timp ce cmpurile sunt doar locaii de memorie care pot fi examinate i modificate dup dorin, proprietile asigur un control mai mare asupra valorilor atributelor, datorit mecanismelor de citire /scriere cu care se asociaz o anumit proprietate. Prezentm mai jos, cu ajutorul limbajului diagramelor de sintax, regulile sintactice care stau la baza specificrii proprietilor unei clase. Definiie proprietateproperty Identificator Interfa proprietate

Specificatori proprietate

;

Definiie interfa proprietate :List parametri proprietate Tip identificator

index

Constant ntreg 47

Definiie list parametri proprietate

[

Declarare parametru

]

;

Definiie specificatori proprietate

Specificator READ

Specificator WRITE

Specificator de stocare

Specificator implicit

Definiie specificator readread Cmp / Metoda

Definiie specificator writewrite Cmp / Metod

Definiie specificator de stocarestored Cmp /Metod

Constanta boolean

Definiie specificator implicit

48

default

Constant

Definiie Cmp / Metodnodefault Identificator cmp

Identificator metod

Modul de utilizare al sintaxei de mai sus poate fi urmrit i din exemplul prezentat n continuare, care ne arat modul de scriere a codului surs al unei componente n Delphi. unit Exemplu; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs; type TArrayProp = array [1..5] of string[7]; TEverything = class(TCustomControl) private { Private declarations } FArrayProp : TArrayProp; function GetArrayPropInt(pIndex: integer): string; function GetArrayPropStr(pIndex: string): integer; protected { Protected declarations } public { Public declarations } constructor Create(AOwner: TComponent); override; property ArrayPropInt[Index: integer]: string read GetArrayPropInt; property ArrayPropStr[Index: string]: integer read GetArrayPropStr; published { Published declarations } end; procedure Register; implementation constructor TEverything.Create(AOwner: TComponent); begin49

// Iniializare FArrayProp FArrayProp[1] := 'one'; FArrayProp[2] := 'two'; FArrayProp[3] := 'three'; FArrayProp[4] := 'four'; FArrayProp[5] := 'five'; end; function TEverything.GetArrayPropInt(pIndex: integer): string; begin result := 'Necunoscut'; // Dac pIndex este definit n FArrayProp, seteaz variabila result la valoarea de //indice pIndex if pIndex in [1..5] then result := FArrayProp[pIndex]; end; function TEverything.GetArrayPropStr(pIndex: string): integer; var x : integer; begin result := -1; for x := 1 to 5 do if UpperCase(FArrayProp[x]) = UpperCase(pIndex) then begin result := x; exit; end; end; procedure Register; begin RegisterComponents('UD3', [TEverything]); end; end.

3.2 Tratarea excepiilor n DelphiPrintre caracteristicile principale ale mediului Delphi, una dintre cele mai importante este capacitatea de tratare a excepiilor, prin care programatorul poate s rspund elegant la apariia oricrei erori de execuie, simplificnd astfel i codul, ceea ce permite programatorului s se concentreze asupra algoritmilor principali ai aplicaiei. Excepiile n Delphi sunt similare celor folosite de C++, locul lui catch este preluat de except iar throw devine raise n Delphi. La fel ca n C++ excepiile sunt manipulate n blocuri, care la rndul lor pot s suporte incluziunea. Blocuri de protecie

50

n Delphi, tratarea excepiilor se face prin aa numitele blocuri de protecie, care pot executa, fie un cod de terminare pentru a nu fi compromis sesiunea Windows, fie o secven de cod care trateaz efectiv excepia, caz n care execuia programului continu normal. Aceste blocuri de protecie sunt la rndul lor compuse din alte dou tipuri de blocuri, un bloc de gard, care, aa dup cum i spune numele este rspunztor de interceptarea excepiei i un bloc de rspuns ce conine codul de tratare al excepiei, sau codul corespunztor terminrii aplicaiei. Structura de principiu a unui bloc de protecie n Delphi este: try //Blocul de gard n care excepia este susceptibil // s apar finally //Blocul de rspuns ce conine codul de terminare, //fr a nltura evoluia excepiei end; sau try //Blocul de gard n care excepia este susceptibil //s apar except //Blocul de rspuns ce conine codul de tratare, //a excepiei on do on do : on do end; n varianta cu finally execuia decurge astfel: Dac vreuna dintre instruciunile cuprinse ntre try i finally provoac o excepie, atunci sistemul pred controlul blocului de rspuns, cuprins ntre finally i end. Dac nu a aprut nici o excepie, dup epuizarea instruciunilor cuprinse ntre try i finally, se continu cu execuia instruciunilor cuprinse ntre finally i end. Altfel spus, n varianta cu finally avem la dispoziie un mecanism cu ajutorul cruia avem garania c se execut un cod de terminare corect a unui tip de prelucrare, indiferent de excepiile care pot apare. Prin acest mecanism se urmrete limitarea efectelor posibilelor excepii la execuia unui program Delphi. S mai adugm faptul c, n varianta cu finally, dup execuia codului de terminare, dac a aprut o excepie, aceasta i continu evoluia (nu este ridicat), putnd fi interceptat i tratat ntr-o bucl try extern, iar dac aceast bucl nu este gsit, putnd provoca n cele din urm terminarea anormal a programului.

51

n varianta cu except execuia decurge astfel: Lista instruciunilor din blocul try se execut n ordine. Dac nu apare nici o eroare, blocul except este ignorat, continundu-se execuia cu prima instruciune aflat dup end. Dac a aprut o excepie, controlul este dat celui mai interior handler de excepie existent. Dac un astfel de handler de excepie nu exist, atunci se va cuta un handler de excepii n exterior, n alt bloc try-except, neterminat nc. Dac un astfel de handler nu este gsit, se continu astfel pn la epuizarea blocurilor tryexcept, sau pn la gsirea handler-ului de excepie adecvat. Dac nu este gsit nici un handler, se genereaz un mesaj standard de eroare i execuia este terminat anormal. n sfrit, s mai adugm precizarea c, similar modului n care utilizam n C++ enunul throw, n Object Pascal putem folosi enunul raise pentru a genera o excepie. Delphi pune la dispoziia programatorului clase de excepii, extrem de utile pentru a monitoriza sistematic apariia excepiilor uzuale ale unei aplicaii Delphi (mprie la zero, acces nepermis la memorie, eroare la crearea unui fiier, etc.). Amnunte despre protocolul de utilizare i detaliile de sintax pot fi urmrite i n exemplele de mai jos. unit UExcept1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Label1: TLabel; Edit2: TEdit; Label2: TLabel; Button1: TButton; Label3: TLabel; Edit3: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1;52

Op1,Op2,Rezultat:real; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); begin try try Op1:=StrToFloat(Edit1.Text); Op2:=StrToFloat(Edit2.Text); Rezultat:=Op1/Op2; except on EConvertError do ShowMessage('Operanzi eronati...'); end; Edit3.Text:=FloatToStr(Rezultat); Edit1.SetFocus; Edit1.Text:=''; Edit2.Text:=''; except on EZeroDivide do ShowMessage('Impartire la zero...'); end; end; end.

unit UExcept2; //Aplicatie la tratarea exceptiilor in Delphi interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; //---------------------------------------------------------// Codul care urmeaza este o interfata intre //exceptiile aplicatiilor utilizator si sistem // asigurata de clasa Exception din unit-ul SYSUTILS, prezentat mai jos sub form de //comentariu. //---------------------------------------------------------(*Exception = class(TObject) private FMessage: string;53

FHelpContext: Integer; public constructor Create(const Msg: string); constructor CreateFmt(const Msg: string; const Args: array of const); constructor CreateRes(Ident: integer); constructor CreateResFmt(Ident: integer; const Args: array of const); constructor CreateHelp(const Msg: string; AHelpContext: integer); constructor CreateFmtHelp(const Msg: string; const Args: array of const; AHelpContext: integer); constructor CreateResHelp(Ident: integer; AHelpContext: integer); constructor CreateResFmtHelp(Ident: integer; const Args: array of const; AHelpContext: integer); property HelpContext: integer read FHelpContext write FHelpContext; property Message: string read FMessage write FMessage; end; *) type EMyComponentError = class(Exception) private FErrorCode: integer; public property ErrorCode: integer read FErrorCode write FErrorCode; constructor Create(const Msg: string; ErrCode: integer); end; EMyCompoRangeError =class(EMyComponentError); EMyCompoInvalidValue =class(EMyComponentError); TForm1 =class(TForm) Button1: TButton; Button3: TButton; Button2: TButton; Button4: TButton; Button5: TButton; ListBox1: TListBox; Button6: TButton; Button7: TButton; Button8: TButton; BitBtn1: TBitBtn; procedure Button1Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject);54

procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure BitBtn1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1 :TForm1; Stream :TMemoryStream; implementation {$R *.DFM} //---------------------------------------------------------// Rutinele care urmeaza sunt scrise utilizand // maniera Delphi de tratare a exceptiilor //---------------------------------------------------------function CharFromString(sVal: string; iPos: integer): char; begin if iPos > Length(sVal) then Raise Exception.Create('Out of Range'); result := sVal[iPos] end; procedure InsertChar(cVal: char; var sVal: string; iPos: integer); begin if iPos > Length(sVal) then Raise Exception.Create('Out of Range'); sVal[iPos] := cVal; end; procedure UseFunctions; var cVal: char; sStrVal: string; begin try sStrVal := 'Delphi Rock '; cVal := CharFromString(sStrVal,13); if cVal 's' then InsertChar('s',sStrVal,12); ShowMessage(sStrVal); except55

exit; end; end; procedure TForm1.Button1Click(Sender: TObject); begin UseFunctions; end; //---------------------------------------------------------// Aceste rutine rezolva aceleasi probleme ca // mai sus intr-un stil de programare defensiv // clasic. //---------------------------------------------------------function CharFromString(sVal: string; iPos: integer): char; begin Result := #0; if iPos