Programarea orientat obiect (POO) revoluioneaz aproape orice aspect al dezvoltrii aplicaiilor cu Visual FoxPro, de la faza de analiz i proiectare p!n la faza de scriere a codului de program i testarea aplicaiilor i a componentelor aplicaiilor" #e asemenea, Visual FoxPro, ca i Visual $%% de altfel, este un limba& 'ibrid, adic dezvoltatorii de programe pot alege (ntre metodele POO i programarea modular" POO sre o altfel de abordare dec!t programarea modular, (n faptul c POO lucreaz cu entiti de genul obiectelor" #ac se dorete adaptarea unei aplicaii (ntr)o nou form, av!nd (n vedere c exist o form modificat a unei aplicaii mai vec'i, se realizeaz modificrile pe baza unui procedeu numit subclasare, i anume preluarea vec'ilor obiecte ale aplicaiei i modificarea acestora dup noile proprieti" $omportamentul i atributele obiectelor originale sunt automat aduse i la noile obiecte modificate, acest lucru numindu)se motenire" *n sc'imb dac se modific cumva obiectele originale, sc'imbrile fcute sunt aduse imediat i asupra obiectelor noi, realizate cu a&utorul subclasrii, prin modificarea obiectelor originale" POO utilizeaz nite termeni, pentru a explica expres conceptele POO, i anume+ motenire, ncapsulare i polimorfism" Primul i cel mai important concept c'eie al POO este obiectul" ,n obiect este un pac'et de informaii i aciuni" ,n obiect se conine pe sine" -oate cunotiinele i comportamentele unui obiect . sunt coninute (n acesta" /cest concept este cunoscut sub numnele de (ncapsulare" Orice obiect este caracterizat de propireti i evenimente" Proprieti #atele dintr%un obiect sunt denumite proprieti" O proprietate ((n termenii Visual FoxPro) este foarte simplu o variabil de memorie care este ataat la obiect i care are un anumit scop" ,tilizarea valorii proprietii i modificarea ei se face utiliz!nd numele obiectului urmat de punct (") i apoi de numele proprietii" Propreitile pot conine orice tipuri de date care sunt valide pentru variabilele de memorie Visual FoxPro" #e exemplu, dac avem o proprietate numit l0ste1ou care este ataat la un obiect numit o-est, se poate interoga valoarea proprietii (n felul urmtor+ o-est"l0ste1ou Metode Pe l!ng faptul c obiectele au date ataate, ele pot executa anumite aciuni" /ceste aciuni sunt reprezentate de fapt de codul de program care este scris (n procedurile care sunt ataate la obiect" /ceste proceduri sunt denumite de fapt metode" /pelarea unei metode se face (n mod asemntor cu a unei proprieti, i anume numele obiectului, urmat de punct (") i de numele metodei, dup cum urmeaz+ o-est"Print() -e'nic, parantezele care apar la sf!ritul numelui metodei sunt necesare numai dac se ateapt returnarea unei valori sau dac cumva se transmit parametrii metodei" 2ugestia noastr este de a se utiliza 3 (ntotdeauna paranteze pentru siguran, (n acest caz fiind i siguri c se apeleaz o metod" *n cazul apelrii unei metode dup care se ateapt returnarea unei valori, se poate salva valoarea returnat (n modul urmtor+ lValoare4eturnat 5 o-est"Print() Evenimente Evenimentele sunt aciuni care se (nt!mpl" #e exemplu, fc!nd clic6 pe butonul st!nga al mouse)ului se declaneaz un eveniment" 0venimentele pot fi cauzate de aciunea utilizatorului (ca (n cazul de mai sus) sau de ctre sistem (nsui (ca (n cazul (n care apare o eroare)" #ac creezi o clas de tipul unui buton de comand (n Visual FoxPro, poi ataa cod (ca o metod) la evenimente" #ac se declaneaz evenimentul (de exemplu, utilizatorul face clic6 st!nga cu mouse)ul deasupra butonului de comand), metoda asociat (care este metoda clic6) este apelat automat" *n Visual FoxPro, se pot ataa metode la tot felul de evenimente+ dac se d clic6 pe mouse, dac se ia m!na de pe mouse, se poate apela o metod (n momentul (n care un obiect este creat (evenimentul 7nit) sau invers (n momentul (n care obiectul este ters (evenimentul #estro8)" /pelarea evenimentelor se face (n acelai mod ca i apelarea metodelor" Clase P!n la acest punct, toate discuiile din acest capitol au fost centrate (n &urul obiectelor" *n programarea orientat)obiect, obiectele nu sunt niciodat programate, ci mai degrab obiectele de baz (numite clase) pot fi programate. -oate obiectele sunt instaniate (adic, create) pornind de la clase" #e aceea, toate programele se fac 9 la nivelul clasei" Odat un obiect instaniat pe baza unie clase, tot ceea ce trebuie s faci este s interacionezi cu el" 1u se adaug sau se modific metode existente (ntr)un obiect, ci mai degrab se adaug i se modific metode (n clase pe baza crora se instaniaz obiectele" ,n exemplu de clas+ #0F710 $:/22 $las /2 $ustom c1ume 5 ;; c-ip 5 ;; l0ste1ou 5 "F" P4O$0#,40 /ratValoare < t'is"c1ume < t'is"c-ip 7F t'is"l0ste1ou < ;2unt 1ou; 0:20 < ;2unt Vec'i; 01#7F 01#P4O$ 01##0F710 #efine $lass $las as $ustom /ceast linie de program spune Visual FoxPro c utilizatorul definete o nou clas numit $las bazat pe o clas de baz $ustom" c1ume 5 ;; c-ip 5 ;; = l0ste1ou 5 "F" :iniile anterioare sunt cunoscute ca declaraii de cod" *n aceat parte a definiiei clasei, se enumer variabilele (proprietile) obiectului i valorile lor iniiale" P4O$0#,40 /ratValoare < t'is"c1ume < t'is"c-ip 7F t'is"l0ste1ou < ;2unt 1ou; 0:20 < ;2unt Vec'i; 01#7F 01#P4O$ /ceasta este o definiie a unei metode" /pelarea unei metode va executa toate liniile de cod dintre linia P4O$0#,40 p!n la linia 01#P4O$" Instanierea Obiectelor ,n obiect este instaniat cu a&utorul funciei $40/-0O>?0$-()" 2intaxa pentru crearea unei instane a clasei $las+ o$las 5 $40/-0O>?0$-(;$las;) o$las este o variabil de memorie simpl de tipul Ob&ect" @ Pentru a accesa membrii clasei $las, se pot utiliza urmtoarele comenzi+ < o$las"c1ume AA 7niial gol o$las"c1ume 5 ;Popescu 7on; < o$las"c1ume AA /cum arat ;Popescu 7on; o$las"/ratValoare() AA 0xecut metoda /ratValoare $uv!ntul c'eie -B72 (nseamn c se acceseaz metodele i variabilele membre ale obiectului (nsui" Subclasarea-Bazarea unei Clase pe alt Clas 2 presupunem c vom defini o clas numit Formular i care definete de fapt un formular cu anumite proprieti ale sale" #0F710 $:/22 Formular /2 form Cidt'5.DD Beig't5.@D P4O$0#,40 7nit $aption 5 EFormular.F 01#P4O$ 01##0F710 Putem crea o subclas a clasei create anterior i pe care o vom denumi Formular., subclas care va moteni toate proprietile clasei printe, adic clasa Formular, dar (n plus va avea proprieti (n plus fa de clasa printe" #0F710 $:/22 Formular. /2 Formular G 1ame5FFormularF P4O$0#,40 $lic6 $aption 5 EFormular cu clic6F 01#P4O$ 01##0F710 O (nsuire foarte interesant a motenirii poate accepta ceea ce (i convine de la clasa printe i poate rescrie restul dup cum doreti" /cest lucru se poate realiza prin rescrie proprietii sau a metodei respective (n subclasa respectiv" #e exemplu (n clasa Formular, clasa printe a subclasei Formular., avem un eveniment 7nit, (n care d(m titlul formularului ca fiind Formular., putem rescrie acest lucru (n subclas prin rescrierea procedurii respective" #0F710 $:/22 Formular. /2 Formular 1ame5FFormularF P4O$0#,40 7nit $aption 5 EFormular3F 01#P4O$ 01##0F710 *n acest caz am redenumit evenimentul din clasa printe rescriind aceiai procedur (n subclasa Formular." #e asemenea, s presupunem c este posibil s dorii s lansai (n execuie metoda din clasa printe (nt!i i apoi s adugai ceva cod de program (n plus (n metoda din subclas, ca (n exemplul urmtor+ #0F710 $:/22 Formular3 /2 Formular 1ame5FFormularF P4O$0#,40 7nit H Formular.++7nit() $aption 5 EFormular3F C/7- C71#OC E0xemplu de apelare a unei metode din clasa printeF 01#P4O$ 01##0F710 Operatorul (++) este utilizat pentru a apela metodele din clasele superioare (n ierar'ia claselor" Metode i Proprieti Prote!ate :a crearea unui obiect trebuie s decidei dac dorii s fie public, adic s poat s fie utilizat i de alte clase sau numai (n cadrul clasei respective" 2oluia (n acest caz este s creai metode i proprieti prote&ate, care nu pot fi accesibile din afara clasei (n care s) au definit respectivele metode i proprieti" /cest lucru se realizeaz scriind+ P4O-0$-0# numeproprietate (n seciunea (n care declarai definiiile de cod, sau P4O-0$-0# (n faa liniei P4O$0#,40" #0F710 $:/22 $las /2 $ustom P4O-0$-0# c1ume c1ume 5 ;; c-ip 5 ;; l0ste1ou 5 "F" P4O-0$-0# P4O$0#,40 /ratValori < t'is"c1ume < t'is"c-ip I 7F t'is"l0ste1ou < ;02-0 1O,; 0:20 < ;02-0 V0$B7; 01#7F 01#P4O$ 01##0F710 *n acest exemplu ambele proprieti c1ume i c-ip sunt prote&ate, ca i metoda /ratValori care este i ea prote&at" *ncercrile de a le accesa din afara clasei vor produce erori ca i cum aceste proprieti i metode nu ar exista" Polimor"ism Polimorfismul este un alt concept care trebuie dezbtut dac se vorbete despre programarea orientat-obiect" Polimorfismul este capacitatea de a da metodelor i proprietilor din diferite clase acelai nume, c'iar dac acele metode i proprieti fac lucruri cu totul diferite de la o clas la alta" #e exemplu urmtoarele linii de comand+ oObiect. 5 $40/-0O>?0$-(;Formular.;) oObiect3 5 $40/-0O>?0$-(;-elefon;) oObiect."0xecut() AA:anseaz (n execuie metoda 0xecut a Obiect. oObiect3"0xecut() AA:anseaz (n execuie metoda 0xecut a Obiect3 J Crearea Obiectelor oFact 5 $40/-0O>?0$-(;Factura;) aceast linie de cod de program transmite un mesa& clasei Factura spun!ndu)i s creeze un obiect numit oFact bazat pe aceast clas" #tribuirea unei valori unei proprieti lnValoare 5 oFact"nValoare /ceast linie de cod de program transmite un mesa& obiectului oFact i (i spune s ia valoarea proprietii nValoare i s o returneze la lnValoare" #pelarea unei metode oFact"/fiare AA /fieaz obiectul oFact 2e transmite un mesa& obiectului oFact spun!ndu)i s execute metoda /fiare" #naliz i Proiectare cu POO Programarea orientat)obiect nu (ncepe cu scrierea codului de program, cu toate c p!n acum am discutat numai despre implementarea fazei de scriere a obiectelor, iar acest pas este totui ultimul (n crearea programelor orientate)obiect" Primul pas ce trebuie fcut este de a analiza domeniul problemei i de a proiecta ierar'ia claselor" 0ste destul de simplu de realizat dac se respect o anumit disciplin" /nalitii au apreciat c (n realizarea unei aplicaii HDK din timp se pierde cu analiza orientat) .D obiect (/OO) i proiectarea orientat)obiect (POO)" 0xist mai multe tipuri de metodologii create de nume populare (n domeniul bazelor de date Lrad8 >ooc', 7var ?acobsen i 4ebecca Cirfs)>roc6" Crearea i utilizarea claselor cu $isual %o&Pro #efinirea claselor se face utiliz!nd constructorul #0F710 $:/22 M 01##0F710, dup cum urmeaz+ #0F710 $:/22 NnumeclasO /2 NclasdebazO P)) /ici se face declararea codului P4O-0$-0# Nlist variabile membruO P4O$0#,40 NmetodprocO (param., param3 """") :O$/: Nlist de variabile localeO P)) /ici se scrie codul procedurii 01#P4O$ F,1$-7O1 NmetodfuncO (param., param3 """") :O$/: Nlist de variabile localeO P)) /ici se scrie codul funciei 40-,41 NvaloarereturnatO 01#F,1$ 01##0F710 'E%I(E C)#SS *numeclas+ #S *superclas+ /ceast linie de cod comunic Visual FoxPro c se creaz o nou clas" -oate liniile de cod de program dintre #0F710 i 01##0F710 in de definiia clasei respective" <numeclas> este .. numele clasei nou create i <superclas> este numele clasei pe baza creia se creaz clasa cea nou" -ermenul superclas mai poate fi (nt!lnit (n terminologia de specialitate i ca o clas printe" Prin definiie orice clas creat (n Visual FoxPro este o subclas a altei clase" :a cel mai (nalt nivel clasele create (n Visual FoxPro sunt subclase a ccea ce Qicrosoft numete clase de baz, clase care apar (n tabelul urmtor" $isual %o&Pro ,-. Clase de Baz (ume Clas 'escriere #ctive'oc Obiectul document active care poate fi gzduit (ntr)un broRser de tipul 7nternet 0xplorer" C/ec0Bo& O caset de validare standard, control similar cu o caset de validare din FoxPro 3"" Column O coloan (ntr)un control grid" ComboBo& O caset combinat (combo box) similar cu un control pop)up (n FoxPro 3"" CommandButton 0c'ivalent cu un pus'button (n FoxPro 3"x. Command1roup ,n grup de butoane de comand care opereaz (mpreun" 2unt ec'ivalente cu un grup de pus'button din FoxPro 3"x controlate de o variabil Container ,n obiect generic proiectat pentru a putea conine alte obiecte (n el" 0ste utilizat (n cazul crerii unei clase care conine mai multe obiecte (n ea" Control /celai lucru ca i clasa container , (ns de data aceasta referirea nu se mai face la clasa container ci la clasa control" .3 (ume Clas 'escriere Cursor #efiniia unui cursor (ntr)un mediu de date" Custom *n mod primar se folosete pentru obiecte care nu sunt vizuale, dar care pot conine obiecte vizuale ca membrii" 'ata O colecie de medii de date cursori i relaii pentru a putea fi desc'ise i (nc'ise ca o unitate" EditBo& O regiune de editare ec'ivalent cu FoxPro 3"G" %orm ,n singur ;screen;, format pentru introducerea de date" 0ste obiect container care poate conine i alte obiecte (n el" %ormSet ,n obiect tip container care are ca membrii mai multe formulare (forms)" 1rid ,n obiect de tip container care permite afiarea i editarea informaiilor (n formatul tabel" 2eader /ntetul unei coloane a unui tabel" 23perlin0 Ob!ect Furnizeaz butoane, imagini sau etic'ete care la un clic6 pot lansa pagini C0>" Image O imagine" )abel O etic'et a unui obiect" )ine O linie desenat" )istBo& O list derulant" OleControl ,n control bazat pe un obiect O:0" OptionButton ,n singur obiect radio)tip obiect" Option1roup Qai multe butoane radio care opereaz ca un singur control" 0ste ec'ivalentul unui obiect radio button din FoxPro 3"x" Page O singur pagin din cadrul unui .9 (ume Clas 'escriere formular pagin" Page%rame ,n control de tip pagin" Fiecare pagin din cadrul unui control de tip pagin este o pagin separat" Formularul pagin este un control tip container deoarece el poate conine mai multe obiecte" Pro!ect2oo0 $reeaz instane ale proiectului desc'is care permit acces la nivel program ctre evenimentele proiectului" 4elation O definiie a unei relaii (ntre dou cursoare (ntr)un mediu de date" Separator Obiect care pune spaii albe (ntre controale pe un toolbar" S/ape O form (un cerc sau un dreptung'i)" Spinner 0c'ivalentul unui spinner control din FoxPro 3"x" 5e&tBox 0c'ivalentul unui L0- control din FoxPro 3"x" 5imer ,n obiect vizual care nu apare pe form" /cest control este proiectat pentru a permite aciuni la intervale de timp fixe" 5oolBar O bar de instrumente, care este un grup de obiecte care pot fi lipite (n partea de sus, &os, sau lateral ecranului" $!nd nu este lipit, o bar de instrumente arat asemntor unei forme" Clase $lasele pot fi caracterizate (n dou tipuri i anume clase vizuale i clase nonvizuale" .= Clase $izuale O clas vizual este o clas proiectat pentru scopul de a putea fi afiat" #e exemplu, un formular este o clas vizual" Principalul scop al claselor vizuale este (ns crearea interfeei (deseori numit i L,7 ) Lrap'ical ,ser 7nterface sau interfaa grafic a utilizatorului)" *n aceast categorie de clase se pot proiecta clase (n urmtoarele subcategorii+ ) controale singure ) combinaii de controale ) containere ) formulare ) toolbar)uri" Butonul de comand O6 este un bun exemplu de control singular, care la execuia unui clic6 prsete formularul" Pentru a realiza acest lucru se creaz o clas de tipul $ommand>utton (n care se definesc c!teva proprieti ale butonului OS i bine(neles evnimentul $lic6 cu a&utorul cruia prsete formularul" P)) $lass+ butono6 P)) Parent$lass+ $ommand>utton P)) >ase$lass+ $ommand>utton P #0F710 $:/22 butono6 /2 $ommand>utton /uto2ize 5 "F" Beig't 5 3J Cidt' 5 =. $aption 5 ;OS; #efault 5 "-" 1ame 5 ;butono6; .@ P4O$0#,40 $lic6 40:0/20 t'isform 01#P4O$ 01##0F710 /cest buton poate fi plasat (n orice formular" Qetoda utilizat de acest buton este 40:0/20 -B72FO4Q (n evenimentul $lic6 al butonului. *n figura nr". putei vedea un buton OS creat cu a&utorul codului de program anterior" Fig". ,n formular cu un buton care prsete formularul Subclasa unei clase a unui control singular -e'nic, toate clasele din Visual FoxPro sunt subclase ale unor clase de baz" 2 presupunem c dorim o versiune a butonului creat mai sus, dar cu un text a&uttor (tooltip text care apare dac lsai mouse)ul puin timp deasupra controlului respectiv)" P)) $lass+ butono6cua&utor P)) Parent$lass+ butono6 P)) >ase$lass+ $ommand>utton P)) 2ubclas a butonOS adaug un a&utor (-ool-ip) .G " #0F710 $:/22 butono6cua&utor /2 o6button
Beig't 5 3J Cidt' 5 =. -ool-ip-ext 5 ;Prsete formularul; 1ame 5 ;butono6cua&utor; 01##0F710 Observai c evenimentul $lic6 de data aceasta nu este prezent, deoarece este motenit din clasa printe" 2e adaug (n plus la aceast subclas proprietatea -ool-ip-ext" 'e ce subclas7 2e apeleaz la subclase i nu se face direct modificarea (n clasa printe, deoarece ar (nsemna (n caz contrar c orice modificare (n clasa printe va fi motenit de toate subclasele sau instanele obiectului respectiv" O clas container - Navigator ,n container de $ommand>uttons utilizat pentru navigarea (ntr)o tabel dintr)un formular" Pentru a realiza un astfel de container de butoane de navigarese definete (n prim fa8 clasa container (n care se adaug instanele claselor butoanelor de navigare definite ulterior" /dugarea la clasa container se face cu a&utorul instruciunii /## O>?0$-" Prog- 8 9n Container - Bazat pe un set de butoane de navigare P)) $lass+ navigator P)) Parent$lass+ container P)) >ase$lass+ container .H #0F710 $:/22 navigator /2 container Cidt' 5 9@D Beig't 5 93 >ac62t8le 5 D >orderCidt' 5 D 1ame 5 ;navigator; /## O>?0$- cmd,rmatoarea /2 cmd,rmatoarea C7-B T -op 5 D, T :eft 5 D, T Beig't 5 9., T Cidt' 5 GD, T $aption 5 ;,rmatoarea;, T 1ame 5 ;cmd,rmatoarea; /## O>?0$- cmd/nterioara /2 cmd/nterioara C7-B T -op 5 D, T :eft 5 H3, T Beig't 5 9., T Cidt' 5 GD, T $aption 5 ;/nterioara;, T 1ame 5 ;cmd/nterioara; /## O>?0$- cmdPrima /2 cmdPrima C7-B T -op 5 D, T :eft 5 .==, T Beig't 5 9., T Cidt' 5 GD, T .I $aption 5 ;Prima;, T 1ame 5 ;cmdPrima; /## O>?0$- cmd,ltima /2 cmd,ltima C7-B T -op 5 D, T :eft 5 3.G, T Beig't 5 9., T Cidt' 5 GD, T $aption 5 ;,ltima;, T 1ame 5 ;cmd,ltima; /## O>?0$- cmdo6 /2 butono6cua&utor C7-B T -op 5 D, T :eft 5 3II, T Beig't 5 9., T Cidt' 5 GD, T 1ame 5 ;cmdOS; 01##0F710 #0F710 cmd,rmatoarea /2 $ommand>utton P4O$0#,40 $lic6 2S7P . 7F 0OF() 5Qessagebox(;2f!rit de fiierU;, .G) LO >O--OQ 01#7F t'isform"refres'() 01#P4O$ 01##0F710 .J #0F710 $:/22 cmd/nterioara /2 $ommand>utton P4O$0#,40 $lic6 2S7P ). 7F >OF() 5Qessagebox(;*nceput de fiierU;, .G) LO -OP 01#7F t'isform"refres'() 01#P4O$ 01##0F710 #0F710 $:/22 cmdPrima /2 $ommand>utton P4O$0#,40 $lic6 LO -OP t'isform"refres'() 01#P4O$ 01##0F710 #0F710 $:/22 cmd,ltima /2 $ommand>utton P4O$0#,40 $lic6 LO >O--OQ t'isform"refres'() 01#P4O$ 01##0F710 #0F710 $:/22 butono6cua&utor /2 o6button Beig't 5 3J Cidt' 5 =. 3D -ool-ip-ext 5 ;Prsete formularul; 1ame 5 ;butono6cua&utor; 01##0F710 Fig" 3 Formular cu butoane de navigare Pornind de la programul anterior (n care am definit o clas container de butoane de navigare, vom realiza un alt program, care va avea (n plus fa de cel anterior un buton 1ou (acesta va crea o nou (nregistrare (n tabelul test"dbf)" 2e creaz clasa container care va conine pe l!ng butoanele de navigare i 3 casete text legate cu a&utorul proprietii $ontrol2ource la tabelul test care se consider c este de&a adugat la mediul de date al formularului" /ceste 3 casete text vor fi legate la 3 c!mpuri ale tabelului test i anume cnume i ctip"
P)) Form+ form. P)) Parent$lass+ form P)) >ase$lass+ form #0F710 $:/22 form. /2 form -op 5 D :eft 5 D 3. Beig't 5 .I3 Cidt' 5 =G9 #o$reate 5 "-" >ac6$olor 5 4L>(.J3,.J3,.J3) >order2t8le 5 3 $aption 5 ;Form.; 1ame 5 ;Form.; /## O>?0$- text. /2 textbox C7-B T >ac6$olor 5 4L>(.J3,.J3,.J3), T $ontrol2ource 5 ;test"cnume;, T Beig't 5 3=, T :eft 5 =I, T -op 5 3=, T Cidt' 5 ..9, T 1ame 5 ;-ext.; /## O>?0$- text3 /2 textbox C7-B T >ac6$olor 5 4L>(.J3,.J3,.J3), T $ontrol2ource 5 ;test"ctip;, T Beig't 5 3=, T :eft 5 =I, T -op 5 GD, T Cidt' 5 ..9, T 1ame 5 ;-ext3; /## O>?0$- navigator. /2 navigator C7-B T -op 5 .3D, T :eft 5 .3, T Cidt' 5 =3., T 33 Beig't 5 93, T 1ame 5 ;1avigator.;, T cmd,rmatoarea"1ame 5 ;cmd,rmatoarea;, T cmd/nterioara"1ame 5 ;cmd/nterioara;, T cmdPrima"1ame 5 ;cmdPrima;, T cmd,ltima"1ame 5 ;cmd,ltima;, T cmdOS"-op 5 D, T cmdOS":eft 5 9GD, T cmdOS"Beig't 5 9., T cmdOS"Cidt' 5 G., T cmdOS"1ame 5 ;cmdOS; /## O>?0$- form."navigator."cmd1ou /2 commandbutton C7-B T -op 5 D, T :eft 5 3II, T Beig't 5 9., T Cidt' 5 G., T $aption 5 ;1ou;, T 1ame 5 ;cmd1ou; P4O$0#,40 cmd1ou"$lic6 /PP01# >:/1S t'isform"refres'() 01#P4O$ 01##0F710 /dugarea butonului 1ou la container se face cu a&utorul comenzii /## O>?0$- sau al metodei /ddOb&ect() 39 Fig"9 Formular cu casete de text %ormularul *n programarea structurat pentru a lansa un formular se folosete comanda #O FO4Q nume, (n sc'imb (n programarea orientat obiect se creaz o instan a obiectului printe cu a&utorul metodei $reateOb&ect(), iar apoi se apeleaz metoda 2'oR() a obiectului respectiv, metod care (l va afia"" 5IP *n Visual FoxPro G, putei utiliza funcia 1eROb&ect() pentru a crea obiecte din clase" oForm 5 $reateOb&ect(;Form;) oForm"2'oR(.) sau oForm 5 1eROb&ect(;Form;) oForm"2'oR(.) Citirea evenimentelor sistemului 20- $:/22 -O &un6me 3= oForm 5 $reateOb&ect(;Form;) oForm"2'oR() *n programul anterior se creeaz un formular pe baza unei instanieri a clasei de baz Form, apoi se apeleaz metoda 2'oR()" Problema se pune (n felul urmtor+ la apelarea metodei 2'oR() formularul va aprea i apoi va disprea de pe ecran" #e aceea este necesar s se transmit cumva sistemului s citeasc din nou evenimentele" /cest lucru se poate realiza cu a&utorul comenzii 40/# 0V01-2" Prog-: 9n buton de comand care lanseaz un "ormular P)) $lass+ lansarea (n execuie a unui formular P)) Parent$lass+ $ommand>utton P)) >ase$lass+ $ommand>utton #0F710 $:/22 lansareformular /2 $ommand>utton Beig't 5 3J Cidt' 5 J= $aption 5 ;:ansareFormular; oform 5 "1,::" 1ame 5 ; :ansareFormular ; P4O$0#,40 $lic6 t'is"oForm 5 $reateOb&ect(;Form;) t'is"oForm"2'oR() 01#P4O$ 01##0F710 Mediul de date sau 'ata Environment ,na dintre cele mai mari diferene dintre crearea formularului "2$V i crearea unei clase de tip formular se afl (n zona mediului de date" Folosirea mediului de 3@ date se face pentru a specifica ce tabele, vederi sau relaii sunt utilizate (n formular" :a crearea unui formular nu se poate salva mediul de date (mpreun cu el, dac se salveaz un formular ca o clas care are un mediu de date ataat, mediul de date este pierdut" #e aceea se creeaz acest mediu de date cu a&utorul codului de program" #e obicei plasarea codului de program referitor la desc'iderea mediului de date se face (n evenimentul :oad, sau (ntr)o procedur numit :oad" /stfel se creaz clasa container (formularul) care va conine casetele de text, legate la tabela $lient cu a&utorul proprietii $ontrol2ource, i bine(neles etic'etele corespunztoare fiecrei casete de text" *n evenimentul :oad al formularului desc'idem baza de date test specific!nd calea unde se afl memorat (n calculator, iar apoi desc'idem tabela $lient" Prog-; 9n "ormular care desc/ide o tabel de date pentru editare P)) $lass+ formularcudateclient P)) Parent$lass+ form P)) >ase$lass+ form #0F710 $:/22 formularcudateclient /2 form #ata2ession 5 3 Beig't 5 39I Cidt' 5 9@G #o$reate 5 "-" /uto$enter 5 "-" >ac6$olor 5 4L>(.J3,.J3,.J3) $aption 5 ;0xemplu de #ate $lient; 1ame 5 ;formularcudate; /## O>?0$- txtcodcl /2 -ext>ox C7-B T 3G $ontrol2ource 5 ;client"codcl;, T 0nabled 5 "F", T Beig't 5 3=, T :eft 5 .3D, T -op 5 3=, T Cidt' 5 3D@, T 1ame 5 ;txt$odcl; /## O>?0$- txtcompanie /2 -ext>ox C7-B T $ontrol2ource 5 ;client"companie;, T Beig't 5 3=, T :eft 5 .3D, T -op 5 H3, T Cidt' 5 3D@, T 1ame 5 ;txt$ompanie; /## O>?0$- txtcontact /2 -ext>ox C7-B T $ontrol2ource 5 ;client"contact;, T Beig't 5 3=, T :eft 5 .3D, T -op 5 .3D, T Cidt' 5 3D@, T 1ame 5 ;txt$ontact; /## O>?0$- txttitlu /2 -ext>ox C7-B T $ontrol2ource 5 ;client"titlu;, T Beig't 5 3=, T :eft 5 .3D, T -op 5 .GI, T Cidt' 5 3D@, T 3H 1ame 5 ;txt-itlu; /## O>?0$- label. /2 label C7-B T /uto2ize 5 "-", T >ac62t8le 5 D, T $aption 5 ;$od $lient+;, T Beig't 5 .I, T :eft 5 .3, T -op 5 3=, T Cidt' 5 ID, T 1ame 5 ;:abel.; /## O>?0$- label3 /2 label C7-B T /uto2ize 5 "-", T >ac62t8le 5 D, T $aption 5 ;$ompanie+;, T Beig't 5 .I, T :eft 5 .3, T -op 5 H3, T Cidt' 5 G=, T 1ame 5 ;:abel3; /## O>?0$- label9 /2 label C7-B T /uto2ize 5 "-", T >ac62t8le 5 D, T $aption 5 ;$ontact+;, T Beig't 5 .I, T :eft 5 .3, T -op 5 .3D, T Cidt' 5 @3, T 3I 1ame 5 ;:abel9; /## O>?0$- label= /2 label C7-B T /uto2ize 5 "-", T >ac62t8le 5 D, T $aption 5 ;-itlu+;, T Beig't 5 .I, T :eft 5 .3, T -op 5 .GI, T Cidt' 5 93, T 1ame 5 ;:abel=; P4O$0#,40 :oad OP01 #/-/ W2/QP:02%; Xtest"dbc; ,20 client 01#P4O$ 01##0F710 5IP Visual FoxPro G are o nou variabil de sistem numit W2/QP:02" /ceasta reine calea unde sunt memorate exemplele de coduri de program din directorul printe Visual 2tudio G, aceste exemple toate fiind memorate (n acelai director" 3J Fig" = Formular cu casete de text legat la un tabel Prog- < %ormularul de date precedent cu butoanele de navigare adugate P)) $lass+ formularcudateclientcunavigator P)) Parent$lass+ formularcudateclient P)) >ase$lass+ form #0F710 $:/22 formularcudateclientcunavigator /2 formularcudateclient Beig't 5 3I9 Cidt' 5 9HD #o$reate 5 "-" 1ame 5 ; formularcudateclientcunavigator ; txt$odcl"1ame 5 ;txt$odcl; txt$ompanie"1ame 5 ;txt$ompanie; txt$ontact"1ame 5 ;txt$ontact; txt-itlu"1ame 5 ;txt-itlu; :abel."1ame 5 ;:abel.; :abel3"1ame 5 ;:abel3; :abel9"1ame 5 ;:abel9; 9D :abel="1ame 5 ;:abel=; /## O>?0$- navigator. /2 navigator C7-B T -op 5 3=D, T :eft 5 .3, T Cidt' 5 9@D, T Beig't 5 93, T 1ame 5 ;1avigator.;, T cmd,rmatoarea"1ame 5 ;cmd,rmatoarea;, T cmd/nterioara"1ame 5 ;cmd/nterioara;, T cmdPrima"1ame 5 ;cmdPrima;, T cmd,ltima"1ame 5 ;cmd,ltima;, T cmdOS"1ame 5 ;cmdOS; 01##0F710 Construirea "ormularelor cu a!utorul claselor sau utilizarea Proiectantului de %ormulare7 ,tilizarea proiectantului de formulare versus formularele create sub forma claselor este o (ntrebare la care se rspunde greu" /mbele metode merg bine (n aplicaii" Qixarea i sc'imbarea diferitelor feluri de abordare nu face dec!t s (ngreuneze meninerea aplicaiilor respective peste timp" Proiectantul de Formulare poate fi folosit pentru crearea de seturi de formulare, care conin mai mult de un formular" /stfel se poate controla care dintre formulare este vizibil la un moment dat" Clasele mediului de date =data environment> 9. :a crearea unui formular cu Proiectantul de formulare din Visual FoxPro, trebuiesc specificate tabelele cu care lucreaz formularul respectiv prin crearea unui mediu de date pentru formular" #up cum apare i (n figura urmtoare un mediu de date este alctuit din cursori i relaii" V putei g!ndi la un mediu de date ca la un pac'et (de fapt un container), care conine informaiile necesare pentru configurarea mediului de date" Fig" @ Qediul de date al unui formular 0xist o limitare a mediului de date, cursorii i clasele nu pot fi create vizual, ci pot fi create numai prin cod de program" Clasa Cursor 93 $lasa $ursor definete coninutul zonei de lucru, se vor detalia proprietile, evenimentele i metodele acestei clase" Proprietile Clasei Cursor Proprieti 'escriere /lias $onfigureaz aliasul zonei de lucru c!nd se desc'ide >ufferQodeOverride 2pecific modul de buffering pentru cursor+ D 1imic (fr buffering) . 0ste configurat la nivel de formular 3 Pessimistic roR buffering 9 Optimistic roR buffering = Pessimistic table buffering @ Optimistic table buffering dac clasa mediului de date nu este utilizat (ntr) un formular se folosete orice valoare (n afar de ." $ursor2ource 2pecific sursa pentru datele cursorului" Poate fi o tabel, o baz de date, o vedere sau o tabel liber" #atabase 2pecific baza de date care conine sursa cursorului, trebuie menionat calea complet" 0xclusive 2pecific dac sursa cursorului este desc'is (n mod exclusiv i accept valori logice" Filter 2pecific irul de caractere dup care se face filtrarea 1o#ataOn:oad #ac aceast proprietate este setat pe "-", desc'ide cursorul i creaz structura, dar nici o 99 dat nu va fi descrcat (n cursor" /cest lucru se va realiza cu a&utorul lui 4eYuer8()" Order 2pecific ordinea de afiare a datelor" -rebuie specificat un tag de index" 4eadOnl8 #ac aceast proprietate este setat pe "-", atunci datele nu vor putea fi modificate" Evenimente i Metode? $lasa $ursor suport numai evenimentele 7nit, #estro8 i 0rror" Clasa 4elaii $lasa 4elaii specific informaiile necesare pentru a configura o relaiile (ntre doi cursori dintr)un mediu de date" Proprieti 20:0$- Factura 20- O4#04 -O c$od$l 20:0$- $lient 20- 40:/-7O1 -O c$od$l 71-O Factura Proprietile Clasei 4elaii Proprieti 'escrierea $'ild/lias /liasul tabelei copil" 0x" Factura" $'ildOrder 2pecific ordinea din tabelul copil" 0x" c$od$l" One-oQan8 2pecific dac este relaie una)la)mai)multe" Parent/lias /liasul tabelei printe" 0x" $lient 4elational0xpr 0xpresia dup care se face relaia" 0x" c$od$l" 9= Evenimente i Metode $lasa relaie suport numai evenimentele 7nit, #estro8 i 0rror" Clasa Mediu de date ='ataEnvironment> $lasa #ata0nvironment este un container pentru cursori i relaii, care luate (mpreun formeaz un mediu de date" Proprietile Clasei 'ataEnvironment Proprieti 'escrierea /uto$lose-ables 2pecific dac tabelele ar trebui (nc'ise automat (n cazul (n care obiectul este prsit" /utoOpen-ables 2pecific dac tabelele ar trebui desc'ise automat (n cazul (n care obiectul este instaniat" 7nitial2elected/lias 2pecific care alias ar trebui selectat iniial" Metode #diionale ale Clasei 'ataEnvironment Metod 'escrierea $lose-ables() /ceast metod (nc'ide toate tabelele i cursorii din clasa mediului de date" Open-ables() /ceast metod desc'ide toate tabelele i cursorii din clasa mediului de date" Evenimentele Clasei 'ataEnvironment Eveniment 'escrierea >eforeOpen-ables() /cest eveniment se execut (nainte ca tabelele s fie desc'ise /fter$lose-ables() /cest eveniment se execut dup ce tabelele sunt (nc'ise" Prog- @ 9n e&emplu de clas 'ata Environment 9@ #0F710 $:/22 client /2 cursor alias 5 ;$:701-; cursorsource 5 ;$:701-; database 5 BOQ0()%;-02-"#>$; 01##0F710 #0F710 $:/22 comenzi /2 cursor alias 5 ;$OQ01Z7; cursorsource 5 ;$OQ01Z7; database 5 BOQ0()%;-02-#/-/"#>$; 01##0F710 #0F710 $:/22 articolcomand /2 cursor alias 5 ;/4-7$O:$OQ/1#; cursorsource 5 ;/4-7$O:$OQ/1#; database 5 BOQ0()%;t02-#/-/"#>$; 01##0F710 #0F710 $:/22 $lientW:aW$omenzi /2 relation c'ildalias 5 ;$omenzi; parentalias 5 ;$lient; c'ildorder 5 ;c$od$l; 4elational0xpr 5 ;c$od$l; 01##0F710 #0F710 $:/22 $omenziW:aW/rticol$omand /2 relation c'ildalias 5 ;/rticol$omand; parentalias 5 ;$omenzi; 9G c'ildorder 5 ;c$od$omanda; 4elational0xpr 5 ;c$od$omanda; 01##0F710 #0F710 $:/22 #0 /2 #ata0nvironment /## O>?0$- o$lient /2 $lient /## O>?0$- o$omenzi /2 $omenzi /## O>?0$- o/rticol$omand /2 /rticol$omand /## O>?0$- o $lientW:aW$omenzi /2 $lientW:aW$omenzi /## O>?0$- o $omenziW:aW/rticol$omand /2 $omenziW:aW/rticol$omand
P4O$0#,40 7nit t'is"Open-ables() 01#P4O$
P4O$0#,40 #estro8 t'is"$lose-ables() 01#P4O$ 01##0F710 0venimentul 7nit apeleaz metoda Open-ables (n aa fel (nc!t toate tabelele sunt automat desc'ise c!nd obiectul este instaniat i metoda $lose-ables() este apelat c!nd obiectul este prsit" 4ecuperarea de"iniiilor din 'BC ar putea fi o problem, mai ales dac (n timpul dezvoltrii aplicaiei mai facei i ceva sc'imbri (n #>$" *n acest caz trebuie imediat actualizat i mediul de date" /cest aspect se poate realiza relativ simplu cu a&utorul funciilor de 9H tipul /#>Ob&ects, astfel (nc!t s v generai programul automat din #>$" Clasa? '9MP'BC #ump#bc este o subclas a clasei $ustom" Proprietile subclasei 'ump'bc Proprieti 'escrierea P4O-0$-0# a4elations 0ste o list de obiecte relaie din fiierul #>$" P4O-0$-0# a-ables 0ste o list de obiecte tabel din fiierul #>$" P4O-0$-0# aVieRs 0ste o list de obiecte vedere din fiierul #>$" $#>$1ame 0ste numele fiierului #>$ care se export" $P4L1ame 0ste numele programului P4L care se creeaz" P4O-0$-0# cPat' 0ste calea complet unde se afl baza de date" P4O-0$-0# n4elations 0ste numrul de obiecte relaie din fiierul #>$" P4O-0$-0# n-ables 0ste numrul de obiecte tabel din fiierul #>$" P4O-0$-0# nVieRs 0ste numrul de obiecte vedere din fiierul #>$" Evenimente i Metode Qetoda E&ecuta /ceast metod iniiaz scrierea programului, fiind singura metod public" #e fapt ea verific dac s)au completat proprietile c#>$1ame i cP4L1ame, (n caz contrar apare o caset de dialog de tipul Letfile() sau Putfile()" 9I Qetoda clasecursor /ceast metod P4O-0$-0# merge prin toate tabele i vederile bazei de date i genereaz clasele cursor pentru ele, apel!nd metoda Crite$ursor$lass" Qetoda citestedbc /ceast metod P4O-0$-0# citete definiiile relaiilor, tabelelor i vederilor #>$ utiliz!nd /#>Ob&ects i le plaseaz (n a4elations, a-ables i aVieRs ca membrii ai unui tabel" Qetoda claserelatie /ceast metod P4O-0$-0# genereaz toate clasele relaie pentru fiierul #>$ i le scrie (n fiierul program de ieire" Qetoda scrieclase() /ceast metod P4O-0$-0# lanseaz procesul de scriere al tuturor claselor" 0ste apelat de metoda 0xecuta dup ce metoda $iteste#bc (i termin treaba" Qetoda 2crieclase apeleaz metodele $laseCursor i $laseRelatie pentru a scrie clasele individuale (n fiierul de ieire" ,n ultim lucru pe care (l face aceast metod este s apeleze metoda 2crieClaseImplicite, care scrie o clas mediu de date implicit care are toi cursorii i relaiile n ea. Qetoda scrieclasecursor (tcClassName) Qetoda P4O-0$-0# scrie o singur clas cursor (n program, av!nd acelai nume cu cel al vederii sau cursorului" Qetoda scrieclaseimplicite P4O-0$-0# scrie o clas mediu de date implicit numit #efaultWde, care are toate clasele cursor i relaii din fiierul #>$" 9J Prog- , Cod pentru crearea clasei 'ump'BC i creaz i un program de ieire P)) $lass+ dumpdbc P)) Parent$lass+ custom P)) >ase$lass+ custom P)) $reaz clase $,42O4 i clase 40:/-7O1 pentru un "#>$" #0F710 $:/22 dumpdbc /2 custom P)) 1umrul de obiecte relaie din "#>$ P4O-0$-0# nrelations nrelations 5 D P)) 1umrul de obiecte tabel din "#>$ P4O-0$-0# ntables ntables 5 D P)) 1umrul de obiecte vedere din "#>$ P4O-0$-0# nvieRs nvieRs 5 D P)) 1umele "#>$ cdbcname 5 ;; P)) 1umele fiierului program care va fi creat cprgname 5 ;; 1ame 5 ;dumpdbc; P)) $alea unde se afl baza de date P4O-0$-0# cpat' P)) :ista obiectelor relaie din "#>$ P4O-0$-0# arelations[.\ P)) :ista obiectelor vedere din "#>$ P4O-0$-0# avieRs[.\ P)) :ista obiectelor tabel din "#>$ =D P4O-0$-0# atables[.\ P4O-0$-0# init P)) $itete "#>$)ul (ntr)un arra8 (tablou) " P4O-0$-0# P4O$0#,40 citestedbc 7F Udbused(t'is"c#bc1ame) OP01 #/-/>/20 (t'is"c#bc1ame) 01#7F P)) $itete "#>$ t'is"n-ables 5 a#>Ob&ects(t'is"a-ables, ;-able;) t'is"nVieRs 5 a#>Ob&ects(t'is"aVieRs, ;VieR;) t'is"n4elations 5 a#>Ob&ects(t'is"a4elations, ;4elation;) 01#P4O$ P)) 2crie toate clasele" P4O-0$-0# P4O$0#,40 scrieclase 20- -0V-Q04L0 -O (t'is"cP4L1/Q0) 1O2BOC 7F t'is"n-ables O D O4 t'is"nVieRs O D t'is"$lase$ursor() 01#7F 7F t'is"n4elations O D t'is"$lase4elatie() 01#7F t'is"2crie$lase7mplicite() 20- -0V-Q04L0 OFF =. 20- -0V-Q04L0 -O 01#P4O$ P)) Proceseaz toate clasele cursor (n "#>$" P4O-0$-0# P4O$0#,40 $lase$ursor :O$/: ln$ounter 20- -0V-Q04L0 O1 FO4 ln$ounter 5 . -O t'is"n-ables t'is"2crie$lase$ursor(t'is"a-ables[ln$ounter\) 01#FO4 FO4 ln$ounter 5 . -O t'is"nVieRs t'is"2crie$lase$ursor(t'is"aVieRs[ln$ounter\) 01#FO4 20- -0V-Q04L0 OFF 01#P4O$ P)) 2crie o clas cursor (n fiierul program de ieire" P4O-0$-0# P4O$0#,40 scrieclasecursor :P/4/Q0-042 tc$lass1ame X#0F710 $:/22 NN2-4-4/1(tc$lass1ame, c'r(93), ;W;)OO /2 cursor X alias 5 ;NNtc$lass1ameOO; X cursorsource 5 ;NNtc$lass1ameOO; X database 5 #/-/>/20P/-B % ;NNt'is"c#bc1ameOO; X01##0F710 X 01#P4O$ P)) Proceseaz i scrie toate clasele relaie" P4O-0$-0# P4O$0#,40 claserelatie =3 :O$/: ln$ounter, T lc$lass1ame, T lc$'ild/lias, T lcParent/lias, T lc$'ildOrder, T lc4elational0xpr 20- -0V-Q04L0 O1 FO4 ln$ounter 5 . -O t'is"n4elations lc$lass1ame 5 ;40:/-7O1;) /lltrim(2tr(ln$ounter)) lc$'ild/lias 5 t'is"a4elations[ln$ounter,.\ lcParent/lias 5 t'is"a4elations[ln$ounter,3\ lc$'ildOrder 5 t'is"a4elations[ln$ounter,9\ lc4elational0xpr 5 t'is"a4elations[ln$ounter,=\ X#0F710 $:/22 NNlc$lass1ameOO /2 relation X c'ildalias 5 ;NNlc$'ild/liasOO; X parentalias 5 ;NNlcParent/liasOO; X c'ildorder 5 ;NNlc$'ildOrderOO; X 4elational0xpr 5 ;NNlc4elational0xprOO; X01##0F710 X 01#FO4 20- -0V-Q04L0 OFF 01#P4O$ =9 P)) 2crie clasa mediului de date implicit (#ata 0nvironment) (n program P4O-0$-0# P4O$0#,40 scrieclaseimplicite :O$/: la$lasses[t'is"n-ables % t'is"nVieRs % t'is"n4elations\ FO4 ln$ounter 5 . -O t'is"n-ables la$lasses[ln$ounter\ 5 t'is"a-ables[ln$ounter\ 01#FO4 FO4 ln$ounter 5 . -O t'is"nVieRs la$lasses[ln$ounter%t'is"n-ables\ 5 t'is"aVieRs[ln$ounter\ 01#FO4 FO4 ln$ounter 5 . -O t'is"n4elations la$lasses[ln$ounter%t'is"n-ables%t'is"nVieRs\ 5 T ;4elation; % /::-47Q(2-4(ln$ounter)) 01#FO4 20- -0V-Q04L0 O1 X#0F710 $:/22 deWimplicit /2 #ata0nvironment FO4 ln$ounter 5 . -O /:01(la$lasses,.) lcOb&ect1ame 5 ]o]%la$lasses[ln$ounter\ lc$lass1ame 5 la$lasses[ln$ounter\ == X /## O>?0$- NNlcOb&ect1ameOO /2 NNlc$lass1ameOO 01#FO4 X01##0F710 X 20- -0V-Q04L0 OFF 01#P4O$ P4O$0#,40 executa P)) #ac nici un nume dbc nu este specificat, (ntreab de unul" 7F 0QP-^(t'is"c#>$1ame) t'is"c#>$1ame 5 L0-F7:0(;#>$;, ;2electati va rugam #>$ pentru clasa dump+;) 7F UF7:0(t'is"c#>$1ame) 5Q022/L0>OV(;1u este selectat nici un #>$U /nulamU;,.G) 40-,41 "F" 01#7F 01#7F P)) /celai lucru i cu "P4L 7F 0QP-^(t'is"cP4L1ame) t'is"cP4L1ame 5 P,-F7:0(;P4L pentru a fi creat+;,;;,;P4L;) 7F 0QP-^(t'is"cP4L1ame) 5Qessagebox(;Operatie anulataU;, .G) 40-,41 01#7F 01#7F =@ 7F 20-(;safet8;) 5 ;O1; /1# T F7:0(t'is"cP4L1ame) /1# T Qessage>ox(;4escriere existenta ; % T /::-47Q(t'is"cP4L1ame) % ;<;, 9G) _ G 5Qessagebox(;Operatie anulataU;, .G) 40-,41 01#7F P)) salveaz configurrile 2/F0-^ :O$/: lcOld2afet8 lcOld2afet8 5 20-(;safet8;) 20- 2/F0-^ OFF t'is"citestedbc() t'is"scrieclases() 20- 2/F0-^ AlcOld2afet8 01#P4O$ 01##0F710 Prog- A Program care ilustreaz utilizarea clasei 'umpdbc 2et $lass:ib to $'ap.H 2et $lass:ib to Fox-ool /##7-7V0 o#bcLen 5 $40/-0O>?0$-(;dumpdbc;) o#bcLen"c#>$1ame 5 ;testdata; o#bcLen"cP4L1ame 5 ;deleteme"prg; o#bcLen"xecuta() =G Prog- B Programul de ieire 'E)E5EME-P41 P Program"""""""""""+ deleteme"prg P #>$"""""""""""""""+ -02-#/-/"#>$ P Lenerated"""""""""+ /ugust 3I, .JJI ) .D+.G+39 _#0F710 databasepat' BOQ0()%;X-02-X; #0F710 $:/22 $:701- /2 cursor alias 5 ;$:701-; cursorsource 5 ;$:701-; database 5 #/-/>/20P/-B % ;-02-#/-/"#>$; 01##0F710 #0F710 $:/22 P4O#,20 /2 cursor alias 5 ;P4O#,20; cursorsource 5 ;P4O#,20; database 5 #/-/>/20P/-B % ;-02-#/-/"#>$; 01##0F710 #0F710 $:/22 /4-7$O:$OQ/1# /2 cursor alias 5 ;/4-7$O:$OQ/1#; cursorsource 5 ;/4-7$O:$OQ/1#; database 5 #/-/>/20P/-B % ;-02-#/-/"#>$; 01##0F710 #0F710 $:/22 $OQ01Z7 /2 cursor alias 5 ;$OQ01Z7; =H cursorsource 5 ;$OQ01Z7; database 5 #/-/>/20P/-B % ;-02-#/-/"#>$; 01##0F710 #0F710 $:/22 /1L/?/-7 /2 cursor alias 5 ;/1L/?/-7; cursorsource 5 ;/1L/?/-7; database 5 #/-/>/20P/-B % ;-02-#/-/"#>$; 01##0F710 #0F710 $:/22 40:/-70. /2 relation c'ildalias 5 ;$OQ01Z7; parentalias 5 ;$:701-7; c'ildorder 5 ;$O#$:; 4elational0xpr 5 ;$O#$:; 01##0F710 #0F710 $:/22 40:/-703 /2 relation c'ildalias 5 ;$OQ01Z7; parentalias 5 ;/1L/?/-7; c'ildorder 5 ;$O#/1L; 4elational0xpr 5 ;$O#/1L; 01##0F710 #0F710 $:/22 40:/-709 /2 relation c'ildalias 5 ;/4-7$O:$OQ/1#; parentalias 5 ;$OQ01Z7; c'ildorder 5 ;$O#$OQ/1#/; =I 4elational0xpr 5 ;$O#$OQ/1#/; 01##0F710 #0F710 $:/22 40:/-70= /2 relation c'ildalias 5 ;/4-7$O:$OQ/1#; parentalias 5 ;P4O#,20; c'ildorder 5 ;$O#P4O#,2; 4elational0xpr 5 ;$O#P4O#,2; 01##0F710 #0F710 $:/22 deWimplicit /2 #ata0nvironment /## O>?0$- o$lient /2 $lient /## O>?0$- oProduse /2 Produse /## O>?0$- o/rticolcomand /2 /rticolcomand /## O>?0$- o$omenzi /2 $omenzi /## O>?0$- o/nga&ati /2 /nga&ati /## O>?0$- o4elatie. /2 4elatie. /## O>?0$- o4elatie3 /2 4elatie3 /## O>?0$- o4elatie9 /2 4elatie9 /## O>?0$- o4elatie= /2 4elatie= 01##0F710 Qai este necesar s apelai metoda Open-ables() pentru a avea tabelele desc'ise i deasemenea s apelai metoda $lose-ables() pentru a (nc'ide tabelele" #0F710 $:/22 #03 /2 #ata0nvironment P4O$0#,40 7nit t'is"Open-ables() 01#P4O$ =J P4O$0#,40 #estro8 t'is"$lose-ables() 01#P4O$ 01##0F710 Creterea puterii mediului de date cu a!utorul sesiunilor de date ='ataSessions> Putei s realizai aplicaii mult mai flexibile, lucr!nd cu mai multe sesiuni de date" /cest lucru se (nt!mpl pentru a nu mai desc'ide toate fiierelor la (nceput, ci numai funcie de sesiunea de date corespunztoare" #e asemena, numai formularele pot crea sesiuni de date independente" $lasa care este creat ulterior nu se va putea aduga la un formular cu a&utorul lui /## O>?0$- sau /ddOb&ect(), ci va trebui s fie instaniat un obiect de acest tip cu a&utorul lui $reateOb&ect()" Prog- C Codul pentru clasa Sesiunededatenoua P)) $lass+ 2esiunededatenoua P)) Parent$lass+ form P)) >ase$lass+ form #0F710 $:/22 sesiunededatenoua /2 form #ata2ession 5 3 -op 5 D :eft 5 D Beig't 5 9@ Cidt' 5 .G3 #o$reate 5 "-" $aption 5 ;Form; Visible 5 "F" 1ame 5 ;sesiunededatenoua; @D P4O-0$-0# s'oR P4O-0$-0# visible 01##0F710 $lasa de mai sus a creat un formular care nu va pute a fi afiat, deoarece proprietatea Visible a fost configurat pe "F" i metoda 2BOC a fost prote&at de asemenea" Clasele nonvizuale sunt clasele care nu sunt proiectate (n primul r!nd pentru a fi afiate (n vreun fel" #e exemplu $ommand>utton este o clas creat pentru a fi afiat (ntr)un formular" $lasele nonvizuale (n Visual FoxPro sunt tipic descendente ale claselor $ustom i deseori nu conin componente care s poat fi afiate" $u toate acestea o clas nonvizual poate avea componente vizuale ataate la ea" #e asemenea, clasele vizuale pot fi baza pentru clasele nonvizuale" @.