Programarea vizuala in mediul Delphi



Yüklə 67.35 Kb.
tarix12.09.2018
ölçüsü67.35 Kb.

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.

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.

  • 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.

  • Varianta Professional este destinata deja dezvoltatorilor profesionisti, dar numai acelora care nu au nevoie de functionalitatile client/server.

  • Varianta Client/Server este destinata dezvoltatorilor de aplicatii mari cu acces la baze de date client/server si/sau Internet.

  • 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.

  • 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.

  • 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.

  • 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 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.

  • Fereastra principala; Este amplasata, de regula, în partea superioara a ecranului si contine la rândul sau meniul, toolbar-urile si paleta de componente.

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.



  • 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.

  • 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.

  • 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 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 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.



  • 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.

  • 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 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.

  • 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.

  • 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".

  • 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 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

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 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

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);

  • 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.
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).




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.




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 - 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





Dostları ilə paylaş:


Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2017
rəhbərliyinə müraciət

    Ana səhifə