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;Pentru aceeasi sarcina, in Visual FoxPro se poate folosi (si chiar se recomanda) varianta POO, ca in urmatoarea secventa:
fereastra1 = CreateObject("Form")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).
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.
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 customSe 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
:
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
:
Elementele listei pot fi afisate prin utilizarea metodei afisare
:
iar ultimul element din lista poate fi sters prin folosirea
metodei sterg
:
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 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:
Crearea unui obiect de tip c_lista_max
se face printr-o instructiune de forma:
Pentru a testa programul de mai sus, mai intai vom adauga cateva elemente la lista:
lista.adaug(23)Apoi vom determina valoarea maxima prin urmatoarea instructiune:
lista.maxPe 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.
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
.
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>
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 FormCreaza 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
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.
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
FormCopil
AS FORM
ENDDEFINE
FormNepot
AS FormCopil
ENDDEFINE
Politica de confidentialitate |
.com | Copyright ©
2024 - Toate drepturile rezervate. Toate documentele au caracter informativ cu scop educational. |
Personaje din literatura |
Baltagul – caracterizarea personajelor |
Caracterizare Alexandru Lapusneanul |
Caracterizarea lui Gavilescu |
Caracterizarea personajelor negative din basmul |
Tehnica si mecanica |
Cuplaje - definitii. notatii. exemple. repere istorice. |
Actionare macara |
Reprezentarea si cotarea filetelor |
Geografie |
Turismul pe terra |
Vulcanii Și mediul |
Padurile pe terra si industrializarea lemnului |
Termeni si conditii |
Contact |
Creeaza si tu |