Sunteți pe pagina 1din 16

Programarea vizuala in mediul Delphi

Firma Borland a lansat pe piata versiunea cu numarul 12 a cunoscutului mediu integrat de


dezvoltare Delphi. Aceasta noua versiune aduce cu sine o serie de noi facilitati asteptate
de impatimitii acestui mediu de programare, optiuni care fara indoiala ii vor incanta si pe
noii veniti pe taramul programarii in Delphi.

De la Pascal la Delphi

Limbajul Pascal este un limbaj de nivel înalt care isi are originea undeva pe la
începutul anilor '70. Atunci când a purces la conceperea sa, Niklaus Wirth, profesor la
Institutul Federal de Tehnologie - Eidgenössische Technische Hochschule (ETH) Zurich a
avut in vedere, in principal urmatorul aspect: noul limbaj trebuia sa reflecte in mod clar si
natural o serie de concepte de baza care sa permita utilizarea sa in scopuri didactice.
Aspectul didactic este reflectat si de faptul ca Pascalul este si cel mai apropiat limbaj de
pseudocod. Niklaus Wirth si-a denumit limbajul în memoria marelui carturar francez
Blaise Pascal.

In anul 1974 Niklaus Wirth va publica "Pascal - Manualul utilizatorului si raportul


revizuit", material ce era constituit din doua parti, prima fiind destinata acelora care
doreau sa se familiarizeze cu noul limbaj de programare, in timp ce a doua parte era axata
pe definirea limbajului Pascal standard care va sta, de altfel, la baza principalelor
implementari ulterioare.

Aproape zece ani mai târziu, la mijlocul anilor '80, Anders Hejlsberg avea sa scrie
prima versiune a compilatorului Turbo Pascal. Acest compilator a fost lansat pe piata
software-ului de dezvoltare de o mica firma numita initial MIT iar apoi Borland, si avea
sa devina cel mai faimos compilator de Pascal. Aparitia lui Turbo Pascal a fost principalul
factor care a determinat si o crestere imediata a popularitatii limbajului Pascal pentru
platformele PC, aflate si ele la inceput, in acea vreme.

Tot Turbo Pascal a fost cel care a introdus pentru prima oara notiunea de mediu
integrat de dezvoltare - Integrated Development Environment (IDE). Astfel,
programatorii de Pascal aveau posibilitatea editarii codului sursa, rularii programului si
dupa caz a depanarii acestuia, si toate acestea in cadrul unuia si aceluiasi program,
denumit mediu integrat de dezvoltare.

1
De-a lungul anilor ce au urmat, cercetatorii de la Borland au perfectionat continuu atât
limbajul Pascal cat si mediul de dezvoltare pe care il promovau, fiind practic singurii care
au furnizat un compilator de Pascal pentru calculatoare compatibile IBM PC.
Printre extensiile cele mai notabile ale limbajului Pascal, introduse de firma Borland se
numara si introducerea, inca de la versiunea 6.0 a compilatorului Turbo Pascal, a
suportului pentru programarea orientata obiect. Astfel a aparut Object Pascal.
Dupa alti zece ani, mai exact in 1995, cercetatoriii de la Borland vor scoate prima
versiune de Delphi, moment ce va marca trecerea la programarea vizuala in Pascal.
Delphi 1.0 a fost prima unealta de dezvoltare pentru Windows care a combinat un mediu
vizual de dezvoltare cu un compilator nativ optimizat si un acces facil la un motor de
baze de date. Astfel a fost introdusa o noua sintagma: Rapid Application Development
(RAD).

Mediul integrat de dezvoltare (Integrated Development Environment- IDE)


Delphi

Daca s-ar pune problema unei definitii pentru ceea ce este Delphi probabil ca ea
ar trebui sa sune cam asa: Delphi este un RAD si in acelasi timp un mediu de dezvoltare a
aplicatiilor orientate pe baze de date pentru sisteme de operare Microsoft Windows.
Delphi combina usurinta utilizarii unui mediu vizual de dezvoltare, viteza unui
compilator pe 32 de biti optimizat si accesul la un motor de baze de date. Fiecare dintre
aceste trei componente primare sunt atinse si de o serie de alte medii de dezvoltare, insa
Delphi este unic tocmai prin aceea ca imbina in mod armonios toate aceste trei tehnologii
intr-un singur mediu de dezvoltare. IDE-ul Delphi este, prin excelenta, un mediu de
dezvoltare vizual.

Pana acum a vorbit despre Delphi ca fiind un mediu de dezvoltare, ar trebui totusi
amintit faptul ca este vorba despre o familie de medii Delphi, care numara nu mai putin
de patru membri, si anume: Delphi Standard, Delphi Professional, Delphi Client/Server si
Delphi Enterprise. Este evident ca fiecare dintre aceste versiuni este destinata altei
categorii de dezvoltatori de aplicatii, fiecare varianta inferioara fiind continuta integral in
varianta imediat superioara.

In continuare sa vedem o scurta trecere in revista a destinatiilor fiecareia dintre variantele


mentionate.
o Varianta Standard este nivelul cel mai de jos si contine in principal tot ce este
necesar celor care se afla la primele contacte cu Delphi. Este ideala pentru
începatori, pretul unei astfel de versiuni fiind pe masura.

2
o Varianta Professional este destinata deja dezvoltatorilor profesionisti, dar numai
acelora care nu au nevoie de functionalitatile client/server.
o Varianta Client/Server este destinata dezvoltatorilor de aplicatii mari cu acces la
baze de date client/server si/sau Internet.
o In fine, varianta Enterprise a fost conceputa pentru dezvoltarea de aplicatii
multinivel, pentru corporatiile mari.

Revenind la nucleul comun a tuturor celor patru variante ar mai fi de precizat


punctele forte ale componentelor principale ale mediului de dezvoltare Delphi.
o mediu de dezvoltare vizual; Aplicatiile pot fi create in mod interactiv selectând
componente din cadrul unei palete de componente. Important este insa faptul ca
Delphi genereaza automat codul aferent componentelor utilizate. Aceasta maniera
de programare este utilizata si de Microsoft Visual Basic, insa in Delphi exista
posibilitatea utilizarii tehnicilor de programare orientata obiect in sensul extinderii
oricarei componente existente pentru a raspunde diverselor necesitati noi aparute.
o compilator pentru cod pe 32 de biti optimizat; Unul dintre elementele traditionale
care deosebeste Delphi de celelalte medii de dezvoltare vizuale este prezenta unui
compilator nativ care genereaza rapid un cod eficient. Compilatorul mai
furnizeaza suport pentru a ajuta programatorul in scrierea unui cod curat, afiseaza
mesaje de atentionare care permit înlaturarea unor eventuale greseli, si furnizeaza
toate erorile depistate, permitandu-se astfel corectarea mai multor erori la un sigur
pas de compilare.
o acces facil la baze de date; Delphi este un mediu ideal pentru a proiecta aplicatii
client de baze de date care pot comunica cu o intreaga varietate de baze de date
atat locale cat si aflate la distanta.

Puterea mediului Delphi isi are originea si in limbajul Delphi, limbaj de programare care
sta la baza sa, si care este o versiune orienta obiect a limbajului Pascal. Cercetatoriii de la
Borland il denumesc Object Pascal. Acest Object Pascal dispune insa si de o serie de
imbunatatiri aditionale cum ar fi: tratarea erorilor (se furnizeaza suport pentru detectarea
si tratarea erorilor in timpul executiei), posibilitatea de determinare a tipului unei
variabile la momentul rularii si nu la cel al compilarii, utilizarea sirurilor de caractere de
lungime nelimitata, tipuri noi de date (cum ar fi Currency si Variant), etc. De asemenea
exista o ierarhie de clase denumita Visual Component Library, similara altor ierarhii de
clase cum ar fi Web Ontology Language (OWL) sau Microsoft Foundation Class (MFC).

În cele mai multe cazuri introducerile în cadrul unui limbaj de programare fac apel,
pentru început, la prezentarea unei aplicatii care nu face altceva decât afiseaza pe ecran o
ferestra principala a aplicatiei. Pentru aceasta este suficient sa pornim mediul de
dezvoltare si apoi sa apasam butonul Run din cadrul toolbar-ului (icon-ul asociat acestui

3
buton este cel de play). Ceea ce se obtine este chiar executia unei aplicatii care nu face
nimic.
Da, dar programul în cauza nu face nimic în mod aparent, el fiind totusi capabil sa
realizeze o serie de operatii, dintre care prima vizibila ar fi afisarea unei ferestre
principale a aplicatiei. De asemenea aceasta fereastra poate fi minimizata, maximizata,
mutata, redimensionata si închisa, aceasta ultima operatie având ca efect si încheierea
executiei programului, si toate acestea fara ca sa fi scris macar un rând de cod.

Interfata cu utilizatorul a IDE-ului Delphi

Înainte de a trece mai departe este necesara o prezentare, fie ea si sumara, a


principalelor elemente ce constituie interfata IDE-ului Delphi. Dupa cum era de asteptat
si în aceasta privinta mediul de dezvoltare promovat de cercetatorii de la Borland este
diferit de celelalte IDE-uri prezente pe piata. Daca majoritate covârsitoare a aplicatiilor
sunt bazate pe o fereastra principala a aplicatiei ce contine un meniu, unul sau mai multe
toolbar-uri si alte ferestre incluse ferestrei principale, Delphi vine cu o noua abordare
bazata pe o fereastra principala (ce contine meniul si toolbar-urile) si o serie de ferestre
relativ independente de aceasta fereastra principala.
Dupa cum se poate vedea si din cadrul figurii de mai jos, IDE-ul Delphi este format
din patru parti principale, si anume: fereastra principala, Object Inspector, Form Designer
si editorul de cod.
o Fereastra principala; Este amplasata, de regula, în partea superioara a ecranului
si contine la rândul sau meniul, toolbar-urile si paleta de componente.

4
Toolbar-ul furnizeaza accesul printr-un singur click la principalele optiuni din
cadrul meniului, iar în ceea ce priveste paleta de componente, aceasta contine o
serie de controale grupate dupa functionalitati.

o Object Inspector-ul; Este amplasat, de regula, sub fereastra principala, în partea


stânga a ecranului si este format din doua pagini: una pentru editarea
proprietatilor componentelor iar cealalta pentru accesul la evenimentele acestora.
Proprietatile si evenimentele afisate în cadrul Object Inspector-ului corespund
componentei curente selectate din cadrul Form Designer-ului.
o Form Designer-ul; Este amplasat, de regula, sub fereastra principala, la dreapta
Object Inspector-ului, si are ca principal scop asistarea programatorului în
realizarea interfetei cu utilizatorul. Proiectarea unei ferestre a aplicatiei are loc
prin selectarea componentelor din cadrul paletei de componente si "tragerea" lor
pe suprafata Form Designer-ului.
o Editorul de cod; Este amplasat, de regula, în aceeasi zona cu Form Designer-ul si
este alcatuit dintr-o zona de editare a codului sursa propriu-zisa si o zona
denumita Code Explorer (numai de la versiunea 4 în sus). Zona de editare a
codului poseda o pagina pentru fiecare modul al aplicatiei, iar Code Explorer-ul
prezinta o viziune arborescenta asupra modulelor si datelor acesteia.

Dezvoltarea de aplicatii în Delphi are la baza notiunea de forma, care nu este altceva
decât o fereastra. Dintre multimea formelor (ferestrelor) pe care le poate avea o
aplicatie una se distinge în mod mai deosebit, si anume forma principala sau fereastra
principala a aplicatiei. Aceasta fereastra se diferentiaza de celelalte prin faptul ca este
afisata la rularea programului înainte de a se da controlul utilizatorului. Forma
principala este automat creata de mediul Delphi la momentul crearii unui nou
program.

Pentru afisarea unui text (de exemplu mesajul "Hello !") în cadrul unei forme
se poate folosi atât controlul Label, cât si controlul StaticText. Pentru început, putem
spune ca diferenta între cele doua este ca primul control afiseaza doar texte pe un
singur rând, în timp ce cel de al doilea control poate afisa si texte multirând. În cazul
de fata, ca de altfel si în majoritatea situatiilor viitoare, vom utiliza un control de tip
Label.

Vom selecta din cadrul paletei de componente, acel control de pe paleta


Standard care are drept icon un "A", iar apoi vom face un click cu butonul stâng al
mouse-ului în acel loc de pe forma principala în care dorim sa apara textul în cauza.
Ar mai fi de mentionat ca stationarea mouse-ului o secunda sau doua deasupra

5
oricarui control (componenta) din cadrul paletei de componente are ca efect afisarea
unui mesaj informativ cu privire la denumirea componentei respective. Astfel în cazul
nostru mesajul informativ va fi "Label".

În acest moment avem deja un mesaj afisat în cadrul ferestrei principale, unicul
inconvenient fiind acela ca acest mesaj nu contine textul dorit ci un text adaugat
implicit de mediul Delphi, si anume "Label1". Pentru a schimba textul afisat de
controlul Label vom modifica valoarea proprietatii Caption utilizând Object
Inspector-ul. Apasarea butonului de Run din cadrul toolbar-ului va avea ca efect
executia programului ce afiseaza pe ecran mesajul "Hello !".

Structura programelor Delphi

Am vazut cum se poate scrie un prim program fara a scrie însa nici macar un rând
de cod. Acum vom încerca sa întelegem ce se întâmpla de fapt în "spatele scenei". Daca
noi nu am scris codul trebuie sa-l fi scris cineva! Delphi a fost cel care a facut-o în locul
nostru. Altfel spus, mediul Delphi este înzestrat si cu un generator de cod sursa. În
principal, acest generator de cod se limiteaza numai la generarea automata a elementelor
legate de structura unui program si de partea de interfata a acestuia.

Generarea automata a codului


Generatorul de cod îsi face simtita prezenta înca de la intrarea în mediul Delphi.
Dupa pornirea mediului de dezvoltare, se genereaza în mod automat un nou proiect.
Acelasi lucru se întâmpla si daca se selectioneaza din meniul principal optiunile File |
New Application. Spre deosebire de Pascal, în Delphi, orice program va avea asociat un
proiect.
O prima parte a codului generat automat, si anume codul aferent formei principale,
poate fi vizualizat în cadrul editorului de cod. Am spus o prima parte pentru ca mai exista
înca câteva linii de cod, aferente programului principal, care pot fi vizualizate alegând din
cadrul meniului Project | View Source.
Din cele prezentate pâna acum rezulta ca Delphi genereaza la momentul crearii
unui nou proiect doua fisiere ce contin cod sursa: unul asociat programului principal
(Project1.dpr) si unul asociat formei principale a aplicatiei (Unit1.pas). Pe lânga aceste
doua fisiere mai este generat si un al 3-lea (Unit1.dfm), atasat si el formei principale,
forma ce poate fi vizualizata în Form Designer. De aceasta data este însa vorba de un
fisier binar. În continuare vom trata mai pe larg toate aceste fisiere.
Dupa cum am mai mentionat Delphi este un mediu de dezvoltare orientat pe forme
(ferestre). Fiecare astfel de forma are asociate doua fisiere si anume: unul cu extensia
(.PAS), care contine codul sursa Pascal aferent formei în cauza, si unul de extensie
(.DFM), care contine informatiile cu privire la obiectele, vizuale sau nu, care se gasesc în

6
cadrul ferestrei. Pe masura ce forma este dezvoltata prin înzestrarea cu diferite
componente are loc si modificarea celor doua fisiere atasate formei. În cazul crearii unui
nou proiect cele doua fisiere atasate formei principale a aplicatiei sunt: Unit1.pas si
Unit1.dfm.

Fisierele Unit1.pas si Unit1.dfm

Fisierul Unit1.pas contine cod sursa Pascal, amanunt tradat, de altfel, si de extensia
(.PAS) pe care o are. O forma primara a acestui fisier este prezentata in continuare.

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.

Structura generala a unui unit

Fisierul Unit1.pas fiind înainte de toate un modul (unitate de program) Pascal,


respecta structura generala a unui modul, structura ce va fi conturata în continuare.
o Prima parte a structurii unui modul este declaratia de nume a modulului. În cazul
nostru este: unit Unit1, unde Unit1 este numele modulului. Ar mai fi de mentionat
ca este obligatoriu ca numele modulului sa fie identic cu numele fisierului în care
este stocat.
o Urmeaza partea de interfata delimitata superior de cuvântul rezervat interface. În
aceasta zona sunt declarate tipurile de date, constantele, variabilele, procedurile si
functiile care sunt exportate de catre modul, adica ceea ce furnizeaza modulul în

7
cauza, altor module care fac apel la el. Tot în partea de interfata, prin clauza uses
sunt declarate si eventualele alte module utilizate în partea de interfata a
modulului curent.
o Structura generala a unui unit continua cu sectiunea principala delimitata superior
prin cuvântul rezervat implementation.

Revenind de la scurta paranteza a structurii generale a unui modul, sa punctam înca


câteva elemente de interes prezente în cadrul codului.
o Orice forma este un obiect descendent din clasa TForm. Identificatorii de obiecte
se prefixeaza de regula, pentru a fi usor de recunoscut, cu litera "T".
o Comentariile se introduc între paranteze acolade ( { comentariu multirând } ).
Acest tip de comentariu este utilizat de regula pentru comentariile multirând.
Pentru comentariile de sfârsit de rând se utilizeaza marcatorul specific limbajului
C++ "//" ( // comentariu la sfârsit de rând).
o O paranteza acolada deschisa "{" urmata de un caracter dollar "$" nu reprezinta
un comentariu ci o directiva de compilare specifica Pascalului. În cazul de fata,
directiva $R este utilizata pentru a încarca un fisier de resurse extern. Concret,
linkeditorul este anuntat ca fisierul de resurse asociat ce urmeaza sa fie legat la
executabil are acelasi nume ("*") si extensia (.DFM).

Fisierul Unit1.dfm contine reprezentarea binara a formei Unit1, creata cu Form Designer-
ul, iar extensia (.DFM) nu reprezinta altceva decât o abreviere de la Delphi Form.
Modificarea continutului acestui fisier se face, de regula, ca urmare a modificarilor aduse
formei asociate prin intermediul Form Designer-ului sau a Object Inspector-ului.
Doritorii însa au si posibilitatea editarii directe a acestui fisier, facilitate pusa la dispozitie
de cercetatorii de la Borland, prin intermediul optiunii View as Text. În pofida denumirii
(View) este posibila chiar editarea, aceasta solutie fiind utila când se doreste modificarea
rapida a mai multor atribute distincte. Aceasta optiune o veti gasi în meniul contextual al
oricarei forme.

În cazul nostru ce vom obtine este:

object Form1: TForm1


Left = 192
Top = 107
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace

8
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
end
Spre exemplu, pentru a vizualiza rapid cum influenteaza modificarea valorilor
diferitelor atribute aspectul formei, se poate schimba valoarea atributului Color din
clBtnFace în clRed, ceea ce va avea ca efect modificarea culorii formei în rosu. De
asemenea se poate modifica valoarea atributelor Left, Top, Width sau Height, modificari
ce vor avea ca efect schimbarea pozitionarii formei si/sau schimbarea dimensiunii
acesteia.

Fisierul Project1.dpr

Acest fisier nu este altceva decât un fisier Pascal standard cu o extensie mai
ciudata, care provine de altfel de la Delphi Project. În el se gaseste ceea ce în Pascalul
clasic se cheama programul principal. Spre deosebire însa de Pascal în care de regula
întregul program se dezvolta în acest fisier, în Delphi acest fisier este destul de scurt si nu
este modificat manual decât în cazuri destul de rare. Dupa crearea unui nou proiect
fisierul Project1.dpr va contine urmatoarele rânduri.

program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

Pe masura ce sunt adaugate noi forme aplicatiei, ele vor aparea listate în clauza
uses a programului principal. În cazul nostru avem o singura forma, si anume, forma

9
Unit1. Este de remarcat faptul ca pentru o identificare facila a modulului în care se afla o
anumita forma numele acesteia este afisat drept comentariu ( { Form1 } ).
Directiva {$R *.RES} specifica fisierul de resurse care va fi utilizat, în speta un
fisier cu acelasi nume cu programul principal, dar cu extensia (.RES). Printre altele în
acest fisier este tinuta si icoana aplicatiei. Mediul Delphi asociaza în mod implicit o
icoana standard, care însa se poate înlocui cu o alta icoana semnificativa pentru aplicatia
in cauza.

În cadrul sectiunii principale se gasesc trei apeluri de metode ale obiectului Application.
Acest obiect este o instanta a clasei TApplication, definita în cadrul unitului Forms
(invocat si el în cadrul clauzei uses). Atât numele obiectului cât si numele metodelor
invocate sunt mai mult decât sugestive si mai necesita o explicatie suplimentara.
Este bine de retinut faptul ca fiecare forma are în mod obligatoriu un unit asociat
în cadrul caruia se gaseste codul sursa asociat formei în cauza. Deci orice forma are un
unit. Reciproca însa nu este adevarata existând si cazuri în care avem de a face cu unituri
care nu au asociata nicio forma. Spre exemplu o librarie de functii utile pentru lucrul cu
siruri de caractere poate fi conceputa sub forma unui unit.
În Delphi spre deosebire de Pascal se lucreaza mult cu unit-uri, fie ele asociate sau
nu unor forme, fiind rare cazurile în care se editeaza codul aferent programului principal,
cod stocat în cadrul fisierului de extensie (.DPR).

Delphi, mediu de dezvoltare orientat-obiect.


Clase, obiecte si componente

10
Introducere

În continuare vom prezenta o scurta introducere în domeniul programarii orientate-


obiect (POO), urmând sa abordam pe larg implementarea elementelor prezentate în
Delphi. Aceasta introducere are ca scop mai mult reamintirea conceptelor de orientare-
obiect si nu se doreste nici pe de parte a fi o prezentare riguroasa a acestui domeniu.
Aparitia POO nu a condus în mod neaparat la simplificarea scrierii codului sursa,
însa cu siguranta a contribuit semnificativ la usurarea procesului de întretinere a acestuia.
De asemenea, prin legarea datelor de codul care le prelucreaza se simplifica si procesul
de depanare si depistare a erorilor, precum si eliminarea acestora prin interventia, în cea
mai mare masura, doar la nivelul obiectului în cauza.
În mod traditional, pentru a putea considera un limbaj ca fiind orientat-obiect este
necesar ca acesta sa implementeze cel putin urmatoarele trei concepte ale POO:
 încapsularea - acest termen se refera la ascunderea detaliilor de implementare a
unui obiect; principalele avantaje ale încapsularii ar fi modularitatea si izolarea
unor portiuni de cod, aferente obiectului, de restul codului;
 mostenirea - se refera la posibilitatea de a crea noi obiecte care sa pastreze
proprietatile si functionalitatea obiectului parinte; astfel pot fi create ierarhii de
clase sau obiecte precum VCL-ul; mai întâi se creeaza obiecte generice, iar apoi
se creeaza, prin mostenire, obiecte mult mai specifice, descendente ale celor dintâi
si care au o functionalitate sporita; partajarea codului comun al unor obiecte de tip
parinte si fiu poate fi considerat drept principalul avantaj al mostenirii.
 polimorfismul - se refera la faptul ca apelul unei metode aferente unei variabile de
tip obiect va avea ca efect executia codului asociat instantei în care se afla
obiectul; pentru a întelege mai bine în ceea ce consta polimorfismul sa
consideram urmatorul exemplu: fie un obiect parinte denumit poligon ce are
definita o metoda abstracta deseneaza si doua obiecte derivate triunghi si patrat,
care redefinesc metoda deseneaza în scopul afisarii poligonului asociat; în cazul
în care se defineste o variabila obiect de tip poligon, apelul metodei deseneaza va
avea drept efect apelul metodei deseneaza a obiectului ce a fost atribuit variabilei
(triunghi sau patrat, dupa caz).

Înainte de a trece mai departe la prezentarea notiunilor de clasa si obiect în Delphi


ar mai trebui facute câteva precizari cu privire la urmatorii trei termeni:
 câmpul - reprezinta o variabila continuta în cadrul obiectului si este similar cu
acelasi termen folosit cu privire la înregistrari (record);

11
 metoda - este un nume generic pentru procedurile si functiile ce apartin unui
obiect;
 proprietatea - este un tip de câmp mai special care este utilizat pentru a furniza
acces la detaliile de implementare ale unui obiect; proprietatile sunt asociate
câmpurilor, modificarea valorii unei proprietati având ca efect modificarea valorii
câmpului asociat;

În general, în cadrul POO nu este de preferat accesul direct la câmpurile unui


obiect si aceasta pentru ca detaliile de implementare se pot schimba, fara ca interfata
obiectului sa fie modificata.

Lucrul cu obiecte în Delphi

Dupa cum am declarat si mai devreme obiectele (sau clasele) sunt niste entitati care
combina datele cu partea de cod, mediul de dezvoltare Delphi fiind un adevarat mediu de
dezvoltare orientat-obiect ofera suport integral pentru încapsulare, mostenire si
polimorfism.
Spre deosebire de C++, Delphi nu suporta mostenire multipla. Acest aspect nu
poate fi considerat ca fiind unul negativ deoarece acest concept este destul de
controversat, existând pareri atât pro cât si contra. Mostenirea multipla se refera la
posibilitatea de a deriva un obiect din doua sau mai multe obiecte separate.
Object Pascal dispune de doua posibilitati diferite de evitare a mostenirii multiple.
Prima, si cea mai simpla solutie este includerea unui clase într-o alta clasa, se va include
un câmp de tipul clasei parinte, care se doreste a fi mostenita. Aceasta solutie este larg
utilizata si la nivelul ierarhiei de clase VCL.
Cea de a doua solutie este mai complicata si se bazeaza pe termenul de interfete
(interfaces). Astfel se pot obtine obiecte care sa suporte mai multe interfete.

Declararea si instantierea

Dupa cum era si de asteptat, ca orice tip de data si obiectele trebuie declarate
înaintea folosirii lor. Acest lucru se realizeaza prin intermediul cuvântului rezervat class.
Declararea se face în sectiunea type a unui unit sau program, dupa cum urmeaza:

type
TPoligon = class (TPoligon)

De asemenea, trebuie declarata o variabila (sau instanta) a respectivului obiect, în cadrul


sectiunii var.

12
var
Poligon: TPoligon;

Pentru a crea o instanta a unui obiect este necesara apelarea unuia dintre
constructorii obiectului. Constructorul este responsabil cu crearea instantei unui obiect
prin alocarea memoriei necesare si initializarea câmpurilor astfel încât obiectul sa fie
utilizabil imediat dupa momentul terminarii executiei codului aferent constructorului.

În Delphi obiectele au cel putin un constructor denumit Create(). Spre deosebire


de C++, în Object Pascal apelul unui constructor nu se realizeaza în mod automat, apelul
acestuia ramânând în seama programatorului. Sintaxa pentru apelarea unui constructor
este urmatoarea:

Poligon := TPoligon.Create;

Trebuie mentionat faptul ca dupa apelul constructorului unui obiect, compilatorul


garanteaza initializarea tuturor câmpurilor obiectului. Astfel toate numerele vor fi
initializate cu 0, toti pointerii vor fi initializati cu Nil si toate sirurile de caractere vor fi
goale.

Dealocarea (distrugerea) obiectelor

Dupa terminarea utilizarii unui obiect este necesara dealocarea instantei în cauza
prin apelarea metodei Free(). Aceasta metoda se asigura mai întâi daca nu cumva instanta
obiectului este Nil, iar în caz contrar apeleaza destructorul Destroy(). Dupa cum îi spune
si numele, destructorul realizeaza operatiile inverse constructorului, cum ar fi dealocarea
memoriei alocate sau alte operatii necesare stergerii instantei obiectului din memorie.
Sintaxa apelului pentru dealocarea unui obiect este:

Poligon := TPoligon.Free;

Trebuie retinut faptul ca niciodata nu trebuie apelat direct destructorul Destroy();


utilizarea metodei Free() fiind mult mai sigura.
Destructorul oricarui obiect alocat dinamic trebuie apelat explicit. În cazul limbajului
Object Pascal regula prezentata mai devreme se pastreaza, cu singura mentiune ca toate
obiectele sunt implicit alocate dinamic, fiind astfel necesara urmarea regulii ca orice a
fost alocat (creat) trebuie sa fie si dealocat (eliberat).

13
Metode
Metodele nu sunt altceva decât proceduri sau functii ce apartin unui anume obiect.
Ele sunt cele care deosebesc un obiect de o înregistrare (record). Practic, un obiect este o
structura de tip înregistrare care are însa atasate si metodele de prelucrare si operare
asupra datelor stocate la nivelul structurii înregistrarii.
Doua metode importante ale oricarui obiect sunt chiar constructorul si destructorul
despre care am discutat deja. Pe lânga acestea se pot crea o serie de metode care pot
realiza cele mai variate operatii asupra datelor obiectului.
Crearea unei metode este o activitate care se realizeaza în doi pasi, si anume: mai
întâi se declara metoda în cadrul zonei de declarare a obiectului, iar apoi se trece la
declararea metodei în cadrul codului. Pentru clarificare, în continuare, vom prezenta un
exemplu de declarare si definire a unei metode.

type
TPoligon = class
x, y: Integer;
procedure Mutare(ax, ay: Integer);
end;
...
procedure TPoligon.Mutare;
begin
// corpul metodei Mutare a obiectului TPoligon
x := ax;
y := ay;
...
end;

Trebuie retinut faptul ca spre deosebire de momentul declararii metodei când este
suficient doar numele ei (Mutare), la momentul definirii trebuie mentionat si numele
obiectului din cadrul carei face parte (TPoligon.Mutare). De asemenea, se observa ca la
momentul declararii s-au precizat atât parametrii cât si tipul acestora, asta bineînteles,
numai în cazul în care metoda are parametri. În ceea ce priveste momentul definirii
metodei mentionarea parametrilor poate fi omisa, asa cum a fost si în cazul de fata, însa
daca se opteaza pentru declararea parametrilor si la definirea metodei este absolut necesar
ca aceasta sa coincida cu cea de la declararea metodei.
În alta ordine de idei mai trebuie notat si faptul ca câmpurile x si y ale obiectului
pot fi accesate în mod direct în cadrul metodei acestuia.

14
Tipuri de metode

Metodele obiectelor pot fi declarate ca fiind de unul din urmatoarele tipuri: static,
virtual, dynamic sau message. În continuare vom considera un scurt exemplu pentru a
putea comenta pe marginea lui fiecare din aceste patru tipuri de declaratii. Numele
fiecarei metode a fost ales în mod sugestiv pentru sugera tipul de declaratie caruia
apartine metoda.

type
TPoligon = class(TPoligon)
procedure MetodaDeTipStatic;
procedure MetodaDeTipVirtual; virtual;
procedure MetodaDeTipDynamic; dynamic;
procedure MetodaDeTipMessage(var M: TMessage); message wmMesaj;
end;
 metoda de tip static - este tipul implicit de metoda si functioneaza în mod similar
cu un apel obisnuit de procedura sau functie. Compilatorul cunoaste adresa
metodei, si astfel, pentru apelurile metodelor statice, este capabil sa lege aceasta
informatie în cadrul executabilului, în mod static. Ca urmare a acestui fapt, apelul
metodelor statice se executa cel mai rapid, însa apare dezavantajul ca acest tip de
metode nu pot fi suprascrise (overridden) pentru a oferi posibilitatile
polimorfismului.
 metoda de tip virtual - este apelata în acelasi mod ca si cea statica, dar ca urmare a
faptului ca acest tip de metode pot fi suprascrise, compilatorul nu are cum sa
cunoasca adresa unei anume functii virtuale, atunci când aceasta este apelata în
cadrul unei secvente de cod. Pentru a rezolva problema, compilatorul construieste
o tabela a metodelor virtuale (Virtual Method Table - VMT) care ofera regasirea
adreselor functiilor în momentul executiei programului. Toate apelurile de functii
si metode virtuale sunt gestionate la momentul executiei prin intermediul tabelei
mentionate anterior (VMT). Tabela VMT a unui obiect contine atât toate metodele
virtuale a tuturor claselor parinte, cât si propriile metode virtuale. Astfel metodele
virtuale utilizeaza mai multa memorie decât cel dinamice, pe care le vom discuta
în continuare, dar au avantajul ca se executa mai rapid decât acestea din urma.
 metoda de tip dynamic - este practic o metoda virtuala, care dispune însa de un
sistem diferit de gestiune a apelurilor. Compilatorul asociaza un numar unic
fiecarei metode virtuale si utilizeaza aceste numere împreuna cu adresele
metodelor pentru a crea o tabela de metode dinamice (Dynamic Method Table -

15
DMT). Spre deosebire de VMT, tabela DMT a unui obiect contine doar metodele
dinamice pe care le declara si legaturi catre tabelele DMT ale claselor parinte.
Astfel, metodele dinamice sunt mai putin consumatoare de memorie, tributul
platit pentru aceasta fiind o crestere a duratei de apel ca urmare a faptului ca
cererea trebuie sa se propage prin tabelele DMT ale claselor parinte pentru
determinarea adresei unei anumite metode virtuale.
 metoda de tip message - se doreste a fi o metoda de gestiune a unui anumit
eveniment (mesaj). Valoarea de dupa cuvântul rezervat message specifica mesajul
la care programul va raspunde prin executia metodei în cauza. Metodele de tip
mesaj sunt utilizate în mod exclusiv pentru a raspunde în mod automat la mesajele
sistemului de operare Windows. În mod normal nu se realizeaza în mod explicit
apeluri ale acestor metode.

Mediul integrat de dezvoltare (Integrated Development Environment- IDE)


Delphi

Interfata cu utilizatorul a IDE-ului Delphi


Generarea automata a codului
Fisierele Unit1.pas si Unit1.dfm
Structura generala a unui unit
Fisierul Project1.dpr
Lucrul cu obiecte în Delphi
Declararea si instantierea
Dealocarea (distrugerea) obiectelor
Metode. Tipuri de metode

16

S-ar putea să vă placă și