Documente Academic
Documente Profesional
Documente Cultură
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.
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).
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.
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.
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.
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.
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.
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 !".
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.
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.
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.
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.
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.
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).
10
Introducere
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;
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)
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.
Poligon := TPoligon.Create;
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;
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.
16