Creeaza.com - informatii profesionale despre


Simplitatea lucrurilor complicate - Referate profesionale unice
Acasa » scoala » informatica » baze de date
Programarea orientata spre obiecte

Programarea orientata spre obiecte


Programarea orientata spre obiecte

Lumea este dinamica, in continua transformare. Elementele naturii nu pot fi descrise complet printr-o serie de caracteristici, ci este necesara si o descriere a comportarii lor in diferite situatii. Sa luam, de exemplu, o masina, pe care o putem descrie sumar prin culoare, numar de locuri, capacitate cilindrica etc. Dar la ce ne ajuta acest lucru daca nu stim sa o pornim si sa o conducem? Din punct de vedere al programarii orientate spre obiecte (prescurtat POO), masina ar putea reprezenta un obiect, care ar avea in componenta o serie de caracteristici, dar si o serie de proceduri prin care este descrisa functionarea ei, modul ei de utilizare etc.

Un alt exemplu de obiect, des intalnit in lumea calculatoarelor, este fereastra. In acceptiunea, o fereastra este o zona de pe ecran cu anumite proprietati (dimensiune, culoare, continut etc.). Prin comenzi ale limbajului, aceasta fereastra poate fi manipulata, deschisa, afisata, inchisa etc. In POO, o fereastra reprezinta un obiect care are asociate anumite proprietati (sau atribute), dar si anumite proceduri. Acestea din urma sunt executate fie la comanda explicita a utilizatorului, fie la aparitia unor evenimente, cum ar fi, de exemplu, un clic cu mouse-ul in interiorul ferestrei.

Unul dintre principalele elemente noi ale sistemului Visual FoxPro (fata de versiunile anterioare de FoxPro) este introducerea tehnologiei POO, alaturi de varianta clasica de programare (pentru a pastra compatibilitatea cu versiunile anterioare).

POO reprezinta o tehnologie moderna in domeniul programarii calculatoarelor, rezultata din necesitatea realizari unor aplicatiidin ce in ce mai complexe. Programarea clasica, structurata, suferea din punct de vedere al controlului programului de dimensiuni mari, al reutilizarii codului, al adaptarii si al extinderii unor module. Programarea structurata porneste de la celebra ecuatie a lui Niklaus Wirth:



Structuri de date + Algoritmi = Program

POO are la baza conceptul de obiect, care reprezinta un ansamblu de date impreuna cu procedurile de prelucrare a acestor date. Ecuatia care fundamenteaza POO este:

Date + Proceduri = Obiect

Prin programarea orientata spre obiecte nu se pot obtine lucruri ce nu pot fi realizate si prin varianta clasica de programare. Diferenta intre cele doua metode consta in modul de abordare. In timp ce programarea clasica se concentreaza pe prelucrari, cea orientata spre obiecte are ca punct central definirea obiectelor.

De exemplu, definirea si activarea unei ferestre se facea in FoxPro 2.6 (si se poate realiza sin in Visual FoxPro) printr-o secventa de tipul:

DEFINE WINDOW fereastra1;
FROM 0, 0, TO 20, 30;
CLOSE FLOAT GROW MINIMIZE ZOOM SYSTEM;
TITLE "Fereastra definita in mod clasic"
ACTIVATE WINDOW fereastra1

Pentru aceeasi sarcina, in Visual FoxPro se poate folosi (si chiar se recomanda) varianta POO, ca in urmatoarea secventa:

fereastra1 = CreateObject("Form")
fereastra1.Caption = "Fereastra definita in modul POO"
fereastra1.BackColor = 16777215
fereastra1.Show

Chiar daca nu sunt chiar asa de evidente, avantajele POO sunt semnificative. Printre acestea enumeram: reutilizarea mai buna a codului, dezvoltarea mai usoara a aplicatiilor, controlul mai bun al programelor de mari dimensiuni etc. Desi pentru cei familiarizati cu stilul clasic de programare este incomod a trece la POO fara a avea un argument solid in favoarea acestui pas, recomandam totusi adoptarea treptata a acestui mod de programare, deoarece el va domina viitorul (daca nu o face deja cu prezentul).

Obiecte si clase

La baza POO stau conceptul de obiect si cel de clasa.

Un obiect reprezinta un ansamblu de date, impreuna cu procedurile de prelucrare ale acestora. In acest context, procedurile poarta denumirea de metode, iar datele obiectului se numesc proprietati.

Definirea unui obiect se face printr-o "clasa".

Clasa reprezinta definitia, intr-un limbaj de programare, a unui tip de obiecte, adica descrierea proprietatilor si a metodelor componente.

O clasa reprezinta o notiune abstracta, atata timp cat pe baza ei nu se creaza un obiect. Crearea unui obiect presupune specificarea clasei care sta la baza sa, in acest mod identifcandu-se proprietatile obiectului si felul in care acestea sunt modificate, prelucrate.

Exemplu:

Sa luam de exemplu clasa ferestrelor, care ar putea arata schematic astfel:

clasa fereastra

Daca avem o clasa precum cea de sus, nu inseamna ca avem o fereastra, ci doar stim prin ce se caracterizeaza un asemenea element. Pentru a avea efectiv o fereastra, trebuie creat un obiect pe baza clasei respective, printr-o instructiune de tipul:

obiect fereastra = Creaza un obiect pe baza clasei fereastra

Exemplu:

De exemplu, crearea unui obiect de tip fereastra s-ar realiza printr-o instructiune de tipul:

fer = CreateObject("Form")

Visual FoxPro are predefinite o serie de clase, care pot fi folosite la crearea obiectelor standard, cum ar fi ferestre, obiecte de control ale interfetei cu utilizatorul (butoane, liste etc.), meniuri si altele. Astfel, pentru crearea unui element de acest tip, nu mai este necesara definirea clasei respective, ci doar utilizarea ei. Proprietatile obiectelor astfel create pot fi modificate, ceea ce va permite sa realizati propriile dumneavoastra obiecte.

Pe de alta parte, Visual FoxPro permite definirea propriilor dumneavoastra clase, care sa descrie obiectele folosite in programele proprii.

Un exemplu de clasa simpla - lista

Vom incepe prezentarea modului de construire a claselor in limbajul Visual FoxPro printr-un exemplu simplu, o lista de numere. Dupa cum am spus mai devreme, o clasa contine o multime de date si procedurile (metodele) prin care aceste date sunt prelucrate. Lista noastra va contine initial:

un vector a de, sa zicem, 10 elemente, in care vom stoca elementele componente (numerele);

o variabila numita lungime, in care vom memora numarul curent de valori incarcate in lista (maximum 10, datorita dimensiunii vectorului).

Ca metode ale obiectelor de tip lista vom avea:

o         adaug - metoda pentru adaugarea de noi elemente;

o         sterg - metoda pentru eliminarea din lista a ultimului element introdus;

o         afisare - metoda pentru afisarea pe randuri succesive a elementelor listei.

Construirea unei astfel de liste se desfasoara in doua etape:

mai intai se defineste clasa pe baza careia se vor construi viitoarele obiecte de tip lista, folosind instructiunea DEFINE CLASS;

apoi se construieste un obiect pe baza clasei definita anterior, utilizand CreateObject.

Definirea clasei se face printr-o instructiune DEFINE CLASS a carei forma simplificata este:

DEFINE CLASS <nume_clasa> AS custom

<definitiile datelor si metodelor>

ENDDEFINE

Numele noii clase definite va fi <nume_clasa>, iar cuvantul cheie custom indica faptul ca se defineste o clasa a utilizatorului, care nu are clasa parinte (deci, nu are proprietati si metode predefinite).

Exemplu:

Pentru exemplul nostru, definirea clasei c_lista se face prin urmatoarea secventa de instructiuni:

DEFINE CLASS c_lista AS custom
* Proprietati
DIMENSION a(10)
lungime = 0
* Metode
PROCEDURE adaug
PARAMETERS v
IF this.lungime < 10
this.lungime = this.lungime + 1
this.a(this.lungime) = v
ENDIF
ENDPROC
PROCEDURE sterg
IF this.lungime > 0
this.lungime = this.lungime - 1
ENDIF
ENDPROC
PROCEDURE afisare
? 'Elementele listei sunt:'
FOR i = 1 TO this.lungime
? 'A9', i, ')= ', this.a(i)
ENDFOR
ENDPROC
ENDDEFINE

Se poate observa ca vectorul membru al clasei c_lista se defineste prin instructiunea DIMENSION ca si in cazul unui vector independent. La fel si proprietatea lungime, membra a clasei c_lista se defineste printr-o instructiune de atribuire clasica.

Metodele membre ale clasei se definesc prin proceduri. In ceea ce priveste constructia unei proceduri membre a unei clase, se cuvin facute o serie de observatii. Sa luam exemplul metodei adaug al clasei c_lista:

PROCEDURE adaug
PARAMETERS v
IF this.lungime < 10
this.lungime = this.lungime + 1
this.a(this.lungime) = v
ENDIF
ENDPROC

Procedura incepe, evident, cu cuvantul cheie PROCEDURE si se termina cu ENDPROC, ca orice procedura clasica. Intre acestea se introduce corpul procedurii, adica instructiunile componente. Din secventa de mai sus se poate observa ca referirea la data membra lungime a aceeasi clase se face prin constructia this.lungime.

De fapt, sintaxa generala prin care se obtine accesul la datele si metodele membre ale unui obiect sunt:

<obiect> <membru>

Dar, cum in acest caz inca nu s-a definit obiectul lista, ci doar clasa c_lista, referirea la datele si metodele membre ale obiectului se face utilizand cuvantul cheie this (tradus 'aceasta'). Cu alte cuvinte, constructia this.lungime se traduce prin 'proprietatea lungime a acestei clase'.

Pentru a crea un obiect de tip lista, se va folosi instructiunea:

lista = CreateObject("c_lista")

Observatie:

Pentru a testa acest exemplu, este necesara crearea unui fisier program care sa contina instructiunile de mai sus, deoarece instructiunea DEFINE CLASS nu poate fi executat in mod interactiv, in fereastra de comenzi. In fisierul programului, definirea clasei se introduce la sfarsit, deoarece blocul DEFINE CLASS ENDDEFINE este tratat de Visual FoxPro la fel ca procedurile si functiile normale, deci dupa acesta nu se mai pot introduce instructiuni executabile. Prin urmare, continutul programului va arata schematic astfel:

lista = CreateObject("c_lista")
<alte instructiuni ale programului>
DEFINE CLASS c_lista AS custom
<definirea proprietatilor si metodelor clasei>
ENDDEFINE

Desigur ca, pentru cei obisnuiti cu programarea structurata si nefamiliarizati cu programarea orientata spre obiecte, programul de mai sus pare stufos, varianta clasica putand fi mai simpla. Dar, dupa cum am spus mai devreme, avantajele tehnologiei POO apar la aplicatii mai mari. Totusi, chiar si in acest exemplu, o data construita clasa lista, utilizarea ei este foarte simpla.

In acest moment, am creat obiectul lista, pe baza clasei c_lista. Sa vedem acum cum putem folosi acest obiect, cum il putem exploata. Mai intai, trebuie sa adaugam elemente la lista, lucru ce se realizeaza prin apelarea metodei adaug:

lista.adaug(10)
lista.adaug(7)
lista.adaug(25)

Elementele listei pot fi afisate prin utilizarea metodei afisare:

lista.afisare

iar ultimul element din lista poate fi sters prin folosirea metodei sterg:

lista.sterg

Incapsularea

O regula importanta a tehnologiei POO este incapsularea. Conform acesteia, datele membre ale unui obiect pot fi modificate numai prin intermediul metodelor proprii obiectului respectiv.

In acest fel se realizeaza un control strict asupra obiectului, eliminandu-se eventualele surse de erori cauzate de utilizarea necorespunzatoare a acestor proprietati.

Sa analizam din nou exemplul din sectiunea anterioara. Se poate observa ca in clasa lista au fost prevazute procedurile de prelucrare a listelor, adica de adaugare, stergere si afisare. Clasa c_lista ar fi putut contine doar vectorul a pentru memorarea elementelor componente si variabila lungime pentru stocarea lungimii curente a listei. Procedurile de prelucrare ar fi putut fi realizate ca proceduri independente, care sa fi avut ca obiect de prelucrare datele membre ale obiectului lista. Dar, prin astfel s-ar fi incalcat principiul incapsularii datelor. Cu toate acestea, sistemul nu ar fi generat o eroare, deoarece principiul este recomandat, nu impus.

Respectarea principiului incapsularii asigura o independenta sporita a datelor fata de programele de prelucrare. Mai precis, modificarea structurii datelor membre ale unui obiect conduce la modificarea doar a metodelor membre ale obiectului respectiv (care prelucreaza datele modificata), programele care folosesc obiectul respectiv ramanand neschimbate.

Mostenirea

Mostenirea reprezinta o alta facilitate specifica tehnologiei POO, conform careia se poate construi o clasa nou pornind de la o clasa deja existenta. Noua clasa va "mosteni" toate datele si metodele membre ale clasei parinte, la care se vor adauga unele noi, definite explicit in noua clasa.

Sa luam de exemplu clasa c_lista_max, pe care o vom construi pornind de la clasa c_lista. Noua clasa va contine, pe langa datele si metodele clasei parinte (c_lista), o noua data membra, numita max, in care vom memora valoarea maxima din lista, si o noua metoda, numita maxim, care va determina valoarea lui max pe baza valorilor curente ale elementelor listei.

Definirea unei clase pe baza alteia se face folosind o comanda DEFINE CLASS de forma:

DEFINE CLASS <nume_clasa_noua> AS <nume_clasa_parinte>

<definitiile datelor si metodelor subclasei>

ENDDEFINE

unde: <nume_clasa_noua> este numele noii clase, iar <nume_clasa_parinte> este numele clasei de la care noua clasa va mosteni datele si metodele.

Exemplu:

Clasa c_lista_max va fi definita prin urmatoarea secventa de instructiuni:

DEFINE CLASS c_lista_max AS c_lista
max = 0
PROCEDURE maxim
IF this.lungime > 0
this.max = this.a(1)
FOR i = 2 TO this.lungime
IF this.max < this.a(i)
this.max = this.a(i)
ENDIF
NEXT
ELSE
this.max = 0
ENDIF
? 'Valoarea maxima este: ', this.max
ENDPROC
ENDDEFINE

Crearea unui obiect de tip c_lista_max se face printr-o instructiune de forma:

lista = CreateObject("c_;ista_max")

Pentru a testa programul de mai sus, mai intai vom adauga cateva elemente la lista:

lista.adaug(23)
lista.adaug(45)
lista.adaug(8)

Apoi vom determina valoarea maxima prin urmatoarea instructiune:

lista.max

Pe ecran se va afisa valoarea 45, care este cea mai mare valoare in acest caz.

Prin mostenire se creaza, practic, ierarhii de clase, incepand cu cele mai generale si ajungandu-se la cele particulare, adaptate anumitor necesitati, rezolvand o anumita sarcina de prelucrare.

Accesul la membrii unei clase

Uneori, prelucrarea datelor unui obiect (prin metodele acestuia) poate necesita variabile temporare suplimentare, utilizate in diferite operatii interne. Aceste variabile trebuie definite tot ca proprietati ale obiectului (pentru a pastra independenta obiectului fata de exterior), dar nu trebuie puse la dispozitia utilizatorului clasei, deoarece modificarea lor ar putea afecta prelucrarile.

La fel se intampla si cu metodele unui obiect. Pot exista metode care sa fie utilizate intern de celelalte metode ale obiectului, dar care sa nu fie la dispozitia utilizatorului.

Prin urmare, este necesar un mecanism de control al accesului la membrii unei clase, mecanism care sa asigure protectia membrilor la utilizarea clasei de catre utilizator (prin mostenire). Din acest punct de vedere, mebrii unei clase pot fi:

publici - accesibili din interiorul clasei respective (in metodele membre) si din exteriorul acesteia, din domeniul in care clasa este definita;

protejati - accesibili atat in interiorul clasei respective, cat si in interiorul subclaselor cinstruite pe baza acesteia (prin mostenire);

ascunsi - accesibili doar din interiorul clasei respecyive, nu si din exteriorul acesteia sau din clasele derivate din ea.

In mod implicit, proprietatile unei clase sunt publice. Pentru a declara ca fiind protejate (private) o serie de proprietati ale clasei, ele trebuie incluse intr-o declaratie PROTECTED a clasei, ca in schema urmatoare:


DEFINE CLASS

PROTECTED <proprietate1>, <proprietate2>

<definitii ale proprietatilor>

ENDDEFINE

La fel se declara si membrii ascunsi, folosind insa declaratia HIDDEN.

Pentru metodele unei clase, caracteristica de acces trebuie precizata chiar inaintea fiecarei definitii. De exemplu, pentru a declara ca o metoda este protejata, se utilizeaza constructia:

PROTECTED PROCEDURE <nume_procedura>

ENDPROC

Exemplu:

De exemplu, in definitia clasei c_lista, proprietatea lungime ar putea fi declarata ca protejata (PROTECTED), deoarece ea nu trebuie modificata din exterior, ci numai prin intermediul metodelor clasei (principiul incapsularii). Daca proprietatea respectiva ar fi fost declarata ascunsa (HIDDEN), atunci ea nu ar mai fi fost disponibila in clasa c_lista_max, derivata din clasa c_lista.

Folosirea obiectelor ca membri ai unei clase

Pe langa proprietati si metode, o clasa poate avea ca membri si alte obiecte.

Exemplu:

De exemplu, o clasa a facturilor ar putea avea ca membri un obiect de tip client pentru vanzator si unul de tip client pentru cumparator. Aceasta deoarece in orice factura se comploteaza o zona referitoare la cumparator si una referitoare la vanzator.

Includerea unui obiect intr-o clasa se realizeaza cu ajutorul constructiei:

ADD OBJECT [PROTECTED] <nume_obiect> AS <nume_clasa>

Cuvantul cheie PROTECTED este folosit numai cand noul obiect (proprietatile si metodele sale) se doreste a fi protejat, in caz contrar, obiectul este considerat public.

Referirea la proprietatile si metodele obiectului inclus se face, evident, prin precedarea numelor acestora de numele obiectului (separate prin punct):

<nume_obiect_container> <nume_obiect_inclus> <proprietate/metoda>

Utilizarea claselor predefinite

Sistemul Visual FoxPro contine o serie de clase predefinite, care pot fi folosite direct de catre utilizator. De exemplu, pentru crearea unui formular nu trebuie definita intreaga clasa a acestuia, ci trebuie utilizata doar clasa predefinita Form, care contine toate proprietatile si metodele unui formular.

Crearea unui obiect pe baza unei clase predefinite se face cu ajutorul constructiei:

<obiect> = CreareObject(<nume_clasa_predefinita>

deci la fel ca in cazul unei clase a utilizatorului (definita in codul respectiv), exceptand faptul ca nu mai este necesara definitia clasei respective.

Exemplu:

De exemplu, constructia unui formular, direct prin cod, se realizeaza cu o instructiune de forma:

frmFisier = CreateObject("Form")

Tabelul urmator prezinta clasele predefinite din Visual FoxPro, fara a se intra in detaliile de utilizare ale acestora (proprietatile si metodele lor):

Nume clasa

Semnificatie

CheckBox

Caseta de validare

Column

Coloana intr-o grila (obiect tip grid

ComboBox

Caseta combinata (numita si lista derulanta)

CommandButton

Buton de comanda

CommandGroup

Grup de butoane de comanda

Container

Obiect container (poate contine alte obiecte)

Control

Obiect container, fara posibilitatea de acces la obiectele continute

Cursor

Cursor (creat pe baza unei tabele sau vizualizari)

Custom

Clasa utilizata pentru crearea propriilor clase ale utilizatorului

DataEnvironment

Mediul de date (al unui formular, raport etc.)

EditBox

Zona de editare text

Form

Formular

Form

Set de formulare

Grid

Grila (retea)

Header

Antet al unei grile (retele)

Image

Imagine

Label

Eticheta (text informativ)

Line

Linie

ListBox

Lista

OLEControl

Control container de tip OLE

OLEBoundControl

Control container de tip OLE

OptionButton

Buton de optiune (radio)

OptionGroup

Grup de butoane de optiuni (radio)

Page

Pagina unui set de pagini alternative

PageFrame

Set de pagini alternative

Relation

Relatie intre tabele (din mediul de date)

Separator

Separator de bar cu instrumente

Shape

Element semigrafic (chenar, elipsa etc.)

Spinner

Caseta de modificare valorica

TextBox

Caseta de text

Timer

Obiect de tip ceas

Toolbar

Bara cu instrumente

Exemplu:

In cele ce urmeaza, vom discuta un exemplu de construire a unui formular prin cod (nu cu Form Designer), pentru a ilustra modul de utilizare a claselor definite. Mentionam ca acest procedeu nu este recomandat, deoarece sistemul Visual FoxPro pune la dispozitie un instrument special, Form Designer, cu ajutarul caruia se poate crea formular mult mai rapid.

Formularul pe care-l vom construi va avea urmatorul aspect:

 


Programul pentru realizarea acestui formular este:

* In primul rand se creaza obiectul de tip Form
frmTest = CreateObject("formular")
* Se afiseaza formularul realizat
frmTest.Show
* se activeaza procesorul de evenimente
READ EVENTS
* Se defineste clasa formularului ca o subclasa a clasei predefinite Form
DEFINE CLASS formular AS Form
* Proprietatile globale ale formularului
Caption = "Testare"
Height = 150
Width = 370
* Se adauga obiectele de interfata ale formularului
* Se adauga prima eticheta
ADD OBJECT info1 AS Label
* Se adauga caseta de text
ADD OBJECT txtNume AS TextBox
* Se adauga a doua eticheta
ADD OBJECT info2 AS Label
* Se adauga butonul de comanda
ADD OBJECT cmdClose AS CommandButton
* Se stabilesc proprietatile si metodele obiectelor de interfata
* Proprietatile primei etichete
info1.Caption = "Cu va numiti?"
info1.Height = 16
info1.Left = 40
info1.Top = 24
info1.Width = 104
info1.Visible = .T.
* Proprietatile casetei de text
txtNume.Height = 21
txtNume.Left = 144
txtNume.Top = 20
txtNume.Width = 170
txtNume.Visible = .T.
* Proprietatile celei de a doua eticheta
info2.Caption = "Salut"
info2.Alignment = 2
info2.FontSize = 12
info2.Height = 20
info2.Left = 56
info2.Top = 60
info2.Width = 144
info2.Visible = .T.
* Proprietatile butonului de comanda
cmdClose.Caption = "Gata"
cmdClose.Height = 33
cmdClose.Left = 220
cmdClose.Top = 96
cmdClose.Width = 113
cmdClose.Visible = .T.
* Definirea metodelor proprii ale subclasei
PROCEDURE cmdClose.Click
thisform.Release
CANCEL
ENDPROC
PROCEDURE txtNume.Valid
thisform.info2.Caption="Salut, " + ALLTRIM(this.Value)
ENDPROC
ENDDEFINE

Comanda DEFINE CLASS

Creaza o clasa sau subclasa definita de utilizator si specifica proprietatile, evenimentele si metodele clasei sau subclasei respective.

Sintaxa:

DEFINE CLASS nume_clasa AS clasa_parinte [OLEPUBLIC]

[[PROTECTED | HIDDEN Proprietate1 Proprietate

[.Object.]nume_proprietate eExpresie

[ADD OBJECT [PROTECTED] nume_obiect AS nume_clasa2 [NOINIT]

[WITH cListaProprietati

[[PROTECTED | HIDDEN] FUNCTION | PROCEDURE nume_proc[_ACCESS | _ASSIGN]

| THIS_ACCESS [NODEFAULT]

cInstructiuni

[ENDFUNC | ENDPROC]]

ENDDEFINE

Argumente:

nume_clasa1 Specifica numele clasei ce va fi creata.

AS clasa_parinte Specifica clasa parinte pe care este bazata noua clasa sau subclasa. Clasa parinte poate fi o clasa Visual FoxPro de baza, cum ar fi Form sau o alta clasa sau subclasa definita de utilizator.

Tabelul urmator prezinta clasele de baza din Visual FoxPro:

ActiveDoc

DataEnvironment

Line

Shape

CheckBox

EditBox

ListBox

Spinner

Column

Form

OLEControl

TextBox

ComboBox

FormSet

OLEBoundControl

Timer

CommandButton

Grid

OptionButton

ToolBar

CommandGroup

Header

OptionGroup

Container

Hyperlink

Page

Control

Image

PageFrame

Cursor

ProjectHook

Relation

Custom

Label

Separator

O clasa non-vizuala definita de utilizator este creata specificand Custom drept clasa_parinte.

In exemplul urmator, este creata o subclasa numita MyForm, bazata pe clasa de baza Form. Este creata o metoda Click care afiseaza o caseta de mesaje atunci cand se executa clic pe MyForm.

DEFINE CLASS MyForm AS Form
PROCEDURE Click
= MESSAGEBOX('S-a executat clic pe MyForm!')
ENDPROC
ENDDEFINE

OLEPUBLIC Specifica ce clasa dintr-un server Automation poate fi accestat de catre un client Automation.

Daca un program ce contine o definitie de clasa OLEPUBLIC este adaugat la un proiect, un fisier executabil (.exe) sau o biblioteca inlantuita dinamic (.dll) ce contine clasa poate fi creat in mod interactiv in Project Manager sau cu BUILD EXE sau BUILD DLL. EXE sau DLL este inregistrat automat in sistemul de operare si devine disponibil pentru orice client Automation.

[PROTECTED | HIDDEN nume_proprietate1, nume_proprietate2

[.Object.]nume_proprietate eExpresie Creaza o proprietate a clasei sau subclasei si atribuie o valoare implicita proprietatii. Proprietatile sunt numite atribute ale clasei si definesc caracteristicile si comportamentele clasei. Clasele si subclasele pot avea mai multe proprietati.

Pentru a atribui o valoare proprietatii se foloseste caracterul . Urmatorul exemplu creaza o clasa definita de utilizator, numita ClasaMea, cu doua proprietati denumite Nume si Versiune. Proprietatea Nume este initializata la sirul gol, iar proprietatea Versiune este initializata la sirul 1.0.

DEFINE CLASS ClasaMea AS Custom
Nume = ''
Versiune = '1.0'
ENDDEFINE

O proprietate poate fi accesata din exteriorul definitiei clasei sau subclasei dupa crearea obiectului cu CREATEOBJECT( ):

obiect = CREATEOBJECT('ClasaMea')

Proprietatile pot fi accesate folosind urmatoarea sintaxa:

nume_obiect proprietate

Cuvantul cheie Object indica lui Visual FoxPro faptul ca valoarea proprietatii va fi aplicata atunci cand controlul ActiveX este creat.

Urmatorul exemplu adauga controlul Outline ActiveX pe un formular. Cuvantul cheie Object este folosit pentru a specifica o proprietate pentru controlul Outline inainte ca el sa fie creat.

PUBLIC frmOLETest
frmOLETest = CREATEOBJECT('Form')
frmOLETest.Visible = .T.
frmOLETest.ADDOBJECT('OCXTest', 'BlueOLEControl', 'MSOutl.Outline')
frmOLETest.OCXTest.AddItem('Primul element')
frmOLETest.OCXTest.AddItem('Al doilea element')
DEFINE CLASS BlueOLEControl AS OLEControl
* Seteaza o proprietate a controlului ActiveX
.Object.Backcolor = 16776960
* Seteaza proprietatile controlului OLE Container
  Visible = .T.
  Height = 100
  Width = 200
ENDDEFINE

Pentru a preveni accesul si modificarea proprietatilor din afara definitiei clasei sau subclasei se include PROTECTED si o lista cu nume de proprietati. Metodele si evenimentele din interiorul definitiei clasei sau subclasei pot accesa proprietatile protejate.

In exemplu urmator, proprietatea Versiune este protejata, prevenind accesul si modificarea ei din exteriorul definitiei clasei. Totusi, proprietatea Nume nu este protejata si poate fi accesata si modificata.

DEFINE CLASS ClasaMea AS Custom
  PROTECTED Versiune
  Nume = ''
  Versiune = '1.0'
ENDDEFINE

Pentru a preveni accesul si modificarile proprietatilor din afara definitiei clasei se include HIDDEN si o lista cu nume de proprietati. Proprietatile ascunse pot fi accesate numai de metodele si evenimentele din interiorul definitiei clasei. In timp ce proprietatile protejate pot fi accesate de catre subclasele definitiei clasei, proprietatile ascunse pot fi accesate doar din definitia clasei.

ADD OBJECT Adauga definitiei clasei sau subclasei un obiect al unei clase de baza Visual FoxPro, al clasei sau subclasei definite de utilizator sau al controlului ActiveX Custom.

PROTECTED Previne accesul si modificarea proprietatilor obiectului din afara definitiei clasei sau subclasei. Cuvantul cheie PROTECTED trebuie plasat imediat inaintea de nume_obiect, in caz contrar FoxPro genereaza o eroare de sintaxa.

nume_obiect Specifica numele obiectului si este utilizat pentru referirea obiectului din interiorul definitiei clasei sau subclasei dupa ce un obiect a fost creat in definitia clasei sau subclasei.

AS nume_clasa2 Specifica numele clasei sau subclasei ce contine obiectul pe care-l adaugati definitiei clasei. De exemplu, urmatoarea definitie de clasa adauga un buton de comanda din clasa de baza CommandButton si o lista din clasa de baza ListBox :

DEFINE CLASS MyClass AS Custom
ADD OBJECT cmdB1 AS CommandButton
ADD OBJECT lstList1 AS ListBox
ENDDEFINE

NOINIT Specifica faptul ca metoda Init a obiectului nu se executa atunci cand obiectul este adaugat.

WITH cListaProprietati Specifica o lista de proprietati si valori ale proprietatilor pentru obiectul pe care-l adaugati definitiei clasei sau subclasei. De exemplu, urmatoarea definitie de clasa creaza o clasa numita ClasaMea, adauga un buton de comanda la definitia clasei si specifica proprietatile Caption si BackColor pentru butonul de comanda.

DEFINE CLASS MyClass AS CUSTOM
ADD OBJECT CB1 AS CommandButton;
WITH Caption = 'Cancel', BackColor = 2
ENDDEFINE

FUNCTION | PROCEDURE nume[_ACCESS | _ASSIGN] | THIS_ACCESS Creaza evenimente si metode pentru clasa sau subclasa definita. Evenimentele si metodele sunt create ca un set de proceduri si/sau functii.

Puteti crea o functie sau procedura eveniment in interiorul unei definitii de clasa sau subclasa pentru a raspunde la un eveniment. Un eveniment este o actiune cum ar fi executarea unui clic cu mouse-ul care este recunoscut de obiectul creat din clasa sau subclasa definita.

Evenimentele sunt apelate cu urmatoarea sintaxa:

nume_obiect eveniment

de asemenea, puteti crea o procedura sau functie metoda in definitia clasei sau subclasei. Metoda este o rutina care actioneaza numai asupra obiectului creat din clasa sau subclasa definita. Metodele sun apelate folosind urmatoarea sintaxa:

nume_obiect metoda

Sufixele _ACCESS si _ASSIGN pot fi adaugate la un nume de functie sau procedura pentru a crea o metoda Access sau Assign pentru o proprietate cu acelasi nume. Codul ditr-o metoda Access este executat cand proprietatea este solicitata. Codul dintr-o metoda Assign este executata cand incercati sa schimbati valoarea proprietatii.

In plus, puteti crea o procedura sau functie THIS_ACCESS care este executata cand incercati sa schimbati valoarea unui membru al unui obiect sau este solicitat un membru al unui obiect.

NODEFAULT Interzice executarea de catre Visual FoxPro a evenimentelor si metodelor sale implicite pentru prelucrarea metodelor si evenimentelor Visual FoxPro. De exemplu, daca se produce evenimentul KeyPress, includerea cuvantului cheie NODEFAULT in procedura sau functia KeyPress interzice sistemului Visual FoxPro sa plaseze tasta apasata in buffer-ul tastaturii Visual FoxPro. Aceasta va permite sa creati o procedura KeyPress in care sa testati ce tasta este apasata inainte de a o transmite buffer-ului tastaturii.

NODEFAULT poate fi plasat oriunde in interiorul procedurii eveniment sau metoda. De asemenea, retineti ca NODEFAULT poate fi plasat si in interiorul unei proceduri sau eveniment din Form Designer.

cInstructiuni

[ENDFUNC | ENDPROC]]

ENDDEFINE cInstructiuni sunt comenzi Visual FoxPro ce sunt executate atunci cand este executat un eveniment sau o metoda.

Functiile si procedurile eveniment sau metoda pot accepta valorile prin includerea declaratiei PARAMETERS sau LPARAMETERS ca prima linie executabila a functiei sau procedurii.

Spre deosebire de majoritatea cuvintelor cheie din Visual FoxPro, nu puteti abrevia ENDFUNC si ENDPROC. Aceasta previne conflictele cu cuvintele cheie ENDFOR ENDPRINTJOB.

Urmatorul exemplu demonstreaza cum se creaza o procedura eveniment care afiseaza un mesaj atunci cand se executa clic pe butonul de comanda. Aceasta procedura eveniment suprascrie evenimentul Click implicit al butonului de comanda.

DEFINE CLASS ClasaMea AS Custom
ADD OBJECT ButonulMeu AS CommandButton
ADD OBJECT ListaMea AS ListBox
PROCEDURE ButonulMeu.Click
= MESSAGEBOX('Aceasta este procedura mea pentru clic evenimentul')
ENDPROC
ENDDEFINE

Observatii

Clasele definite de utilizator reprezinta un set de comenzi plasat intr-un fisier program, similar unei proceduri. Comenzile ce urmeaza liniei de definire a clasei sau subclasei definesc proprietatile, evenimentele si metodele clasei sau subclasei respective.

Nota: Dupa proceduri, intr-un fisier program nu puteti avea cod de program executabil; cu doar definitiile de clase, proceduri sau functii pot urma dupa prima comanda DEFINE CLASS PROCEDURE sau FUNCTION din fisier.

Definitiile claselor si subclaselor create cu DEFINE CLASS nu pot fi platate in interiorul comenzilor de programare structurata, cum ar fi IFENDIF sau DO CASEENDCASE, nici in comenzile de ciclare, cum ar fi DO WHILEENDDO sau FORENDFOR.

Pentru a crea un obiect dintr-o definitie de clasa sau subclasa, se utilizeaza un apel CREATEOBJECT( ) cu numele clasei sau subclasei.

Exemplu de comanda DEFINE CLASS

Urmatorul exemplu foloseste DEFINE CLASS si CREATEOBJECT( ) pentru a crea doua clase proprii numite FormCopil si FormNepot din clasa de baza Form a sistemului Visual FoxPro. ACLASS( ) este folosit pentru a crea un tablou numit gaTablouNou ce contine numele claselor, care sunt apoi afisate.

CLEAR
frmTest = CREATEOBJECT('FormNepot')
FOR nCount = 1 TO ACLASS(gaTablouNou, frmTest) && Creaza un tablou
? gaTablouNou(nCount) && Afiseaza numele claselor
ENDFOR
RELEASE frmTest

DEFINE CLASS FormCopil AS FORM
ENDDEFINE

DEFINE CLASS FormNepot AS FormCopil
ENDDEFINE




Politica de confidentialitate


creeaza logo.com Copyright © 2024 - Toate drepturile rezervate.
Toate documentele au caracter informativ cu scop educational.