|
cat mai rapid si eficient,fara sa fie necesar sa editati si codul sursa
|
səhifə | 9/17 | tarix | 17.03.2018 | ölçüsü | 1,41 Mb. | | #45490 |
| cat mai rapid si eficient,fara sa fie necesar sa editati si codul sursa.
-54- DEFINE CLASS
O alta modalitate de a crea subclase,sau clase noi,cu proprietati mo-
dificate fata de cele standard sau cu proprietati complet noi,este sa
utilizati comanda DEFINE CLASS urmata apoi de CREATEOBJECT().
Pentru a declara o clasa in cadrul unei file de cod,formula generala
este de tipul:
DEFINE CLASS AS
PROTECTED
PROCEDURE (parametrii...)
LOCAL
......codul procedurii
ENDPROC
FUNCTION (parametrii....)
LOCAL
......codul procedurii
RETURN
ENDFUNC
ENDDEFINE
Practic,clasa se defineste la fel ca orice alt tip de data si respecta
toate regulile utilizate in programarea orientata spre obiect.Dupa ce
clasa este definita,se pot forma obiecte (instante ale clasei respective).
Pentru a obtine un obiect dintr-o astfel de clasa se va utiliza o comanda
de tipul:
Obiectul = CREATEOBJECT([ parametrii...])
In practica,de foarte multe ori insa aceasta ordine este inversata,adica
se introduce comanda de apel a obiectului si apoi se adauga definitia
acestuia (cu conditia ca definitia sa apara in acelasi spatiu de vizibi-
litate,imediat dupa declaratie).
Pentru ca obiectul sa poata fi executat,este necesara si o comanda de
tipul READ EVENTS pentru a incepe procesarea codului,iar pentru a putea
iesi din bucla de repetitie este necesara o comanda de tipul CLEAR EVENTS
la sfarsitul secventei de operatii.
EXEMPLU: In fereastra Project Manager,alegeti Code si apoi Programs si
editati un mic program de genul:
fereastra1 = CREATEOBJECT('Form')
fereastra1.AddObject('cmdCmndBtn1','cmdButonulMeu')
fereastra1.cmdCmndBtn1.Visible = .T.
fereastra1.SHOW
READ EVENTS
DEFINE CLASS cmdButonulMeu AS CommandButton
Caption = 'Apasa'
Height = 30
PROCEDURE Click
MessageBox('Butonul a fost apasat !')
CLEAR EVENTS
ENDDEFINE
Salvati fila si apoi verificati programul cu RUN.
In exemplul de mai sus,am creat o fereastra la care am adaugat un buton
apoi am redefinit butonul cu o metoda proprie pentru evenimentul Click.
Pozitia la care se amplaseaza READ EVENTS si respectiv CLEAR events este
esentiala,pentru a prelua toate evenimentele din fereastra si pentru a
evita formarea unei bucle infinite (programul trebuie sa poata fi inchis).
-55-
Pentru subclasele create cu DEFINE CLASS se pot utiliza urmatoarele
clase de baza: CheckBox,Column,ComboBox,CommandButton,CommandGroup,Contai-
ner,Control,Cursor,Custom,DataEnviroment,EditBox,Form,FormSet,Grid,Header,
Image,Label,Line,ListBox,OLEControl,OLEBoundControl,OptionButton,Option-
Group,Page,PageFrame,Relation,Separator,Shape,Spinner,TextBox,Timer si
ToolBar.Toate aceste clase de baza,au un constructor si un destructor bine
definit,precum si o serie de proprietati,metode si evenimente predefinite.
In apropate toate situatiile posibile,unul dintre aceste obiecte va fi
destul de usor de trensformat pentru a obtine obiectul personalizat dorit
de d-voastra.Pentru restul situatiilor,puteti consulta lista de obiecte
ActiveX,sau puteti adauga in proiect orice clasa definita intr-o fila de
tip .vcx.Exista si posibilitatea de a crea obiecte absolut noi.In acest
caz se va utiliza optiunea Custom de genul:
DEFINE CLASS clasamea AS Custom
Aceasta solutie nu se recomanda,decat daca sunteti un programator cu ade-
varat experimentat.Orice eroare in definirea constructorului sau destruc-
torului si orice omisiune in definirea unei proceduri poate avea efecte
grave asupra executiei programului.De cele mai multe ori,cea mai mica
eroare va determina intreruperea executiei,fie intr-o bucla infinita de
asteptare a mesajelor Windows,fie pentru cautarea la nesfarsit a unui
element care nu se gaseste in spatiul de vizibilitate.In plus,acest gen
de obiecte complet personalizate este foarte greu de depanat de catre un
alt programator.
Pentru a apela o proprietate noua adaugata de d-voastra in subclasa nou
creata,puteti utiliza unul dintre evenimentele implicite ale obiectului:
EXEMPLU: In fereastra Project Manager,editati urmatorul program:
fereastra1 = CREATEOBJECT('Form')
fereastra1.AddObject('ObiectulMeu','ClasaMea')
fereastra1.ObiectulMeu.Visible = .T.
fereastra1.SHOW
READ EVENTS
DEFINE CLASS ClasaMea AS Label
Caption = 'Click drept aici !...apoi click stang aici !...'
Top = 100
Left = 30
Width = 400
text1 = 'Text personalizat'
PROCEDURE Click
MessageBox('Sfarsitul programului')
CLEAR EVENTS
ENDPROC
PROCEDURE RightClick
? ThisForm.ObiectulMeu.text1
ENDPROC
ENDDEFINE
Salvati fila si executati programul cu Run.Observati ca pentru a putea
accesa datele personalizate introduse in variabila locala text1 am uti-
lizat evenimentul RightClick,iar pentru iesirea din program au utilizat
evenimentul Click.Pentru a utiliza corect programul,executati un click
drept de mouse pe obiectul Label,pentru a apela datele personalizate,apoi
executati un click stang de mouse pe Label,pentru iesirea din program.
-56-
Asadar,in loc sa definiti o procedura complet noua,doar pentru a accesa
o variabila locala,este mult mai simplu sa modificati una dintre metodele
sau evenimentele clasei de baza.Exemplul de mai sus are insa urmatorul
defect major: bucla READ EVENTS asteapta sa fie inchisa cu CLEAR EVENTS,
doar dupa ce se executa procedura Click.In cazul in care utilizatorul
alege sa inchida fereastra fara sa execute un click stang pe textul afisat
bucla READ EVENTS ramane deschisa si va astepta la nesfarsit eventualele
mesaje Windows.In acest caz,memoria este blocata cu aceasta operatie re-
dundanta si Visual Fox Pro nu mai poate fi inchis.Singura solutie este
inchiderea si redeschiderea calculatorului.Pentru a evita acest gen de
situatie,se poate bloca butonul inchidere a ferestrei cu o comanda de
genul : fereastra1.Closable = .F.
apoi adaugati un buton special pentru inchidere.
Codul final va arata in felul urmator:
fereastra1 = CREATEOBJECT('Form')
fereastra1.Closable = .F.
fereastra1.AddObject('ObiectulMeu','ClasaMea')
fereastra1.AddObject('Buton1','ButonStop')
fereastra1.ObiectulMeu.Visible = .T.
fereastra1.Buton1.Visible = .T.
fereastra1.SHOW
READ EVENTS
DEFINE CLASS ClasaMea AS Label
Caption = 'Click drept aici !...'
Top = 100
Left = 30
Width = 400
text1 = 'Text personalizat'
PROCEDURE RightClick
? ThisForm.ObiectulMeu.text1
ENDPROC
ENDDEFINE
DEFINE CLASS ButonStop AS CommandButton
Caption = 'Exit'
Cancel = .T.
Left = 150
Top = 150
Height = 30
PROCEDURE Click
CLEAR EVENTS
ENDPROC
ENDDEFINE
Salvati fila si executati cu Run.Observati ca am inlocuit procedura Click
prin butonul Exit.In acest caz,utilizatorul este obligat sa utilizeze
butonul de iesire din fereastra,deoarece butonul Close a fost inactivat.
Aceste doua exemple ilustreaza destul de clar genul de situatii ce trebuie
sa fie luate in considerare in etapa de design a unei interfete grafice.
Pentru a evita orice eroare posibila,incercati in fereastra proiectata
toate operatriile posibile si imposibile,apoi rugati si o persoana fara
cunostiinte de programare sa verifice aplicatia creata (de cele mai multe
ori va descoperii "mici probleme" pe care nu le puteti anticipa).
-57-
Doua sau mai multe subclase pot fi grupate cu ajutorul unui obiect de
tip container (gen Form,Container,ToolBar etc.).Aceste obiecte nu numai
ca incapsuleaza obiectele continute dar au si o procedura implicita pentru
tratarea mesajelor Windows.Daca includeti obiectele intr-un astfel de
container nu mai este necesar sa editati o bucla de tip READ EVENTS.
EXEMPLU: pentru a realiza o bara de butoane,deschideti Project Manager si
editati programul urmator:
PUBLIC tbrDesktop
tbrDesktop = CREATEOBJECT('BaraControl')
tbrDesktop.SHOW
DEFINE CLASS BaraControl AS Toolbar
ADD OBJECT btnButon1 AS CommandButton
ADD OBJECT sep1 AS Separator
ADD OBJECT btnButon2 AS CommandButton
ADD OBJECT sep2 AS Separator
ADD OBJECT btnButon3 AS CommandButton
btnButon1.HEIGHT = 20
btnButon1.WIDTH = 50
btnButon1.Caption = "Buton 1"
btnButon2.HEIGHT = 20
btnButon2.WIDTH = 50
btnButon2.Caption = "Buton 2"
btnButon3.HEIGHT = 20
btnButon3.WIDTH = 50
btnButon3.Caption = "Buton 3"
LEFT = 50
TOP = 50
WIDTH = 300
Caption = "Bara de control"
PROCEDURE btnButon1.CLICK
MessageBox('Buton 1')
ENDPROC
PROCEDURE btnButon2.CLICK
MessageBox('Buton 2')
ENDPROC
PROCEDURE btnButon3.CLICK
MessageBox('Buton 3')
ENDPROC
ENDDEFINE
Salvati fila si executati cu Run.Exemplul de mai sus ilustreaza simplu
modul de implementare a unei bare de control formata din butoane de co-
manda.Bara utilizeaza butoane standard,la care procedura CLICK a fost re-
definita.In locul mesajului de avertizare se poate utiliza orice algoritm
sau comanda.Bara de instrumente este foarte usor de realizat si ofera o
imagine clara a codului utilizat.Acest gen de solutie este preferat de
catre programatorii mai experimentati,care s-au obisnuit sa controleze
fiecare linie de cod.Acelasi rezultat se poate obtine si utilizand instru-
mentele vizuale,dar pentru putea avea acces la liniile de cod,va trebui sa
utilizati instrumentul Class Browser,cu optiunea Code.
Obiectul de tip ToolBar controleaza singur toate evenimentele si preia
toate mesajele Windows,astfel incat erorile de programare sunt mai rare.
-58-
Avantajul major pe care il prezinta Visual Fox Pro fata de restul pro-
gramelor vizuale il reprezinta usurinta cu care se poate lucra cu tabele
si baze de date preformatate.Pe langa wizard,designer,query sau report,un
tabel sau o baza de date poate fi deschisa si modificata si cu ajutorul
unei secvente de linii de cod.Mai mult,se pot crea subclase personalizate
in care se adauga metode proprii sau variabile locale,astfel incat grila
de afisare sa poata executa si o serie de operatii automate.Cele mai frec-
vente greseli se datoreaza erorilor de editare a caii de acces la fila in
care este arhivat tabelul sau baza de date.Fie calea de acces este incom-
pleta,fie programul Visual Fox Pro a fost instalat pe o alta unitate sau
in alt director decat cel standard.Daca FoxPro nu gaseste fila sursa,pro-
gramul este intrerupt si se returneaza un mesaj de eroare.Pentru a evita
acest gen de eroare,in mod curent se utilizeaza functia HOME(),care retur-
neaza directorul curent,la care se adauga doar directorul si numele bazei
de date.
EXEMPLU: in Project Manager editati urmatoarea fila de cod:
CLOSE ALL
OPEN DATABASE (HOME() + 'Exemple\Baza1')
USE Arhiva1 IN 0
fereastra1 = CREATEOBJECT('Form')
fereastra1.Closable = .F.
fereastra1.AddObject('Iesire','Buton1')
fereastra1.AddObject('grdGrid1','Grid')
fereastra1.grdGrid1.Left = 25
fereastra1.grdGrid1.Visible = .T.
fereastra1.Iesire.Visible = .T.
fereastra1.SHOW
READ EVENTS
DEFINE CLASS Buton1 AS CommandButton
Caption = '\
Cancel = .T.
Left = 125
Top = 210
Height = 25
PROCEDURE Click
CLEAR EVENTS
CLOSE ALL
ENDPROC
ENDDEFINE
( Exemple=directorul curent,Arhiva1= tabelul iar Baza1=baza de date)
Salvati fila si executati programul cu Run.In mod similar,se pot apela
toate proprietatile si metodele grilei.Pentru a executa o serie de ope-
ratii automate,nu trebuie decat sa adaugati codurile dorite la una dintre
metodele implicite.Acest gen de solutie este mai laborios,dar ofera acces
complet la codul aplicatiei.Are rost sa utilizati acest gen de solutii,
doar atunci cand creati subclase de tipul Grid in care redefiniti un numar
oarecare de metode.De exemplu,cu un click stang de mouse puteti actualiza
grila cu date de la o adresa oarecare,iar cu un click drept de mouse ,
puteti imprima automat datele afisate.Instrumentele vizuale ofera o solu-
tie usoara si rapida in timp ce subclasele permit ajustari de finete.Tipul
de solutie se va alege in functie de experienta programatorului.
-59- ACLASS() si AMEMBERS()
O subclasa poate fi la randul sau clasa de baza pentru o subclasa mos-
tenitoare.Prin mai multe operatii de acest gen,se poate realiza un adeva-
rat arbore genealogic.Cand utilizati structuri de acest gen,puteti sa
realizati o schita a raporturilor de mostenire,sau puteti utiliza functii-
le specializate ACLASS() si AMEMBERS().Aceste functii sunt extrem de utile
atunci cand nu mai stiti care este clasa ancestrala sau nu stiti exact ce
membrii contine clasa rezultata (Exemplu: daca utilizati clase realizate
de un alt programator,fara nici o indicatie tehnica).Atat functia ACLASS()
cat si AMEMBERS() descarca informatiile intr-o variabila de tip arie si
returneaza un numar,corespunzator cu numarul de date arhivate.Pentru a
solicita numele clasei ancestrale,sau cel al unui membru al clasei se va
utiliza numele variabilei de tip arie,si numarul de ordine corespunzator.
EXEMPLU: In Project Manager editati o fila de tip cod de genul:
CLEAR
obiect = CREATEOBJECT('Stranepot1')
MessageBox('Arborele genealogic al clasei')
FOR nr = 1 TO ACLASS(nume,obiect)
? nume(nr)
ENDFOR
MessageBox('Urmeaza primii 44 de membri')
AMEMBERS(membru,obiect)
FOR nr=1 TO 44
? STR(nr)+' '+membru(nr)
ENDFOR
MessageBox('Urmatorii 40 de membri')
FOR nr=45 TO 84
? STR(nr)+' '+membru(nr)
ENDFOR
RELEASE obiect
DEFINE CLASS Ancestor AS Form
ENDDEFINE
DEFINE CLASS Mostenitor1 AS Ancestor
ENDDEFINE
DEFINE CLASS Nepot1 AS Mostenitor1
ENDDEFINE
DEFINE CLASS Stranepot1 AS Nepot1
ENDDEFINE
Salvati fila si executati cu Run.In exemplul de mai sus,obiectul este
o instanta a clasei Stranepot1,care a fost derivata din clasa Nepot1,care
a fost derivata din clasa Mostenitor1,care a fost derivata din clasa An-
cestor care a fost derivata din tipul Form.Functia ACLASS() va descarca
in variabila "nume" toate aceste clase in ordine ierarhica,iar functia
AMEMBERS() va descarca in variabila "membru" toti membrii clasei finale.
In exemplul de mai sus,numarul de membrii este egal cu cel al tipului Form
din care au fost derivate toate subclasele.Daca fiecare dintre subclase va
adauga si membrii noi,acestia vor fi adaugati automat in lista returnata.
Daca va intalniti frecvent cu astfel de situatii,puteti realiza un
instrument specializat,care sa analizeze si sa prezinte grafic arborele
genealogic al clasei analizate si structura membrilor.Daca utilizati fun-
ctia ca atare,atentie la numarul de ordine utilizat pentru a apela datele.
Cele doua functii se pot utiliza si in cursul procesului de depanare.
-60- Instrumentele specializate
Fata de varianta sa nonvizuala (FoxPro 2.6),Visual FoxPro aduce o serie
intreaga de imbunatatiri calitative,care multiplica si diversifica posi-
bilitatile de exprimare,dar in acelasi timp simplifica la maximum munca
programatorului.Astfel,Visual FoxPro permite lucrul cu obiecte vizuale de
tip Windows pentru a crea interfete grafice cu utilizatorul.Pentru reali-
zarea acestor obiecte,se pot realiza comenzi editate sub forma de linii de
cod,sau se pot utiliza obiectele specializate:Designers,Windows,Wizards,
Builders,Toolbars,Menues si Debugger.Comunicarea dintre programator si
program se realizeaza cu ajutorul unui set de casete de dialog,in care
programatorul nu trebuie decat sa introduca datele necesare,sau sa aleaga
dintr-un set de variante prestabilite.Prin acest procedeu,se pot realiza
programe complexe,doar cu cateva click-uri de mouse,fara sa fie necesar
sa editati nici o linie de cod.
Principalele date despre aceste instrumente au fost deja prezentate
impreuna cu modul de utilizare a lor.In randurile ce urmeaza vor fi pre-
zentate doar cateva date de ansamblu si cateva retusuri,pentru a va putea
forma o imagine de ansamblu( este recomandabil sa parcurgeti si capitolul
"Interface Reference" din manualul Help-Contents).
DESIGNERS( plansete de design)-sunt create pentru a facilita munca de
conceptie a modulelor ce formeaza programul final.Exista cate un astfel
de instrument,pentru fiecare dintre componentele de baza ale unui program.
Cu astfel de instrumente se pot crea clase noi,se pot stabili conexiuni,
se pot forma baze de date sau se pot crea ferestre personalizate,etichete,
meniuri,selectii rapoarte sau tabele de date preformatate.Modul de utili-
zare a fost deja prezentat in paginile anterioare.
WINDOWS (ferestre) -intreg sistemul de operare Windows este conceput pe
baza modelului modular,in care principalele elemente sunt prezentate in
cadrul unor ferestre.Ferestrele sunt de fapt niste obiecte de tip contai-
ner utilizate pentru a grupa si ordona alte obiecte.Cu ajutorul ferestre-
lor,informatiile sunt separate in tampoane de memorie mult mai mici si
pot fi prelucrate mult mai rapid sau mult mai usor.In plus,ferestrele stau
si la baza operatiilor de tip multitasking sau a procesarilor paralele.
Ca rezultat,este posibil sa utilizati o fereastra pentru a edita si trans-
mite date,in timp ce alta fereastra poate receptiona simultan datele emise
de un alt utilizator din retea.Ferestrele simplifica si munca de depanare.
Ferestrele pot fi de uz general,sau pot fi specializate pentru un anumit
grup de operatii.Ferestrele de tip general sunt utilizate pentru prelucra-
rea sau arhivarea datelor,in timp ce ferestrele specializate executa doar
un set predefinit de operatii.Visual FoxPro utilizeaza un set destul de
bogat de astfel de ferestre specializate,dintre care cele mai importante
sunt:Browse Window,Code Window,Command Window,Editing Window,Project Win-
dow,Properties Window,Trace Window si Watch Window.
BROWSE -fereastra Browse este destinata pentru a prezenta global toate
datele dintr-un tabel preformatat.Pentru a utiliza aceasta fereastra,des-
chideti cu Open o fila de tip .dbf,apoi alegeti din meniul View optiunea
Dostları ilə paylaş: |
|
|