Visual Foxpro 0 abc-doar


cat mai rapid si eficient,fara sa fie necesar sa editati si codul sursa



Yüklə 1,41 Mb.
səhifə9/17
tarix17.03.2018
ölçüsü1,41 Mb.
#45490
1   ...   5   6   7   8   9   10   11   12   ...   17

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

Yüklə 1,41 Mb.

Dostları ilə paylaş:
1   ...   5   6   7   8   9   10   11   12   ...   17




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

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin