Documente Academic
Documente Profesional
Documente Cultură
Visual Foxpro
Visual Foxpro
n anii precedeni de studiu, ai nvat c un calculator este o unealt electronic ce v poate ajuta s prelucrai informaia. Informaia prelucrat poate fi format din Cum folosii datele pentru a texte, numere, imagini sau sunete. Ea este pstrat pe prelucra informaiile. diferite medii de memorare, n diferite formate, sub Ce tipuri de date putei folosi. form de date. Aadar, orice rezolvare de problem Cum putei organiza datele ncepe prin definirea datelor, continu cu prelucrarea lor sub form de colecii de date. Ce colecii de date putei folosi (de exemplu atribuirea de valori) i se termin fie cu afiarea valorii lor, fie cu stocarea lor pe un mediu de n procesul de prelucrare a memorare n vederea prelucrrii lor ulterior. datelor.
Ce este o baz de date i cum sunt organizate datele ntr-o baz de date. Ce operaii putei executa pentru a obine informaii n urma prelucrrii datelor dintr-o baz de date.
Ai mai nvat c un calculator nu tie s prelucreze dect iruri de cifre binare care pot fi modelate fizic prin impulsuri de curent, cu dou niveluri de tensiune ce co6. respund celor dou cifre binare 0 i 1. Prin urmare, datele vor fi codificri binare ale informaiei existente n exteriorul calculatorului. Fiecrui tip de informaie i corespunde un anumit mod de stocare n mediul de memorare, adic un anumit tip de dat. Tipul datei determin att operaiile care se pot executa cu acele date, ct i modul n care sunt reprezentate pe mediul de memorare. Astfel, fiecare caracter dintr-un ir de caractere va fi reprezentat sub forma unui grup de 8 cifre binare corespunztoare codului ASCII asociat caracterului, iar asupra datelor de acest tip se pot aplica numai operatorul de concatenare i operatorii relaionali. Aadar, datele (data) sunt iruri de bii care sunt prelucrate de calculator. Data este o resurs la dispoziia programatorului i orice limbaj de programare permite folosirea mai multor tipuri de date. Indiferent de tipul de date ales, reprezentarea datei n memoria calculatorului (fie intern, fie extern) se face printr-un ir de bii. Pentru a realiza aceast reprezentare sunt implementai algoritmi de codificare care asigur corespondena dintre tipul de dat i irul de bii att la scrierea datelor, ct i la citirea lor. Tipul de dat ales de ctre programator influeneaz calitatea programului deoarece el determin dimensiunea zonei de memorie
5.
4 Informatic
alocat, algoritmul de codificare, operatorii admii pentru prelucrare i implicit timpul necesr prelucrrii. Analiza datelor se poate face n dou moduri: 9 Logic (la nivelul conceptual). De exemplu, o dat este un numr ntreg pozitiv, cu valori cuprinse ntre 0 i 100. 9 Fizic (la nivelul reprezentrii ei n memoria intern). De exemplu, n limbajul Pascal o dat de tip integer, iar n limbajul C o dat de tip int (dat numeric de tip ntreg) este reprezentat n 2 octei de memorie i permite memorarea datelor cu valori cuprinse ntre -32768 32767. La nivelul limbajului de programare este necesar s fie implementai diferii algoritmi care s permit folosirea acestui tip de dat: algoritmi de ncrcare a valorii datei n zona de memorie, algoritmi de adresare a zonei de memorie alocate, algoritmi de extragere a valorii din zona de memorie etc. Ai mai nvat c exist: 9 Date simple sau date elementare. Sunt date independente unele de altele din punct de vedere al reprezentrii lor n memorie. Chiar dac ele pot depinde din punct de vedere logic (valoarea unei date este dependent de valoarea altei date), ele nu depind din punct de vedere fizic (localizarea unei date pe suportul de memorare nu se face n funcie de locaia unei alte date pe suport). 9 Date compuse sau structuri de date. Sunt colecii de date ntre care exist anumite relaii (relaii structurale). Fiecare component a structurii are o anumit poziie n cadrul structurii, iar toate componentele formeaz un ntreg, astfel nct prelucrarea se poate face att la nivelul structurii de date (care poate fi considerat o entitate de sine stttoare), ct i la nivelul fiecrei componente. Pentru fiecare tip de structur de date n limbajul de programare trebuie s fie definii algoritmi de localizare a componentelor n cadrul structurii de date. ntre componentele structurii exist i legturi de coninut, adic ntregul ansamblu de date din colecie poate caracteriza un obiect, o persoan, un fenomen, un proces etc. De exemplu, un vector cu 12 elemente n care se memoreaz valorile lunare ale unui contor electric. Structura de date caracterizeaz n acest caz un proces: consumul lunar de curent electric. Aadar orice obiect, proces sau fenomen din lumea real poate fi caracterizat printr-o list de atribute. Valorile atributelor din list pot fi reprezentate fizic n calculator (lumea virtual) sub forma unei structuri de date. n anii precedeni de studiu ai lucrat cu urmtoarele structuri fizice de date: Structuri de date n memoria intern n memoria extern
nregistrarea
Fiierul de date
Structurile de date create n memoria intern sunt temporare dar permit o vitez de prelucrare mult mai mare dect a celor organizate n memorie extern. Pe de alt parte, structurile de date organizate n memoria extern sunt permanente i permit stocarea i prelucrarea unei cantiti mari de date.
Aadar, scopul programelor de calculator este de a prelucra datele pentru a furniza informaii. Aceast informaie poate fi pstrat pe diferite medii de memorare, n diferite formate, sub form de date. ntre datele prelucrate de un program exist diferite relaii. Modul n care vor fi aranjate aceste date n mediul de memorare depinde de legtura dintre ele.
1. Baza de date
Principalele probleme pe care le implic ns o colecie de date format dintr-un ansamblu de fiiere de date sunt: 9 Redundana datelor. Redundana reprezint o proprietate a unei colecii de date i se refer la faptul c unele componente ale coleciei sunt memorate de mai multe ori pe suportul de memorare. Date care reprezint aceeai informaie pot s apar n fiiere de date diferite, de multe ori cu formate de reprezentare diferite. Folosind mai multe copii ale acelorai date se consum inutil suport de memorare. Pe lng acest dezavantaj, mai exist i alte dezavantaje: se consum timpi suplimentari cu actualizarea datelor, deoarece se actualizeaz de mai multe ori acelai set de date (actualizarea se face n fiecare fiier de date n care setul de date apare), actualizarea datelor n toate fiierele de date este un proces dificil (fiecare posesor al unui fiier de date trebuie s fie informat de schimbrile survenite) i nu pot fi controlate erorile aprute n procesul de actualizare a datelor. 9 Actualizarea fiierelor i pstrarea integritii datelor. Actualizarea datelor trebuie s se fac n toate fiierele n care apar. Dac se omite un singur fiier, nu mai este asigurat integritatea datelor, iar rapoartele obinute cu aceste date vor conine informaii greite. 9 Dependena programelor de fiierele de date. Pentru exploatarea i ntreinerea fiecrui fiier de date, programatorii vor scrie cte un program. Orice modificare n structura fiierului de date va avea ca efect modificarea programului de aplicaie. n plus, n loc s se scrie un singur program pentru o colecie de date unic, se scriu mai multe programe, cte unul pentru fiecare colecie. Efectul este creterea costurilor pltite de ctre organizaie pentru programele care trebuie s-i furnizeze informaiile din fiierele de date. Ansamblurile independente de date erau folosite n general n folosul unui singur departament al organizaiei i mai puin n folosul ntregii organizaii. Soluia care poate rezolva aceast problem este reunirea datelor ntr-o colecie unic numit baza de date. n acest mod, organizaia i poate exercita controlul asupra tuturor datelor. Controlul se execut prin intermediul administratorului bazei de date (database administrator - DBA) care este o poziie n cadrul administraiei (ocupat de una sau mai multe persoane) ce are ca atribuie stabilirea datelor care sunt necesare n cadrul organizaiei sau la nivelul fiecrui departament. Administratorul bazei de date mai poate s stabileasc i modul n care se execut accesul la date, adic s hotrasc pentru fiecare persoan din organizaie setul de date din colecia de date la care are acces. Pe parcursul exploatrii bazei de date, el poate s hotrasc modificarea structurii bazei de date n funcie de noile cerine ale utilizatorilor.
6 Informatic
Resurse umane
Salarizare
Producie
Marketing
Aprovizionare
Stocuri
Furnizori
Clieni
Comenzi
Fiecare departament al companiei i-a creat i ntreinut propriul fiier de date: 9 Departamentul Resurse umane are fiierul Angajai n care sunt pstrate date despre angajaii companiei: numele, codul numeric personal, adresa, numrul de telefon, data naterii, data angajrii, studii, experien, funcia i departamentul n care lucreaz, istoricul posturilor ocupate, data fiecrei avansri etc. 9 Departamentul Salarizare are fiierul Salarii n care sunt pstrate date despre salariile angajailor companiei: numele i prenumele salariatului, codul numeric personal, adresa, funcia deinut, treapta de salarizare, salariul tarifar, numrul de ore lucrate, reineri lunare, salariul lunar etc. 9 Departamentul Relaii cu clienii are fiierele Clieni n care sunt pstrate date despre clienii companiei (numele companiei client, adresa, numele persoanei de contact, telefonul etc.) i Comenzi n care sunt pstrate informaii despre comenzile clienilor (numrul comenzii, clientul care a emis comanda, coninutul comenzii, data comenzii etc.). 9 Departamentul Aprovizionare are fiierele Stocuri n care sunt pstrate date despre stocul de materiale i materii prime necesare produciei (denumirea materialului, unitatea de msur, cantitatea etc.) i Furnizori n care sunt pstrate date despre furnizorii de materii prime i materiale ale companiei (numele companiei furnizor, adresa, numele persoanei de contact, telefonul etc.). 9 Departamentul Marketing are fiierele Vnzri n care sunt pstrate date despre vnzrile de produse ale companiei (denumirea produsului, unitatea de msur, cantitatea, data vnzrii, persoana care a intermediat vnzarea, date despre clientul care a cumprat produsul etc.) i Catalog_produse care conine un catalog cu oferta de produse a companiei (denumirea produsului, descrierea produsului, unitatea de msur, preul etc.). 9 Departamentul Producie are fiierele Produse n care sunt pstrate date despre produsele realizate: denumirea produsului, unitatea de msur, cantitatea, data la care a fost realizat produsul etc.
Deoarece datele companiei se gsesc n mai multe fiiere de date independente, apar urmtoarele dezavantaje: 1. Departamentele nu pot folosi n comun datele de care au nevoie. ntre fiierele cu date ale departamentelor nu exist posibilitatea de comunicare, iar departamentele nu pot folosi n comun aceste date. De exemplu, dac angajaii implicai n vnzri sunt pltii n funcie de coeficientul vnzrilor lunare i nu conform unui salariu tarifar, informaiile necesare calculrii drepturilor salariale ale acestor persoane se gsesc n fiierul Vnzri. La acest fiier nu are acces funcionarul din departamentul Salarizare care are nevoie de ele pentru a calcula salariul lunar al angajailor ce se ocup cu vnzarea produselor. Aceasta nseamn c o persoan din departamentul Marketing va extrage din fiierul Vnzri o list cu angajaii implicai n vnzri n luna respectiv i cu volumul valoric al vnzrilor fiecruia dintre ei. La rndul su, persoana din departamentul Salarizare va trebui s actualizeze fiierul Salarii pe baza listei primite. 2. Ansamblul de fiiere de date are o redundan foarte mare. Colecia de fiiere de date are o redundan mare deoarece foarte multe din date sunt duplicate, fiind memorate n mai multe fiiere de date. De exemplu, unele informaii despre angajai sunt memorate i n fiierul Salarii aflat n ntreinerea compartimentului Salarizare, dar i n fiierul Angajai aflat n ntreinerea compartimentului Resurse umane sau unele informaii despre produsele realizate pot s apar att n fiierul Produse aflat n ntreinerea compartimentului Producie, ct i n fiierul Catalog_produse aflat n ntreinerea compartimentului Marketing. 3. Orice micare n cadrul companiei necesit intervenia n mai multe fiiere de date. De exemplu, datele despre un client pot s apar att n fiierul Clieni, ct i n fiierul Vnzri. Dac un client i schimb adresa, modificarea trebuie fcut n ambele fiiere. Deci, o persoan din cadrul companiei trebuie s aib grij s informeze cele dou persoane care se ocup de actualizarea celor dou fiiere din cele dou departamente ca s fac aceste modificri. Aceasta nseamn c la nivelul companiei ar trebui s existe o persoan care s aib cunotine despre toate aceste fiiere de date, de structura lor i de toate schimbrile care apar n cadrul companiei i care pot afecta aceste date. Aceast persoan ar trebui s informeze, atunci cnd este cazul, departamentele care trebuie s-i actualizeze datele, ce date trebuie s actualizeze i cu ce valori, altfel nu ar mai putea fi asigurat integritatea datelor. Deficiene pot s apar chiar dac aceast persoan informeaz corect departamentele. Persoana care face modificri ntr-un fiier de date poate s scrie greit o valoare, astfel nct la nivelul companiei, aceeai dat va avea valori diferite, n fiiere diferite. Soluia este reunirea acestor fiiere de date ntr-o singur colecie de date: baza de date. n aceast colecie pot fi eliminate datele duplicate (de exemplu informaiile des-pre un client care apar i n fiierul Clieni i n fiierul Vnzri i n fiierul Comenzi), micorndu-se foarte mult redundana datelor. Deoarece datele se vor gsi o singur dat, n aceeai colecie, actualizarea lor se poate face mult mai uor, asigurndu-se astfel integritatea datelor. n plus, angajaii unui departament pot avea acces i la datele produse de un alt departament. Principala problem care apare n acest caz este ca angajaii unui departament s aib acces numai la datele care le sunt strict necesare i nu la toate datele companiei. De exemplu, persoana care se ocup de coresponden trebuie s aib acces numai la
8 Informatic
adresele angajailor, ale clienilor i ale furnizorilor pentru a putea expedia corespondena, nu i la alte date despre acetia: salariile angajailor, conturile bancare ale clienilor, facturile emise ctre clieni i alte tranzacii financiare fcute de companie. Aadar, principalul avantaj al bazelor de date l reprezint partajarea datelor unei organizaii ntre membrii ei, iar principalul dezavantaj este necesitatea controlrii accesului la datele importante din colecie.
T T
Identificai n colecia de fiiere de date a companiei datele redundante. Identificai n aceeai colecie datele care sunt necesare mai multor departamente. Presupunnd c datele companiei se organizeaz ntr-o colecie unic, dai exemple de date la care trebuie controlat accesul angajailor companiei.
Considerai c coala voastr este o organizaie format din mai multe compartimente. Analizai activitatea din coala voastr i punei n eviden fiierele de date care pot fi folosite pentru a ine evidena activitilor care au loc la nivelul colii i la nivelul fiecrei clase. Artai care sunt deficienele acestei colecii de fiiere de date.
Baza de date (database) este o colecie de fiiere i nregistrri legate ntre ele.
Pentru a permite accesul difereniat la datele din colecia de date, se poate defini o schem general a bazei de date care descrie ntreaga colecie de date i diferite scheme pariale care descriu seturile de date din colecie la care pot avea acces anumii utilizatori sau anumite grupuri de utilizatori. Aadar, avantajele folosirii bazelor de date n locul fiierelor de date sunt: 9 Partajarea informaiilor. Spre deosebire de datele din fiierele de date la care au acces numai utilizatorii care le-au creat i le ntrein, la datele din baza de date pot avea acces toi membrii unei organizaii, care i vor partaja datele din baza de date. Pot fi create aplicaii noi care s foloseasc datele din mai multe colecii de date i care s furnizeze informaii noi folosind tot ansamblul de date. n acest mod, fiecare utilizator are senzaia c este beneficiarul unic al coleciei de date.
9 Creterea cantitii de informaii disponibile unui utilizator. Deoarece datele produse de un compartiment al organizaiei pot fi folosite de toi membrii organizaiei i nu numai de membrii compartimentului respectiv, crete cantitatea de informaii la care au acces membrii organizaiei, chiar dac se vor impune unele restricii de acces pentru unele grupuri de membri. Gruparea datelor ntr-o colecie unic de date face posibil ca utilizatorul s poat obine toate datele legate logic de o dat elementar de care el are nevoie pentru a-i desfura activitatea n cadrul companiei. 9 Micorarea redundanei datelor. Membrii organizaiei vor avea acces la aceeai colecie de date n loc s-i creeze fiecare propria colecie de date, care nseamn de fapt existena acelorai date n mai multe colecii (multiplicarea unor seturi de date). Rmn multiplicate numai acele date care trebuie s asigure coerena bazei de date. Prin eliminarea datelor multiplicate se micoreaz i spaiul de memorie extern alocat pentru colecia de date i timpul de actualizare a coleciei de date deoarece o dat va fi actualizat o singur dat, n cadrul coleciei, i nu de mai multe ori, n fiecare fiier de date n care apare. 9 Consistena datelor. Actualizarea datelor din baza de date este perceput de fiecare utilizator al bazei de date, nu numai de utilizatorii din compartimentul care gestioneaz acele date. Deoarece nu mai exist mai multe copii ale acelorai date, se elimin situaiile n care pot s apar valori diferite pentru aceeai dat. 9 Integritatea datelor. Un alt efect al eliminrii redundanei datelor este integritatea datelor, deoarece datele vor fi actualizate ntr-un singur loc (n baza de date) i nu n fiecare colecie de date (n fiierele de date). n plus, pot fi adugate diferite proceduri pentru validarea datelor introduse sau actualizate. Astfel, nu mai exist riscul s apar neconcordane ntre datele care corespund acelorai informaii, dar care aparin la colecii diferite de date, sau riscul ca datele s fie incorecte (s nu aparin domeniului de definiie). 9 Securitatea datelor. Se poate asigura mult mai uor pentru o singur colecie de date (baza de date) dect pentru mai multe colecii de date (fiierele de date). Astfel, numai utilizatorii autorizai vor avea acces la un anumit set de date din colecia de date. 9 Controlul centralizat al datelor. Prin stabilirea unui administrator al bazei de date se poate asigura controlul tuturor datelor din colecia de date (baza de date), dect n cazul coleciilor de date independente (fiierele de date) unde fiecare utilizator i exercit controlul la nivelul propriei colecii de date. 9 Transparena. Utilizatorul poate obine informaii din baza de date fr s cunoasc toat organizarea ei complex. 9 Dezvoltarea standardelor. Se pot dezvolta standarde referitoare la bazele de date att la nivelul organizrii logice a datelor, ct i la nivelul limbajelor pentru manipularea i interogarea datelor, standarde care s permit transferul datelor dintr-o baz de date n alta. Cererea de date se poate face prin intermediul unui limbaj simplu, prin precizarea criteriului de selectare a datelor i a modului de prezentare a informaiilor. 9 Independena datelor. Se asigur dou tipuri de independen a datelor: independena fizic i independena logic. Independena fizic nseamn independena datelor fa de programele de aplicaie, adic orice modificare a structurii datelor nu afecteaz programul de aplicaie i reciproc, orice modificare a programului de aplicaie nu afecteaz structura de date. Independena logic nseamn independena fiecrei scheme particulare a unui utilizator fa de schema general, adic pot fi definite noi cmpuri i pot fi adugate noi nregistrri n baza de date fr s fie afectai utilizatorii care nu au
10 Informatic
nevoie de ele. n plus, baza de date poate fi reorganizat (pot fi regrupate cmpurile din nregistrri) pentru a face fa cerinelor unui nou utilizator, fr a fi afectai vechii utilizatori. Eliminarea unor entiti din baza de date poate afecta ns utilizatorii care fac referiri la acele entiti.
Utilizatorul bazei de date Este o persoan care este membru al organizaiei i are dreptul s foloseasc baza de date pentru a obine informaii. El poate fi i o persoan exterioar organizaiei, creia organizaia i-a permis accesul la anumite informaii. De obicei nu este specialist n informatic i nu cunoate tehnicile folosite n exploatarea bazelor de date. Informaiile i sunt furnizate n termenii aplicaiei i nu n termenii tehnici folosii n bazele de date. Software-ul de aplicaie Prezint imaginea datelor ntr-o form accesibil utilizatorului i permite personalizarea sistemului de gestiune a bazelor de date folosit. Rolul su este de a prezenta informaia n mod interactiv, n termeni specifici aplicaiei, prin intermediul unei interfee. Nu are rolul de a gestiona datele. Aplicaia poate comunica cu utilizatorul fie printr-un sistem de ntrebri i rspunsuri, fie prin intermediul unor formulare completate de ctre utilizator. Software-ul de aplicaie poate fi conceput fie de programatori, n cazul bazelor de date mari, distribuite pe mai multe calculatoare ale organizaiei, fie chiar de unii utilizatori ai bazei de date, n cazul bazelor de date mici, organizate pe microcalculatoare.
11
Pentru gestionarea datelor din baza de date trebuie s folosii un Sistem de Gestiune a Bazelor de Date (SGBD).
12 Informatic
9 Programele de aplicaii sunt uor de scris deoarece ele descriu datele folosind modelul conceptual al bazei de date (numele entitilor care formeaz baza de date) i nu structura fizic a datelor nregistrate pe suportul de memorare.
Sistemul de gestiune a bazelor de date furnizeaz instrumentele necesare pentru manipularea datelor, dintre care cele mai importante sunt: 9 cutarea uneia sau a mai multor entiti care ndeplinesc anumite criterii, 9 sortarea n diferite moduri a diferitelor entiti din baza de date, 9 generarea unor raporte folosind datele stocate n baza de date, 9 generarea unor formulare pentru introducerea i validarea datelor. Baza de date Reprezint un model de organizare a datelor oferit de sistemul de gestiune a bazelor de date folosit. n cazul fiierelor de date exist dou niveluri de organizare a datelor: nivelul logic care const n descrierea structurii de cmpuri de ctre programator i nivelul fizic care const n metodele de nregistrare i regsire a datelor la nivelul suportului de date. n cazul bazelor de date, pentru asigurarea independenei datelor, organizarea trebuie s se fac pe cel puin trei niveluri:
Nivelul extern
(modelul extern) vizualizrile
Nivelul conceptual
(modelul conceptual) descrierea bazei de date
Nivelul intern
(modelul intern) baza de date fizic
9 Nivelul intern sau baza de date fizic este reprezentat de colecia de fiiere nregistrate pe suportul de memorare, fiiere care conin datele propriu-zise dar i informaiile suplimentare, necesare accesului la datele din baza de date. 9 Nivelul conceptual reprezint descrierea unitilor logice din care este format baza de date i a legturilor dintre ele. Tot n modelul conceptual sunt specificate constrngerile aplicate asupra datelor, care determin restricii ale operaiilor de actualizare. Ele sunt necesare pentru a asigura integritatea datelor. 9 Nivelul extern reprezint modelul extern cu care opereaz utilizatorul bazei de date. Acesta este format din unitile logice de la nivelul conceptual cu care opereaz un utilizator sau un grup de utilizatori. Pentru modelul extern se mai folosete i termenul de vizualizare (view) sau tabel virtual, deoarece se definete pe baza unei expresii
13
relaionale aplicate cmpurilor din tabelele reale ale bazei de date. Vizualizarea pstreaz numai schema prin care este definit, nu i datele propriu-zise, pe care le preia din tabelele reale de fiecare dat cnd este folosit. Cea mai important utilitate a unei vizualizri este aceea c prin intermediul ei se poate controla accesul unui grup de utilizatori la baza de date. Deoarece utilizatorul are acces la baza de date nu prin modelul conceptual, ci prin vizualizri, acestea pot s ascund unui utilizator acele uniti logice la care nu are drept de acces. Vizualizrile pot s controleze i operaiile pe care le poate executa cu unitile logice: unele vizualizri i permit s actualizeze unele uniti logice, altele i permit numai s le consulte. De exemplu, dac se construiete o baz de date a companiei, n tabelul Angajai este nregistrat data naterii pentru fiecare angajat. Dac o anumit categorie de utilizatori (de exemplu personalul din compartimentul Resurse Umane) dorete o list cu angajaii dintr-un compartiment i vrsta lor, nu se recomand nregistrarea vrstei ca unitate logic n modelul conceptual deoarece ar trebui actualizat zi de zi. Cel mai simplu este s se creeze o vizualizare pentru aceast categorie de utilizatori n care se definete entitatea vrst. Aceast entitate se calculeaz ca diferen dintre data curent furnizat de sistem i data naterii nregistrat ntr-unul din tabelele bazei de date. est pentru evaluare:
n baza de date avei un tabel cu notele elevilor, care are urmtoarele cmpuri: codul elevului, disciplina, data notrii, nota. Pentru a afla mediile semestriale ale elevilor dintr-o clas la fiecare disciplin, ce soluie se poate alege: s se creeze un tabel cu mediile elevilor (care s aib urmtoarea structur: codul elevului, codul disciplinei, media) sau s se creeze o vizualizare cu aceeai structur? Modelul de date ofer instrumentele necesare interpretrii datelor din colecia de date. El este format din dou componente: 9 un set de reguli pentru organizarea i structurarea datelor, 9 un set de reguli care definesc operaiile pentru manipularea datelor. Se pot folosi mai multe modele pentru organizarea bazelor de date.
14 Informatic
Baze de date ierarhice (hierarchical database). n acest model de organizare a bazelor de date entitile (cmpurile i nregistrrile) sunt structurate sub form de noduri. Nodurile sunt puncte care conecteaz ramurile unui arbore descendent. Un nod de pe nivelul inferior este subordonat unui singur nod din nivelul ierarhic imediat superior, dar poate fi n relaie cu n noduri aflate la nivelul inferior. Altfel spus fiecare entitate are un singur nod printe (parent node), dar un printe poate avea mai multe noduri copil (child nodes). Pentru a gsi un anumit cmp trebuie s se porneasc cu nodul printe de pe primul nivel i s se coboare pe arbore pn la copilul care conine acel cmp. Un exemplu de organizare ierarhic este baza de date pentru sistemul de rezervri la liniile aeriene, structurat pe 4 niveluri. Nodul printe de pe primul nivel este oraul de plecare Bucureti. Acest printe are patru copii: Cluj, Constana, Iai i Timioara, care reprezint oraele de sosire. Nodul Timioara are la rndul su doi copii: 210 i 211 care reprezint numrul zborurilor. Zborul 210 are la rndul su trei copii, pasagerii.
plecare
Cluj Constana Bucureti
Iai
Timioara
210
211
Ionescu Alexandru
Clin Mircea
Andronescu Ana
ntr-un astfel de tip de organizare apar urmtoarele probleme: 9 Dac se terge un nod printe, se terg toate nodurile copil subordonate. 9 Un nod copil poate fi adugat numai dac au fost adugate mai nti nodurile printe. 9 ntre nodurile copii nu pot fi stabilite relaii. Baze de date reea (network database). i n acest caz exist o aranjare ierarhizat a nodurilor, cu deosebirea c un nod copil poate s aib mai multe noduri prini. ntre nodurile printe i nodurile copil se adaug conexiuni adiionale numite pointere. Aceasta nseamn c unui nod i se poate aduga o cale nou i c pot fi trasate n jos ramuri noi. n aceast organizare, fiecare entitate poate avea un numr nelimitat de conexiuni, disprnd noiunea de entitate ierarhic superioar. produse
Produsul 1 Produsul 2 Produsul 3
ansambluri
Ansamblul 1
Ansamblul 2
Ansamblul 3
piese
Piesa 1
Piesa 2
Piesa 3
Piesa 4
Piesa 5
Un exemplu de astfel de organizare este baza de date a produselor care se execut ntr-o fabric. Fiecare produs este format din mai multe ansambluri, iar fiecare ansamblu este format din mai multe piese. Fiecare pies poate intra n componena mai multor ansam-
15
bluri, iar fiecare ansamblu poate intra n componena mai multor produse. n acest exemplu se poate observa c organizarea de tip reea este mai flexibil i n multe cazuri mai eficient dect cea ierarhic. Baze de date relaionale (relational database). Cel mai flexibil model de organizare l reprezint bazele de date relaionale, n care nu exist o cale de acces ierarhizat la o anumit dat. Baza de date este format din mai multe tabele, fiecare dintre ele fiind format din linii i coloane. Un tabel este numit o relaie. elevi
identif. elev nume prenume ... adresa identif. dat elev absen
absene
identif. identif. disciplin profesor
discipline
identif. nume disciplin ........... identif. profesor
profesori
nume .............
S construim o baz de date a colii. S considerm tabelul elevi care conine date despre elevii colii: identificatorul elevului, numele, prenumele, data naterii, numrul de telefon i adresa. Un alt tabel, absene, conine date despre absenele elevilor din toat coala: identificatorul elevului, data absenei, identificatorul disciplinei i identificatorul profesorului. Aceste dou tabele sunt legate printr-un cmp comun numit cmp cheie. n acest caz, cmpul cheie este identificatorul elevului. Aceasta nseamn c ntre tabelul elevi i tabelul absene s-a stabilit o relaie prin intermediul unui cmp cheie care conine o informaie comun ambelor tabele i anume identificatorul elevului. n tabelul profesori se pstreaz date despre profesorii din coal: nume, prenume, discipline la care predau, grad didactic, adres, numr telefon etc. Tabelul profesori se leag de tabelul absene prin cmpul cheie identificatorul profesorului. n tabelul discipline se pstreaz date despre disciplinele predate n coal: nume, profilul clasei i anul de studiu, numrul de ore etc. Tabelul discipline se leag de tabelul absene prin cmpul cheie identificatorul disciplinei. Aceste patru tabele formeaz mpreun o baz de date relaional (relational database). Baza de date a colii mai poate fi completat i cu alte tabele ca de exemplu, tabelul cu date despre prinii elevilor (prini) care se va lega de tabelul elevi prin cmpul cheie identificatorul elevului, tabelul cu date despre notele elevilor (note) care se va lega de tabelul elevi prin cmpul cheie identificatorul elevului, de tabelul profesori prin cmpul cheie identificatorul profesorului i de tabelul discipline prin cmpul cheie identificatorul disciplinei, tabelul cu date despre clase (clase) care conine date despre clasele din coal (identificator clas, an de studiu, identificatorul profesorului diriginte) care se va lega de tabelul elevi prin cmpul cheie identificatorul clasei, iar de tabelul profesori prin cmpul cheie identificatorul profesorului etc.
16 Informatic
Fiecare rnd din tabel n care se gsesc informaii despre un elev corespunde unei nregistrri de date. Fiecare coloan cu informaii corespunde unui cmp (de exemplu, coloana adres). Capul de tabel (antetul tabelului) definete structura tabelului i se mai numete i nregistrare de structur. Datele sunt nregistrate n baza de date prin intermediul structurii definite n nregistrarea de structur. La crearea unui tabel trebuie definit mai nti structura tabelului (capul de tabel), adic trebuie precizate cmpurile care o compun, ct i caracteristicile acestora.
Deoarece interfeele puse la dispoziie de sistemele de gestiune a bazelor de date relaionale folosesc n general termenii de tabel (table), cmp (field) i nregistrare (record), vom folosi n continuare aceti termeni pentru a defini obiectele corespunztoare ale bazei de date.
17
18 Informatic
Definirea unei relaii ntre cele dou tabele are ca efect stabilirea unor legturi ntre nregistrrile celor dou tabele.
Pentru a putea stabili legturi ntre tabele, se definesc n tabele chei de identificare. Cheia de identificare este format din numrul minim de cmpuri alese astfel nct ansamblul lor de valori s fie unic n cadrul unui tabel pentru a permite identificarea nregistrrilor din tabel. Aadar, fiecare nregistrare va putea fi identificat n mod unic prin valorile cheii astfel definite. Este posibil ca ntr-un tabel s poat fi evideniate mai multe grupuri de cmpuri care s permit identificarea n mod unic a nregistrrilor tabelului, deci pot fi definite mai multe chei de identificare. Deoarece un tabel nu poate avea dou nregistrri identice, orice tabel poate avea cel puin o cheie de identificare, format n cel mai ru caz din toate cmpurile nregistrrii. Cheia primar este aleas din mulimea cheilor de identificare pe baza anumitor criterii i este folosit pentru a face legtura ntre nregistrrile mai multor tabele ale bazei de date. Cheia primar va fi folosit de sistemul de gestiune a bazelor de date pentru a identifica unic nregistrrile n procesul de cutare i regsire a datelor. Se recomand ca din mulimea cheilor de identificare s se aleag, pentru cheia primar, cheia care este format din cele mai puine cmpuri. Cheia secundar este format dintr-unul sau mai multe cmpuri dintr-un tabel, care sunt folosite ca o cheie primar n alt tabel, valorile cmpurilor din cheie fiind identice n ambele tabele. Se mai numete i cheie strin. Legtura dintre tabelele bazei de date se realizeaz prin mecanismul de propagare a cheilor. n tabelul surs, tabelul de la care ncepe propagarea cheii (tabelul conductor), se gsete cheia primar, iar n tabelul destinaie, tabelul pn la care se propag cheia (tabel condus), se gsete cheia secundar. Se spune c a avut loc propagarea cheii din tabelul surs n tabelul destinaie. Acest mecanism permite stabilirea legturii ntre o nregistrare din tabelul surs i o nregistrare din tabelul destinaie. Condiia care trebuie respectat pentru a putea fi asigurat aceast legtur se numete condiia de integritate referenial.
19
Integritatea referenial
Este specific relaiilor dintre tabelele bazei de date. Ea nseamn o colecie de reguli i restricii impuse tabelelor ntre care s-au stabilit relaii. Astfel, a asigura integritatea referenial nseamn ca atunci cnd se fac modificri ale valorii unui cmp dintr-un tabel s nu fie afectat relaia dintre tabele. Aceast problem apare n cazul cmpurilor care fac parte dintr-o cheie primar sau secundar. Ele trebuie s respecte condiia de integritate referenial.
Condiia de integritate referenial impune ca mulimea valorilor unei chei secundare s fie inclus n mulimea valorilor cheii primare din care s-a propagat.
Integritatea referenial trebuie s fie satisfcut permanent n baza de date. Operaiile de adugare, tergere i modificare pot afecta integritatea referenial: n tabelul condus: 9 Operaia de adugare a unei nregistrri trebuie s se fac numai dac valorile din cmpurile secundare se gsesc n mulimea valorilor cheilor primare din care s-au propagat. 9 Operaia de tergere a unei nregistrri se poate face fr s fie afectat integritatea referenial. 9 Operaia de modificare a valorii unui cmp dintr-o nregistrare trebuie s aib n vedere faptul c dac acel cmp este un cmp secundar, valoarea sa trebuie s se gseasc n mulimea valorilor cheii primare din care s-a propagat. n tabelul conductor: 9 Operaia de adugare a unei nregistrri se poate face fr s fie afectat integritatea referenial. 9 Operaia de tergere a unei nregistrri poate s afecteze relaiile dintre tabele numai n cazul n care exist chei secundare care au aceeai valoare cu a cheii primare din nregistrarea tears. n acest caz se pot folosi dou metode: tergerea restricionat (nu se accept tergerea nregistrrii dac exist cel puin o cheie secundar ntr-unul din tabelele bazei de date, propagat din cheia primar care are aceeai valoare cu cheia primar din nregistrarea pe care vrei s o tergei) sau tergerea n cascad (tergerea nregistrrii va avea ca efect tergerea din toate tabelele a nregistrrilor care conin chei secundare propagate din cheia primar i care au aceeai valoare cu cheia primar din nregistrarea tears). 9 Operaia de modificare a unei nregistrri poate s afecteze relaiile dintre tabele numai n cazul n care exist chei secundare care au aceeai valoare cu a cheii primare care se modific. i n acest caz se pot folosi dou metode: modificarea restricionat (nu se accept modificarea unui cmp dac el este cheie primar i exist cel puin o cheie secundar ntr-unul din tabelele bazei de date propagat din cheia primar care are aceeai valoare cu cheia primar pe care vrei s o modificai) sau modificarea n cascad (modificarea cheii primare va avea ca efect modificarea tuturor cheilor secundare propagate din aceasta, din toate tabelele, care au aceeai valoare cu cheia primar care se modific).
20 Informatic
21
9 fiiere ajuttoare n care este descris structura tabelelor (fiierele de structur), legturile dintre ele i alte informaii necesare regsirii datelor n tabele (cum sunt fiierele index care permit regsirea datelor n baza de date n funcie de valoarea unui cmp cheie i care asigur accesul direct la date) sau interpretrii lor (cum sunt fiierele pentru rapoarte).
Modelul relaional are urmtoarele avantaje fa de celelalte modele de organizare: 9 Este un model uor de neles de ctre utilizator i uor de vizualizat. 9 Asigur independena structurii logice a datelor fa de modul de stocare fizic a lor. 9 Regulile i restriciile care asigur integritatea datelor i protejarea datelor i a structurii de date sunt uor de neles de ctre utilizator. 9 Spaiul de stocare a datelor este redus. 9 Redundana datelor este redus.
22 Informatic
9 Tabelul Produse n care sunt pstrate date despre produsele realizate: codul produsului, denumirea produsului, unitatea de msur, cantitatea, data la care a fost realizat produsul, preul de fabricaie etc. 9 Tabelul Catalog_produse n care sunt pstrate date despre produsele oferite de companie: codul produsului, denumirea produsului, descrierea produsului, unitatea de msur, preul etc.
n aceste tabele apar mai multe cmpuri de tip: cod produs, cod angajat, cod client sau cod furnizor. Ele se folosesc pentru a identifica unic nregistrrile din tabele. Pentru aceste tabele pot fi definite diferite chei de identificare. De exemplu, pentru tabelul Angajai se poate folosi pentru cheie cmpul cod_angajat sau cod_numeric_personal deoarece ele identific unic un angajat din tabel. Cmpurile nume_prenume, funcie sau departament nu pot fi folosite pentru cheia de identificare pentru c ele nu pot identifica unic nregistrrile din tabel (angajaii) deoarece pot exista mai muli angajai care au acelai nume i prenume sau care au aceeai funcie ori lucreaz n acelai departament. Cmpurile cod_angajat i cod_numeric_personal nu pot forma mpreun o cheie de identificare deoarece cheia presupune numrul minim de cmpuri necesar identificrii, iar n acest exemplu, fiecare cmp n parte este suficient pentru identificarea angajatului. Pentru tabelul Stocuri sunt necesare dou cmpuri pentru a obine cheia de identificare a unei nregistrri: cod_material i cod_depozit, deoarece fiecare dintre aceste cmpuri luate separat nu pot identifica unic o nregistrare din tabel: exist mai multe cmpuri cod_material cu aceeai valoare, cte unul pentru fiecare depozit n care se gsete n stoc acel material i mai multe cmpuri cod_depozit cu aceeai valoare, cte unul pentru fiecare material care exist n acel depozit. Dac n tabelul Clieni cmpul cod_client este cheie primar deoarece el identific unic un client, n tabelul Comenzi el va fi cheie secundar i va permite stabilirea unei relaii ntre tabelul Clieni i tabelul Comenzi. Pentru a fi ndeplinit condiia de integritate referenial, nu trebuie s existe nici o comand n tabelul Comenzi care s nu corespund unui client din tabelul Clieni.
Salarii
Catalog produse
Clieni
Catalog materiale
Furnizori
Angajai
Vnzri
Produse
Comenzi
Stocuri
23
ntre tabelele bazei de date ale companiei se vor stabili mai multe legturi. De exemplu, ntre tabelul Catalog_produse i tabelul Produse sau ntre tabelul Catalog_produse i tabelul Vnzri prin intermediul cheii cod_produs. Baza de date poate conine: 9 Tabele corelate. Sunt tabele ntre care se stabilesc legturi. De exemplu, ntre tabelele Clieni i Comenzi exist o legtur realizat prin intermediul codului clientului care a emis comanda (cheia cod_client). 9 Tabele necorelate. Sunt tabele ntre care nu se stabilesc legturi. De exemplu, ntre tabelele Stocuri i Salarii nu exist nici un fel de legtur. n acest caz tabelele se folosesc pentru a separa date diferite ntre ele.
Considernd c sgeile reprezint o relaie ntre un tabel conductor i un tabel condus, precizai cheile primare i cheile secundare care pot fi folosite pentru a realiza legtura ntre tabele (sensul sgeii reprezint legtura ntre tabelul conductor i tabelul condus). Pe baza structurii de cmpuri precizat pentru fiecare tabel i pe baza legturilor stabilite ntre tabele, identificai datele redundante din tabele (de exemplu denumirea produsului i unitatea de msur care apar att n tabelul Vnzri, ct i n tabelul Produse). Eliminai datele redundante.
Relaia
Este o legtur dintre un cmp sau o combinaie de cmpuri dintr-un tabel (cheia primar) i cmpurile corespunztoare dintr-un alt tabel (cheia secundar). Exist mai multe tipuri de relaii: 1. Una-la-una (one-to-one). nseamn c o nregistrare din primul tabel este legat la o singur nregistrare din al doilea tabel. Este posibil i cazul n care o nregistrare din primul tabel nu este legat cu nici o nregistrare din al doilea tabel. Aceast relaie este similar cu un tabel care conine ambele tabele. Se folosesc ns dou tabele din urmtoarele motive: Tabelul A Tabelul B 9 Un tabel unic ar fi un tabel foarte mare, cu o structur care poate depi numrul maxim de cmpuri a1 b1 acceptat de sistemul de gestiune a a2 b2 bazelor de date (de exemplu, 255 de cmpuri n Visual FoxPro). a3 b3 9 Numrul de cmpuri din nregisa4 b4 trrile tabelului nu sunt fixe (unele nregistrri au nevoie de mai multe a5 cmpuri dect alte nregistrri). 9 Dac se lucreaz ntr-o reea de calculatoare, se prefer ca anumite cmpuri din tabel s se pstreze pe calculatorul local i nu pe serverul de fiiere. 9 Un grup de date dintr-un tabel sunt legate de un tabel, iar un alt grup de date din tabel sunt legate de un alt tabel sau nu sunt legate de nici un tabel.
24 Informatic
9 Asupra unui grup de date din tabel se execut un anumit gen de operaii, iar asupra altui grup de date din tabel se execut alt gen de operaii.
De exemplu, relaia stabilit ntre tabelele Salarii i Angajai este de una-la-una deoarece unui angajat i corespunde un singur salariu, iar un salariu corespunde unui singur angajat. Legtura ntre cele dou tabele se face prin intermediul cmpului cod_angajat. Chiar dac cele dou tabele ar putea fi reunite ntr-unul singur, nu se recomand acest lucru deoarece asupra acestor date nu se execut acelai gen de operaii n cadrul organizaiei. Datele din tabelul Agajai sunt folosite de departamentul Personal atunci cnd trebuie luate decizii referitoare la angajaii companiei. Acest tabel conine datele generale ale fiecrui angajat care sunt necesare atunci cnd trebuie promovat, penalizat, disponibilizat sau cnd trebuie localizat (adres, telefon) pentru a i se transmite o anumit informaie. Datele din tabelul Salarii sunt folosite de departamentul Salarizare atunci cnd trebuie calculate drepturile salariale ale fiecrui angajat sau datoriile companiei ctre bugetul statului i ctre asigurri, legate de angajaii si. Acest tabel conine informaii necesare pentru calculul lunar al salariului fiecrui angajat. (one-to-many). 2. Una-la-mai-multe nseamn c o nregistrare din primul tabel poate fi legat cu mai multe nregistrri din al doilea tabel. Tabelul A a1 Tabelul B b1
b2 Este cel mai rspndit tip de relaie. b3 Primul tabel trebuie s aib un cmp cheie primar, iar al doilea tabel a2 b4 trebuie s conin un cmp similar, prin care s se poat identifica nregistrarea din primul tabel de care este legat nregistrarea din al doilea tabel. Un exemplu de relaie una la mai multe este cea stabilit ntre tabelul Clieni i tabelul Comenzi. Unui client i corespund mai multe comenzi, dar o comand poate fi emis de ctre un singur client. Cmpul cheie folosit pentru legtur este cod_client. 3. Mai-multe-la-mai-multe (many-to-many). nseamn c o nregistrare din primul tabel poate fi legat de mai multe nregistrri din al doilea tabel, i invers, o nregistrare din cel de-al doilea tabel poate fi legat de una sau mai multe nregistrri din primul tabel. De exemplu, ntre tabelul Vnztori i Tabelul A Tabelul B tabelul Produse poate fi stabilit o relaie de mai-multe-la-mai-multe: un angajat comercial poate vinde mai multe a1 b1 produse, iar un produs este vndut de a2 b2 mai muli angajai comerciali. Relaia mai-multe-la-mai-multe poate fi desa3 b3 compus n dou relaii una-la-maia4 b4 multe. n acest caz se construiete un tabel suplimentar care s realizeze aceast descompunere. De exemplu, n baza de date coala pot fi definite un tabel Elevi cu elevii din coal i un alt tabel Discipline cu disciplinele predate n coal. Fiecrei nregistrri din tabelul Elevi i corespund mai multe nregistrri n tabelul Discipline (un elev studiaz mai multe discipline) i fiecrei nregistrri
25
din tabelul Discipline i corespund mai multe nregistrri n tabelul Elevi (o disciplin este studiat de mai muli elevi). Aceast relaie se poate descompune n dou relaii una-la-maimulte prin crearea unui tabel suplimentar ncadrri care s conin nregistrri cu dou cmpuri: cod_elev i cod_disciplin. Relaiile vor fi de una-la-mai-multe ntre tabelul Elevi i tabelul ncadrri (unui elev i corespund mai multe ncadrri, cte una pentru fiecare disciplin pe care o studiaz) i ntre tabelul Discipline i tabelul ncadrri (unei discipline i corespund mai multe ncadrri, cte una pentru fiecare elev care o studiaz).
Unele firme, cum este Microsoft, produc i alte SGBD-uri relaionale (FoxPro). Toate aceste sisteme de gestiune a bazelor de date sunt orientate pe microcalculatoare i reele de microcalculatoare. ns cel mai utilizat SGBD relaional din ntreaga lume rmne n continuare Oracle produs de firma Oracle Corporation, deoarece are urmtoarelor avantaje: 9 Poate fi folosit cu diferite sisteme de operare: Windows pentru microcalculatoarele compatibile IBM i System pentru calculatoarele Macintosh, Unix pentru microcalculatoare i minicalculatoare i sisteme de operare pentru calculatoare mari (mainframe). 9 Permite dezvoltarea unor baze de date de orice dimensiune (de la civa octei pn la gigaoctei). 9 Respect standardele n vigoare referitoare la limbajele de accesare a datelor (SQL). 9 Accept un numr mare de utilizatori simultani, minimiznd conflictele care pot s apar n cererile simultane de acces la date. 9 Asigur o securitate mrit datorit siguranei foarte mari la limitarea i monitorizarea accesului la date. Funciile unui sistem de gestiune a bazelor de date relaionale sunt: 9 memorarea, actualizarea (adugarea, tergerea i modificarea) i regsirea datelor din baza de date (utilizatorul poate crea i manipula datele fr s cunoasc modul n care sunt stocate pe mediul de memorare), 9 crearea i ntreinerea dicionarului de date, 9 asigurarea acesului rapid la datele din colecia de date, 9 pstrarea unei copii de siguran a datelor pentru a putea fi recuperate n cazul n care au loc ntreruperi accidentale ale funcionrii sistemului,
26 Informatic
9 asigurarea securitii datelor, 9 asigurarea accesului simultan al mai multor utilizatori la o nregistrare din baza de date (eventual asigurarea accesului concurent), 9 asigurarea integritii datelor (se pot introduce n baza de date numai date valide, iar operaiile de actualizare nu distrug legturile dintre tabele).
Sistemele de gestiune a bazelor de date relaionale v pot pune la dispoziie urmtoarele metode prin care s asigurai securitatea bazei de date: Parol la nivelul ntregii baze de date Aceast metod permite asigurarea securitii la nivelul bazei de date. Este cea mai simpl metod de asigurare a securitii i cel mai rapid de realizat. Se atribuie o singur parol pentru ntreaga baz de date. Orice persoan care dorete s foloseasc baza de date trebuie mai nti s introduc parola. Dac parola este corect, se obine accesul la baza de date i toate obiectele bazei de date i vor fi disponibile. Metoda este eficient numai n cazul unui birou mic i cu un numr foarte mic de utilizatori ai bazei de date (eventual unul singur). Acetia se pot asigura astfel c nici o persoan neautorizat (din afara biroului) nu are acces la baza de date. Drepturi specifice acordate utilizatorilor sau grupurilor de utilizatori Aceast metod permite asigurarea securitii la nivelul utilizatorului. Utilizatorii pot avea drepturi diferite asupra aceleiai baze de date prin folosirea schemelor pariale. Fiecare utilizator deine propria parol, care este unic i nu are legtur cu parolele celorlali utilizatori. La nceperea sesiunii de lucru, utilizatorul introduce numele de utilizator i parola. Sistemul de gestiune a bazelor de date verific dac sunt corecte i dac da, determin drepturile asociate utilizatorului respectiv (schema parial la care are acces). Utilizatorii pot fi organizai pe grupuri i pot fi atribuite drepturi la nivel de grup, la nivel de utilizator sau la ambele niveluri. Grupurile sunt categorii de utilizatori care au aceleai drepturi de a folosi baza de date. Utilizatorul poate s fac parte dintr-un grup sau din mai multe grupuri. El va moteni drepturile grupului cel mai puin restrictiv din care face parte. La aceste drepturi se vor aduga drepturile proprii. Prin aceast metod pot fi personalizate uor drepturile fiecrui utilizator asupra obiectelor din baza de date. Informaiile despre utilizatori i grupurile de utilizatori se pstreaz la nivelul bazei de date, iar drepturile de folosire a obiectelor bazei de date se pstreaz n cadrul tabelelor. Folosirea grupurilor de utilizatori uureaz mult munca de asigurare a securitii bazei de date. Mai nti se organizeaz drepturile de acces pe grupuri logice i apoi se ataeaz utilizatorii la aceste grupuri. Drepturile unui utilizator pot fi uor modificate prin simpla mutare a utilizatorului dintr-un grup n altul. De exemplu, pot fi definite trei grupuri de utilizatori ai unei baze de date relaionale Angajai: primul grup poate vizualiza i actualiza (modifica, aduga, terge) baza de date, al doilea grup poate doar vizualiza baza de date, iar al treilea grup poate vizualiza numai anumite cmpuri ale bazei de date (de exemplu, numai numele i adresa). Dac utilizatorul este promovat n funcie i primete noi drepturi de folosire a bazei de date, el va fi mutat n grupul corespunztor acestor drepturi. Criptarea bazei de date Primele dou metode se refer la protejarea folosirii bazei de date de ctre persoane neautorizate prin intermediul sistemului de gestiune a bazelor de date, dar ele nu
27
mpiedic vizualizarea datelor din tabele cu ajutorul altor aplicaii care pot s citeasc texte (procesoare de texte, editoare de texte etc.). Singura metod prin care se poate mpiedica vizualizarea datelor este cea de criptare a datelor. Elementele folosite de sistemul de gestiune a bazelor de date relaionale pentru ai realiza funciile sunt: Dicionarul de date (Data Dictionary) conine descrierea structurii datelor folosite n baza de date. El este generat automat la crearea bazei de date i conine informaii referitoare la tabelele bazei de date, la fiierele ajuttoare folosite n exploatarea tabelelor i la modul n care pot fi localizate pe disc. De obicei aceste informaii sunt despre: 9 ce date sunt disponibile, 9 unde sunt localizate datele, 9 descrierea datelor, 9 legturile dintre date, 9 cum pot fi folosite datele, 9 cine este proprietarul lor, 9 cui i se permite accesul la consultarea datelor, 9 cui i se permite accesul la actualizarea datelor, 9 limitrile n exploatare generate din necesitatea de a asigura securitatea i confidenialitatea datelor. n dicionarul de date se gsesc tabele care conin datele bazei de date n formatul intern al sistemului de gestiune a bazelor de date folosit, precum i vizualizrile (tabele virtuale) care sintetizeaz datele din tabelele reale i prezint informaia ntr-un format accesibil utilizatorului. Actualizarea dicionarului de date se face folosind limbajul dicionarului de date (Data Dictionary Language). Accesul la dicionarul de date este permis numai dac baza de date este deschis. Limbajul de manipulare a datelor (Data Manipulation Language). Este un limbaj folosit de sistemul de gestiune a bazelor de date pentru gestionarea dicionarului de date prin operaii de inserare i actualizare a datelor. El permite efectuarea calculelor matematice i statistice care pot fi folosite apoi n generarea rapoartelor. Limbajul de interogare (Query Language). Este un limbaj accesibil, uor de neles i de folosit de marea majoritate a utilizatorilor. Deseori el se confund cu limbajul de manipulare a datelor. El asigur accesul la datele din baza de date, regsirea i afiarea lor.
Interogarea (query) sau cererea de nregistrri este un proces prin care se extrag din
baza de date i sunt prezentate n vederea utilizrii acele nregistrri care satisfac anumite criterii. Iat cteva exemple de interogri ale bazei de date a companiei: 9 Identificarea tuturor clienilor dintr-un jude. 9 Afiarea tuturor comenzilor dintr-o perioad de timp pentru un anumit produs sau pentru toate produsele. 9 Afiarea informaiilor despre un client identificat dup numrul su de cod sau dup numele su.
28 Informatic
Interogare Terminal
9 Stabilirea volumului mediu de comenzi ntr-o perioad de timp pentru un anumit produs. 9 Stabilirea produsului care a fost cel mai bine vndut ntr-o anumit perioad de timp. 9 Afiarea pentru fiecare produs a cantitii maxime vndute ntr-o anumit perioad de timp. 9 Afiarea listei de materiale care au stocul 0. 9 Afiarea listei de materiale care sunt sub stocul de siguran admis pentru a asigura fluxul produciei.
Rspuns Terminal
Dicionarul de date
Baza de date
9 Afiarea listei cu clienii care au comandat produse care nu exist n acest moment n stoc (numele clientului, numele persoanei de contact i numrul de telefon). 9 Afiarea unei liste cu clienii care nu au avut comenzi ntr-o perioad de timp precizat. 9 Afiarea unitilor vndute pentru fiecare produs ntr-o perioad de timp. 9 Afiarea informaiilor despre un client identificat dup numrul su de cod sau dup nume.
SQL (Structured Query Language - limbaj structurat de interogare) este cel mai rspndit limbaj de interogare a bazelor de date relaionale. Este un limbaj standardizat care a fost creat special pentru a putea fi folosit la interogarea, actualizarea i gestionarea bazelor de date. Instruciunile SQL descriu operaiile relaionale ntre tabele, ca de exemplu Select, Project i Join. Limbajul SQL nu opereaz cu datele propriu-zise (variabile de memorie i cmpuri) ci cu relaiile dintre tabele. Limbajul SQL poate fi folosit mpreun cu un limbaj gazd sau n unele cazuri este inclus n limbajul gazd (cum este de exemplu limbajul gazd al sistemului de gestiune a bazelor de date FoxPro). Limbajul SQL este deosebit de un limbaj procedural (aa cum sunt limbajele Pascal, C, Basic etc.). Limbajul procedural duce la construirea unor programe prin care i se arat calculatorului ce trebuie s fac n conformitate cu algoritmul de rezolvare a problemei, descris prin instruciuni (prin care i se spune calculatorului pas cu pas ce trebuie s execute). Pe baza acestor programe, calculatorul execut instruciune dup instruciune respectnd cele trei tipuri de structuri de control: secvenial, alternativ i repetitiv. Limbajul SQL este un limbaj de rezultate: el i spune calculatorului ce dorete utilizatorul s obin i nu ce aciuni trebuie s efectueze ca s obin acele rezultate. Elementul fundamental al
29
oricrei interogri SQL este cuvntul cheie Select cu care ncepe fiecare instruciune SQL folosit pentru interogarea bazei de date. De exemplu, sistemul de gestiune a bazelor de date relaionale FoxPro are implementat un limbaj propriu specializat, dar nelege i limbajul SQL.
30 Informatic
de date a unui client care are dou adrese. Prin eliminarea dependenelor funcionale se micoreaz redundana datelor i anomaliile care pot s apar atunci cnd se adaug i se terg nregistrri sau atunci cnd se modific valoarea cmpurilor. Principala cale prin care se pot elimina dependeele funcionale din cadrul tabelelor este descompunerea lor n tabele din ce n ce mai simple. Dependena multivaloric se refer la faptul c valoarea unui cmp x poate forma cte o nregistrare cu toate combinaiile posibile ale valorilor cmpurilor y i z - cu toate perechile de valori (y,z) din produsul cartezian al mulimilor Y i Z, mulimi care specific domeniul de definiie al cmpurilor y i z pentru valoarea cmpului x. De exemplu, pentru obinerea unui atestat, o mulime Y de elevi trebuie s fie ndrumat de o mulime Z de profesori, fiind posibil pentru acelai tip de atestat orice combinaie de elev-profesor din cele dou mulimi. Tabelul format din cele trei cmpuri: tip_atestat, nume_elev, nume_profesor conine dependene multivalorice. Pentru a elimina anomaliile de exploatare a unei baze de date, ntr-un tabel trebuie s existe o singur dependen multivaloare, adic trebuie descompus tabelul astfel nct s fie respectat aceast condiie. n acest caz se obin trei tabele: Atestat_elevi (conine cmpurile tip_atestat, nume_elev, adic atribuiri prin care se poate afla ce atestat va susine fiecare elev), Atestat_profesori (conine cmpurile tip_atestat, nume_profesor, adic atribuiri prin care se poate afla ce atestat poate ndruma fiecare profesor) i Atestat (conine cmpurile nume_elev, nume_profesor, adic atribuiri prin care se poate afla ce profesor ndrum fiecare elev pentru atestat). Toate aceste dependene care exist n cadrul unui tabel pot genera diferite anomalii n timpul executrii operaiilor de actualizare a bazei de date, anomalii care sunt generate n special din cauza redundanei datelor. Pentru a evita aceste anomalii trebuie nlocuit tabelul care le genereaz cu alte tabele n care dependenele sunt supuse unor restricii. Formele echivalente astfel obinute se numesc forme normale. Exist cinci niveluri de normalizare: primele trei acioneaz asupra dependenelor funcionale i ultimele dou asupra dependenelor multivalorice. De obicei baza de date se gndete iniial sub forma unui singur tabel, dup care tabelul respectiv se normalizeaz trecndu-l prin cele cinci forme normale. Deoarece n proiectarea unei baze de date primele trei forme sunt cele mai des ntlnite, n continuare vor fi prezentate numai acestea, pentru a nelege ce nseamn procesul de normalizare a bazei de date.
31
n care a evoluat profesional n cadrul companiei (funcia, departamentul, data la care a fost angajat n funcie, data la care a fost schimbat din funcie i motivul: promovare, retrogradare din cauza absenelor nemotivate, retrogradare din cauza incompetenei etc.). Se observ c pentru acelai angajat exist mai multe ansambluri de cmpuri (funcie, departament, data_inial, data_final, motiv_schimbare), n cazul n care a ocupat mai multe posturi n cadrul companiei, cte un ansamblu pentru fiecare post ocupat. Vom numi post acest ansamblu de cmpuri. Numrul de repetri ale ansamblului post pentru un angajat nu poate fi precizat. Unii angajai au ocupat aceeai funcie de la angajare, alii i-au schimbat funcia de cinci ori. Deci exist mai multe cmpuri compuse post cu aceeai semnificaie pentru informaia pe care o reprezint (funcie, perioada ocuprii funciei i motivul schimbrii funciei).
Cod_angajat Nume_prenume Cod_numeric ... Post1 ... Post5
Informaii generale despre salariat. Fiecrui salariat i corespunde o singur nregistrare n tabel.
Informaii despre fiecare post ocupat de un salariat. Ele se repet de mai multe ori ntr-o nregistrare.
Funcie
Departament
Data_iniial
Data_final
Motiv_schimbare
Cod_ angajat
Nume_ prenume
Cod_ numeric
...
Funcie
Departament
...
Motiv_ schimbare
Fiecare nregistrare conine informaii generale despre salariat i informaii despre un post ocupat. Pentru un salariat pot exista mai multe nregistrri, cte una pentru fiecare post ocupat.
Pentru a elimina cmpurile repetitive dintr-o nregistrare, se va reorganiza structura acestui tabel ntr-un nou tabel Angajai astfel: cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii, data_naterii, data_angajrii, schimbare_ Angajai_tot funcie, funcie, departament, data_inial, data_final, motiv_schimbare. Folosind o astfel de structur, cmpurile funcie, departament, data Angajai _inial, data_final, motiv_ schimbare nu se vor mai repeta n cadrul aceleiai nregistrri. Vor aprea ns Angajaii Funcii Departamente mai multe nregistrri pentru
32 Informatic
acelai angajat, cte una pentru fiecare schimbare de funcie. Cmpul schimbare_funcie va nregistra cronologic a cta schimbare de funcie reprezint nregistrarea. Se observ c n tabelul Angajai, pentru funcie i pentru departament exist un singur cmp care nu poate identifica unic aceste date deoarece sunt dependente de irul de caractere introdus de la tastatur (persoane diferite pot scrie diferit acelai nume de funcie sau acelai nume de departament). Din aceast cauz se atribuie fiecrei funcii un cod numeric unic cod_funcie i fiecrui departament un cod numeric unic cod_departament. n acest mod cmpurile funcie i departament vor deveni cmpuri compuse fiecare din cte dou cmpuri elementare. Cmpul compus funcie poate fi descompus n cmpurile elementare cod_funcie i denumire_funcie, iar cmpul compus departament poate fi descompus n cmpurile elementare cod_departament i denumire_departament. n acest mod vor aprea dou noi tabele: tabelul Funcii care conine cmpurile cod_funcie, denumire_funcie i tabelul Departamente care conine cmpurile cod_departament, denumire_departament. n acest caz tabelul Angajaii va fi format din: cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii, data_naterii, data_angajrii, schimbare_funcie, cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. ntre tabelul Angajat i tabelul Funcii va exista o legtur prin intermediul cmpului cod_funcie care este cheie primar n tabelul Funcii i cheie secundar n tabelul Angajat. ntre tabelul Angajai i tabelul Departamente va exista o legtur prin intermediul cmpului cod_departament care este cheie primar n tabelul Departamente i cheie secundar n tabelul Angajai.
Angajat
Funcii angajat
Funcii
Departamente
Se observ c n tabelul Angajaii exist pentru acelai angajat (codul angajatului fiind cheia primar) mai multe nregistrri n cazul n care a ocupat mai multe posturi n cadrul companiei, cte una pentru fiecare post ocupat. Deci, n mai multe nregistrri se vor repeta valori ale cmpurilor: cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii, data_naterii, data_angajrii. Valorile cmpurilor care pot diferi de la o nregistrare la alta pentru aceeai valoare a cmpurilor enumerate anterior sunt: schimbare_funcie, cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. Pentru a elimina cmpurile care nu pot fi identificate unic prin intermediul cmpului cod_angajat
33
(cheia primar a tabelului) se va diviza acest tabel n dou tabele: Angajat care conine cmpurile cod_angajat, nume_prenume, cod_numeric, adres, telefon, studii, data_naterii, data_angajrii i Funcii_angajat care conine cmpurile cod_angajat, cod_funcie, cod_departament, data_inial, data_final, motiv_schimbare. n tabelul Funcii_angajat cheia primar (cea care identific unic o nregistrare) este format din cmpurile cod_angajat, cod_funcie i cod_departament. Acest tabel este legat de mai multe tabele: Angajat (legtura ntre cele dou tabele va fi fcut prin cmpul cod_angajat), Funcii (prin cheia cod_funcie care este cheie primar n tabelul Funcii i cheie secundar n tabelul Angajat) i Departamente (prin cheia cod_departament care este cheie primar n tabelul Departamente i cheie secundar n tabelul Angajat).
Cod_ angajat Nume_ prenume Cod_ numeric ... Funcie Departament ... Motiv_ schimbare
Tabelul Angajaii va fi descompus n dou tabele. Tabelul Angajat va conine informaii generale despre angajai. Exist o singur nregistrare pentru fiecare angajat. Cod_ angajat Nume_ prenume Cod_ numeric
Cod_ angajat
Cod_ funcie
Cod_ departament
...
Motiv_ schimbare
...
Tabelul Funcii_angajat va conine informaii despre posturile ocupate de fiecare angajat. Pentru fiecare angajat exist attea nregistrri. cte posturi a ocupat n cadrul organizaiei.
34 Informatic
n acest caz, documentul ce leag toate aceste informaii este factura care pstreaz urma tranzaciei comerciale. n ea se gsesc date generale despre tranzacie (numrul_facturii, data_facturii), dar i date despre angajatul care a negociat tranzacia (denumire_vnztor, cod vnztor), date despre client (persoana care a cumprat produsele, identificat prin cod_client, denumire_client, cod_fiscal, adres etc.) i date despre fiecare produs vndut (numr_produs_factur, cod_produs, denumire_produs, unitate, pre_unitar, cantitate, valoare_cantitate1). Se observ c n cadrul unei facturi, produsul vndut depinde de clientul care l-a cumprat (care pltete toat factura), care la rndul su depinde de vnztorul cu care a negociat achiziionarea produselor. Pentru a elimina aceste dependene funcionale tranzitive: produs client vnztor din datele furnizate de o factur, vor fi construite mai multe tabele: tabelul Factur care conine date generale despre factur (numr_factur, dat, serie), tabelul Vnztor care conine date despre tranzaciile efectuate de angajaii comerciali ai companiei i care sunt necesare pentru salarizarea lor (numr_factur, cod_angajat_vnztor), tabelul Cumprtor care conine date pentru identificarea clientului implicat n tranzacie (numr_factur, cod_client), presupunnd c exist deja tabelul Clieni care furnizeaz informaii complete depre fiecare client obinuit al companiei (nume, cod fiscal, adres etc.), tabelul Produs_vndut care identific produsul vndut prin factur i care conine date pentru identificarea fiecrui produs vndut (numr_factur, cod_produs, cantitate), presupunnd c exist deja tabelul Catalog_produse care furnizeaz informaii complete despre fiecare produs vndut de companie (denumire, cod, unitate de msur, pre unitar etc.). Factur (document)
Factura
Vnztor
Cumprtor
Produs_vndut
Salarii
Clieni
Catalog_produse
Considerai c coala voastr este o organizaie care trebuie informatizat, iar colecia de date pe care o vei folosi va fi de tipul unei baze de date relaionale. Analiza voastr trebuie s porneasc de la entitatea Elev. Vei identifica toate datele caracteristice unui elev, att din punct de vedere al datelor personale (numr matricol, nume i prenume, iniiala tatlui, datele despre prini, adresa, numrul de telefon), ct i din punct de vedere al situaiei colare (anul de studiu, clasa, profilul clasei, profesorul diriginte, profesorul pe care l are la fiecare disciplin, disciplinele pe care le studiaz n acest an colar, notele i absenele la fiecare disciplin, pe fiecare semestru, media la fiecare
1
Pentru a simplifica analiza, s-au eliminat din structura unei facturi toate datele referitoare la TVA.
35
disciplin obinut semestrial, media anual la fiecare disciplin, media semestrial i media anual a elevului). Construii cu aceste date primul tabel. Normalizai tabelul.
n urmtorul exemplu, pentru proiectarea unei baze de date s-a pornit de la lista cu comenzile clienilor. Trecnd prin mai multe forme normale s-au obinut tabelele: Comenzi, Clieni, Produse_comandate. Identificai formele normale prin care a trecut tabelul iniial. Etapa 1. Se construiete tabelul Total_comenzi care conine urmtoarele cmpuri: numr_comand, dat_comand, nume_client, adres_client i 6 cmpuri compuse produs_comandat. Cmpul compus este format din cmpurile denumire_produs, unitate_msur, cantitate, pre_unitar, valoare. Fiecare nregistrare reprezint o comand. Cmpul numr_comand poate identifica unic o nregistrare. Etapa 2. Se construiete tabelul Comenzi care conine urmtoarele cmpuri: numr_comand, dat_comand, nume_client, adres_client, denumire_produs, unitate_msur, cantitate, pre_unitar, valoare. Pentru fiecare comand vor fi mai multe nregistrri, cte una pentru fiecare podus din comand. Cmpul numr_comand i denumire_produs identific unic o nregistrare. Etapa 3. Pentru a uura identificarea unui produs se atribuie acestuia un cod_produs. Se construiete tabelul Catalog_produse care conine urmtoarele cmpuri: cod_produs, denumire_produs, unitate_msur, pre_unitar. Fiecare produs din catalog va fi identificat unic prin cmpul cod_produs. n tabelul Comenzi vor rmne cmpurile: numr_comand, dat_comand, nume_client, adres_client, cod_produs, cantitate, valoare. nregistrrile vor fi identificate unic prin cheia format din dou cmpuri numr_comand i cod_produs. Etapa 4. Din tabelul Comenzi se construiesc dou tabele: tabelul Comanda i tabelul Produse. Tabelul Comanda conine cmpurile: numr_comand, dat_comand, nume_client, adres_client, valoare. Pentru fiecare comand va fi o singur nregistrare identificat unic prin cmpul numr_comand. Tabelul Produse conine cmpurile: numr_comand, cod_produs, nume_client, adres_client, cantitate, valoare. Pentru fiecare comand vor exista mai multe nregistrri. nregistrrile vor fi identificate unic prin cheia format din dou cmpuri: numr_comand i cod_produs. Etapa 5. Din tabelul Comanda se construiesc dou tabele: tabelul Comenzi i tabelul Clieni. Tabelul Comenzi conine cmpurile: numr_comand, dat_comand, cod_client, valoare. Pentru fiecare comand va fi o singur nregistrare identificat unic prin cmpul numr_comand. Tabelul Clieni conine cmpurile: cod_client, nume_client, adres_client. Pentru fiecare client va fi o singur nregistrare. nregistrrile vor fi identificate unic prin cmpul: cod_client.
36 Informatic
1.
Selecia (Select2). Operatorul se aplic pe un tabel surs. Rezultatul este un tabel nou, cu aceeai structur de cmpuri ca i a tabelului surs, ce conine ns numai acele nregistrri din tabelul surs care ndeplinesc o condiie precizat: au aceeai valoare pentru un anumit cmp. Angajai
Cod-a 1111 1112 1113 1114 Nume_prenume Ionescu Maria Popescu Ion Andronescu Ana Ene Magda Cod_num 2030361403457 1020260403456 2040469402458 2050570403453 Departament Marketing Marketing Salarizare Salarizare Funcia Casier Vnzator Casier Contabil
Nou1
Cod-a 1112
Nou2
Nou3
37
De exemplu, putem considera ca tabel surs tabelul Angajai. Prin operaia select se pot crea noi tabele: 9 Tabelul Nou1. Conine o singur nregistrare corespunztoare unui angajat care are un anumit cod numeric personal: Select from Angajai where Cod_num=1020260403456 9 Tabelul Nou2. Conine mai multe nregistrri care corespund angajailor din departamentul Salarizare: Select from Angajai where Departament='Salarizare' 9 Tabelul Nou3. Conine mai multe nregistrri care corespund angajailor care au funcia de casier: Select from Angajai where Funcia='Casier' 2. Proiecia (Project). Operatorul se aplic pe un tabel surs din care creeaz un tabel nou ce va conine numai cmpurile specificate din tabloul surs. Angajai
Cod-a 1111 1112 1113 1114 Nume_prenume Ionescu Maria Popescu Ion Andronescu Ana Ene Magda Cod_num 2030361403457 1020260403456 2040469402458 2050570403453 Departament Marketing Marketing Salarizare Salarizare Funcia Casier Vnzator Casier Contabil
De exemplu, putem considera ca tabel surs tabelul Angajai. Prin operaia project se pot crea noi tabele: 9 Tabelul Nou4. Conine dou cmpuri: Nume_prenume i Cod_num: Project Nume_prenume, Cod_num from Angajai 9 Tabelul Nou5. Conine dou cmpuri: Nume_prenume i Departament: Project Nume_prenume, Departament from Angajai 3. Compunerea (Join). Operatorul se aplic pe dou tabele surs din care creeaz un tabel nou astfel: din produsul cartezian al celor dou tabele se pstreaz numai nregistrrile care ndeplinesc o anumit condiie.
38 Informatic
Exemplu de operaie Join Tabel A
Cmpuri RA1 RA2
Tabel B
C1 1 2 C2 a b C3 x y Cmpuri RB1 RB2 RB3
Rndurile tabelului A
C4 1 2 3
C5 m n p
Rndurile tabelului B
C1 1 1 1 2 2 2
C2 a a a b b b
C3 x x x y y y
C4 1 2 3 1 2 3
C5 m n p m n p
Rndurile tabelului A
Rndurile tabelului B
C1 1 2
C2 a b
C3 x y
C4 1 2
C5 m n
RB1 RB2
Rndurile tabelului A
Rndurile tabelului B
De exemplu, departamentul Aprovizionare folosete urmtoarele tabele: 9 Tabelul Catalog materiale pentru evidena materialelor cu care se poate face aprovizionarea. Conine cmpurile: cod_material, denumire, unitate_msur. 9 Tabelul Intrri pentru evidena materialelor achiziionate. Conine cmpurile: cod_material, cantitate_intrat, tip_document, numr_document, data_intrrii. 9 Tabelul Ieiri pentru evidena materialelor consumate. Conine cmpurile: cod_material, cantitate_ieit, tip_document, numr_document, data_ieirii. Pentru a obine stocul din fiecare material, trebuie calculat pentru fiecare material diferena dintre suma cantitilor intrate i suma cantitilor ieite. Pentru a putea executa aceast operaie trebuie compuse cele dou tabele ntr-unul singur, condiia de compunere fiind egalitatea cmpurilor: intrri. cod_material = ieiri. cod_material, adic Join intrri and ieiri where intrri. cod_material = ieiri. cod_material Operatorii din algebra relaional pot fi folosii pentru a formula diferite interogri. De exemplu, n baza de date a organizaiei: 9 Lista cu numele angajailor din toate departamentele care au funcia 'casier'. n tabelul Angajai se execut o operaie de selecie: Select from Angajai where Funcie='casier'
39
i se obine tabelul Casieri care conine toi angajaii care au funcia de casier. Apoi pe tabelul astfel obinut se aplic operaia de proiecie: Project Nume_prenume, Departament from Casieri i se obine n tabelul Casieri_departamente informaia dorit (lista cu numele persoanelor i departamentul n care lucreaz). 9 Lista cu numele furnizorului, numele i numrul de telefon al persoanei de contact pentru materialele care sunt sub stocul de siguran, pentru a se putea comanda aceste materiale. n tabelul Stocuri se execut o operaie de selecie: Select from Stocuri where stoc<=stoc_sig i se obine tabelul Siguran care conine toate materialele care sunt sub stocul de siguran. Apoi pe tabelul astfel obinut se aplic operaia de proiecie: Project cod_material, denumire from Siguran i se obine tabelul Comenzi_materiale. Se compun tabelele Furnizori i Comenzi_materiale cu operaia Join Furnizori and Comenzi_materiale where furnizori.cod_material = comenzi_materiale. cod_material i se obine tabelul Comanda. Apoi pe tabelul astfel obinut se aplic operaia de proiecie Project denumire, den_furnizor, nume_pers, telefon from Comanda i se obine tabelul Comanda_furnizori care conine denumirea furnizorului, numele persoanei de contact, numrul de telefon i denumirea materialului pentru materialele care sunt sub stocul de siguran. Se poate verifica prin telefon dac furnizorul poate primi comanda de livrare pentru materialele care sunt sub stocul de siguran.
Pornind de la tabelele A i B, precizai coninutul tabelului C obinut ca rezultat al operaiei relaionale: a) Project X,Z from A Tabelul A Tabelul B b) Select from A where Y=1 X Y Z U V c) Project U from B m 1 a i 2 d) Select from B where V=2 n 2 b j 4 e) Join A and B where A.Y=B.V o 3 c k 2
p 1 d
Tabelul A conine informaii generale despre angajai: nume angajat, adres, numr de telefon. Tabelul B conine informaii despre ocuparea posturilor de ctre angajai: nume angajat, nume funcie, departament, data iniial, data final. Ce operaii relaionale trebuie s executai ca s obinei informaiile: a) Ce angajai au ocupat postul X? b) Ce angajai au lucrat n departamentul X? c) Ce posturi a ocupat angajatul X i n ce departamente? d) Ce adrese au angajaii care au ocupat postul X din departamentul Y?
40 Informatic
n afara limbajelor care au la baz algebra relaional (care folosesc interogri exprimate prin operatori relaionali specifici aa cum este limbajul SQL), mai exist i limbaje care se bazeaz pe calculul relaional (care exprim interogrile prin intermediul condiiilor pe care trebuie s le ndeplineasc mulimea nregistrrilor care corespund cererii). Din aceast categorie face parte limbajul QBE (Query By Example - Interogare prin exemple) care este standardul prin care pot fi formulate interactiv interogrile bazei de date folosind calculul relaional. De obicei limbajul QBE pune la dispoziia utilizatorului o interfa prin intermediul creia utilizatorul i poate asambla interogarea, incluznd operatori pentru calculul: 9 sumei valorilor unui cmp din tabel - sum, 9 mediei aritmetice a valorilor unui cmp din tabel - avg, 9 celei mai mari valori a unui cmp din tabel - max, 9 celei mai mici valori a unui cmp din tabel - min, 9 numrului de nregistrri dintr-un tabel - cnt. n sistemul de gestiune a bazelor de date Visual FoxPro interogrile se pot construi prin intermediul interfeei folosind interogarea prin exemple (QBE). n culise, aceste comenzi sunt transformate n instruciuni SQL.
ncercai:
date format din dou tabele B i C. Tabelul A conine urmtoarele cmpuri: nume angajat, funcie, departament. Tabelul B conine cmpurile nume angajat i funcie, iar tabelul C cmpurile funcie i departament. Comparai cele dou baze de date. Ele conin aceleai categorii de date, dar nu sunt identice din punct de vedere al informaiilor pe care le furnizeaz. Artai cum rspund cele dou baze de date la urmtoarele cereri de informaii: a) n ce departament lucreaz angajatul X. b) Care sunt angajaii dintr-un departament. c) Care sunt angajaii cu funcia X din departamentul Y. Ce concluzie tragei? Reproiectai cea de-a doua baz de date astfel nct s poat rspunde la aceste ntrebri.
date format din dou tabele B i C. Tabelul A conine urmtoarele cmpuri: nume angajat, funcie, departament, numr de telefon. Tabelul B conine cmpurile nume angajat i departament, iar tabelul C cmpurile funcie i numr de telefon. Comparai cele dou baze de date. Ele conin aceleai categorii de date, dar nu sunt identice din punct de vedere al informaiilor pe care le furnizeaz. Artai cum rspund cele dou baze de date la urmtoarele cereri de informaii: a) Ce numr de telefon are angajatul X. b) Ce angajat are numrul de telefon Y. c) Care sunt angajaii cu funcia X din departamentul Y.
41
Ce concluzie tragei? Reproiectai cea de-a doua baz de date astfel nct s poat rspunde la aceste ntrebri. Presupunnd c exist o companie care asigur distribuia ctre abonai a mai multor publicaii, descriei n ce mod vor putea fi reprezentate ntr-o baz de date relaionale (tabele i relaii ntre tabele) urmtoarele informaii referitoare la editori i abonai: a) Exist mai multe edituri. Informaiile referitoare la o editur sunt: nume, adres, persoan de contact, numr de telefon. b) Fiecare editur are mai multe publicaii. Informaiile referitoare la o publicaie sunt: nume, tip publicaie, pre. c) Fiecrui abonat i se pot distribui mai multe publicaii. Informaiile referitoare la un abonat sunt: nume, adres, numr de telefon. Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei de date.
M iniproiect.
M iniproiect.
Descriei n ce mod vor putea fi reprezentate ntr-o baz de date relaional (tabele i relaii ntre tabele) urmtoarele informaii referitoare la cursele aeriene dintr-o zi i pasagerii acestor curse : a) Exist mai multe linii aeriene, fiecare identificat printr-un nume. b) Pe fiecare linie aerian exist mai multe curse identificate printr-un nume. Fiecare curs are o destinaie. c) Fiecare curs are o anumit capacitate (numr de locuri) i folosete un anumit tip de avion. d) La fiecare curs exist mai muli pasageri care rezerv locuri. Un pasager poate rezerva mai multe locuri. Pasagerii se identific dup nume, iar locurile dup numr. Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei de date. Verificai dac baza de date rspunde la urmtoarele interogri (exprimai interogrile prin cei trei operatori relaionali): a) Lista cu pasagerii de la cursa X. b) Locurile rezervate de pasagerul X la cursa Y. c) Tipul avionului folosit de cursa X. d) Lista curselor care aparin liniei aeriene X. e) Lista curselor care au destinaia X.
M iniproiect.
Descriei n ce mod vor putea fi reprezentate ntr-o baz de date relaional (tabele i relaii ntre tabele) urmtoarele informaii referitoare la o bibliotec: a) Biblioteca este format din mai multe cri, care aparin mai multor domenii de interes pentru cititor. Domeniul se identific prin cod i nume. b) Fiecare carte se identific prin: cod carte, titlu, autor, editur, an apariie, pre, cod domeniu. c) Fiecare cititor se identific prin: cod cititor, nume, adres, telefon.
42 Informatic
d) Crile pot fi mprumutate de cititori. Pentru fiecare mprumut se in urmtoarele evidene: cartea mprumutat, cititorul care a mprumutat-o, data mprumutului, data la care trebuie s o napoieze, data la care a napoiat-o. Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei de date. Verificai dac baza de date rspunde la urmtoarele interogri (exprimai interogrile prin cei trei operatori relaionali): a) Ce cri a mprumutat cititorul X n perioada D. b) Lista cu crile care sunt mprumutate la data D. c) Lista cu crile care aparin unui autor X. d) Lista cu crile din domeniul Y. e) Lista cu crile din domeniul X aprute la editura Y. f) Lista cu crile aprute n anul X la editura Y.
M iniproiect.
Descriei n ce mod vor putea fi reprezentate ntr-o baz de date relaional (tabele i relaii ntre tabele) urmtoarele informaii referitoare la o agenie de turism: a) Agenia organizeaz excursii sau sejururi de mai multe zile la diferite obiective turistice. b) Obiectivele turistice se identific prin localitate i aparin unui domeniu de interes. c) La un obiectiv turistic pot exista mai multe ci de acces. d) Turistului i se asigur cazare i mas. Hotelurile se identific prin nume, adres i categorie, iar restaurantele prin nume i adres. e) Organizarea excursiei const n a asigura turistului transportul, cazarea i masa pe o perioad determinat de timp. f) Agenia ine evidena turitilor, a excursiilor i a sejururilor organizate pentru acetia. Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial a bazei de date. Verificai dac baza de date rspunde la urmtoarele interogri (exprimai interogrile prin cei trei operatori relaionali): a) Lista cu obiectivele turistice dintr-un jude X. b) Lista cu hotelurile care pot fi folosite pentru a asigura cazarea la un obiectiv turistic X. c) Lista cu rezervrile fcute pe o perioad de timp D la un hotel X. d) Lista cu turitii care vor merge n excursie ntr-o perioad D la un obiectiv X. e) Turistul care a rezervat camera X din hotelul Y de la obiectivul turistic Z n data D. Dac este cazul, modificai structura tabelelor din baza de date astfel nct baza de date s poat rspunde la aceste ntrebri.
M iniproiect. Baza de date a unei coli este format din urmtoarele tabele:
Clase: cod_clas, profil_clas. Discipline: cod_disciplin, denumire_disciplin. Profesori: cod_profesor, nume_profesor, adres, telefon. Elevi: cod_elev, cod_clas, nume_elev, adres, telefon. Prini: cod_elev, nume_printe, tip_printe, telefon. Note: cod_elev, cod_disciplin, dat, not. Absene: cod_elev, cod_disciplin, dat.
43
Prini
Discipline
Profesori
Dirigini
ncadrare_ profesori
ncadrare_ discipline
a) b) c) d) e) f)
Stabilii legturi ntre tabele. Precizai pentru fiecare legtur tipul relaiei. Identificai pentru fiecare relaie cheia primar i cheia secundar. Artai ce condiii trebuie ndeplinite pentru a fi asigurat integritatea referenial. Formulai zece cereri de interogare a bazei de date. Ce date mai putei aduga la baza de date pentru a obine noi informaii?
Artai corespondenele: Prima grup (1 10) v prezint mai muli termeni. A doua grup (a j) v prezint afirmaii sau definiii posibile pentru aceti termeni. Legai corespunztor obiectele din prima grup cu obiectele din a doua grup: 1. baza de date 6. administratorul bazei de date 2. nregistrarea 7. sistemul de gestiune a bazelor de date 3. schema 8. relaia una-la-mai-multe 4. redundana datelor 9. independena datelor 5. dicionarul de date 10. modelul relaional de baze de date a. b. c. d. Conine toate informaiile despre entitile memorate n baza de date. Cel mai popular model de baze de date folosit pe microcalculatoare. Instrument software care faciliteaz crearea i ntreinerea bazelor de date. O persoan sau un grup de persoane care coordoneaz i controleaz toate activitile legate de baza de date a unei organizaii. e. O colecie de fiiere i nregistrri legate ntre ele. f. Unul dintre cele mai mari avantaje ale folosirii bazelor de date. g. O colecie de cmpuri care sunt legate logic. h. Descrierea ntregii colecii de date din baza de date. i. Una dintre proprietile datelor care creeaz deficiene mari coleciilor de fiiere de date. j. O nregistrare din primul tabel poate fi legat de mai multe nregistrri din al doilea tabel. Adevrat/Fals: 1. Un avantaj al folosirii fiierelor de date este partajarea datelor ntre mai muli utilizatori. 2. Un avantaj al folosirii bazelor de date este asigurarea integritii datelor. 3. Dicionarul de date descrie structura datelor din baza de date.
44 Informatic
Administratorul bazei de date asigur consistena datelor. Administratorul bazei de date asigur controlul centralizat al datelor. Tabelul virtual (vizualizarea) este modelul datelor cu care opereaz utilizatorul. tergerea restricionat nseamn c nregistrrile din tabelele conduse vor fi terse numai cu acordul utilizatorului. 8. O relaie mai-multe-la-mai-multe poate fi descompus n dou relaii una-la-una. 9. Operatorul relaional Select se aplic pe dou tabele pentru a obine un tabel nou, cu nregistrrile din ambele tabele care au aceeai valoare a cmpului cheie n ambele tabele. 10. Limbajul SQL folosete interogarea prin exemple. Completai: 1. Cmpul care identific unic o nregistrare din tabel se numete ,. 2. Baza de date este o colecie de ................. i ................ legate ntre ele. 3. Setul de date la care are acces un grup de utilizatori este descris prin ......................... 4. Cheia secundar este folosit n tabelul ...................... 5. Mecanismul de propagare a cheilor asigur ........................ dintre tabelele bazei de date. 6. Pentru a asigura condiia de integritate referenial, mulimea valorilor cheii secundare trebuie s fie ....................... mulimea valorilor cheii primare din care s-a propagat. 7. Normalizarea este procesul de ................................. a unei structuri complexe prin ................................ ei n structuri mai simple, legate ntre ele. 8. Proprietatea datelor care caracterizeaz cantitatea de date memorat de mai multe ori pe suportul de memorare se numete ............................. datelor. Alegei rspunsurile corecte: 1. Care dintre urmtoarele entiti sunt caracteristice unei baze de date relaionale : a) tabelul b) nregistrrile c) legturile logice complexe d) cmpurile e) structura de reea a tabelelor 2. Care dintre urmtoarele operaii creeaz probleme ntr-un ansamblu de fiiere de date : a) actualizarea datelor b) asigurarea independenei datelor fa de programe c) redundana datelor 3. Care dintre urmtoarele nu sunt componente ale sistemului de gestiune a bazelor de date: a) limbajul de manipulare a datelor b) dicionarul de date c) limbajul de interogare d) sistemul de gestiune a fiierelor e) limbajul de descriere a datelor f) baza de date 4. Dicionarul bazei de date nu furnizeaz informaii despre: a) locul n care se gsesc datele din baza de date b) dimensiunea spaiului de pe disc 4. 5. 6. 7.
45
5.
6.
7.
8.
9.
c) proprietarul unor seturi de date din baza de date d) modul n care pot fi folosite datele de ctre utilizatori e) limitri pentru a asigura securitatea i confidenialitatea datelor Dac unele componente ale coleciei de date se nregistreaz de mai multe ori pe suportul de date, redundana datelor: a) crete b) scade c) nu se modific Administratorul bazei de date stabiliete: a) drepturile de acces ale utilizatorilor la baza de date b) programele de aplicaie folosite pentru baza de date c) sistemul de gestiune a bazelor de date folosit d) modificarea structurii bazei de date Utilizatorul bazei de date opereaz cu: a) tabelele bazei de date b) colecia de fiiere n care este memorat baza de date c) vizualizrile Operatorii relaionali Select, Project i Join se pot folosi n limbajul de tip : a) SQL b) QBE c) gazd Pentru a extrage ntr-un tabel nou anumite cmpuri dintr-un tabel surs se folosete operatorul relaional : a) Select b) Project c) Join
Rspundei: 1. De ce este necesar un administrator de baze de date? 2. Care este deosebirea dintre schema general a bazei de date i o schem parial? 3. Ce este un sistem de gestiune a bazelor de date? Care este rolul su? 4. Care sunt cele mai importante avantaje ale unei baze de date? 5. Care sunt cele mai importante dezavantaje ale unei baze de date? 6. Ce este limbajul de interogare a unei baze de date? 7. Ce nseamn independena datelor ntr-o baz de date? 8. Ce tipuri de limbaje pot fi folosite pentru interogarea unei baze de date relaionale?
Artai corespondenele: 1-e; 2-g; 3-h; 4-i; 5-a; 6-d; 7-c; 8-j; 9-f; 10-b. Adevrat/Fals: 1-F; 2-A; 3-A; 4-F; 5-A; 6-A; 7-F; 8-F; 9-F; 10-F. Completai: 1- cheie de identificare; 2-nregistrri, fiiere; 3- schema parial; 4- condus; 5- legtura; 6-inclus n; 7-simplificare, divizarea; 8-redundana. Alegei rspunsurile corecte: 1-a,b,d; 2-b,c; 3-b,d; 4-b; 5-a; 6-a,d; 7-c; 8-a; 9-b. Condiiile sunt: a) E := alfa <> " " and alfa <> "," and fa <> "."
spunsuri:
46 Informatic
tipul numeric tipul alfanumeric tipul logic tipul pentru gestionarea timpului tipul special
Pentru a asigura o mai mare flexibilitate n manipularea i stocarea datelor, n sistemele de gestiune a datelor, ca i n alte sisteme care permit prelucrarea datelor, sunt implementate subtipuri de date. Aceste subtipuri pot fi folosite pentru datele elementare stocate n memorie (variabilele de memorie) i/sau pentru datele elementare stocate n memoriile externe (cmpurile tabelelor care formeaz baza de date). Subtipurile de date difer ntre ele prin modul de stocare a datelor i prin domeniul de definiie al lor. n continuare, pentru a v putea crea o imagine asupra varietii de subtipuri de date pe care le putei ntlni atunci cnd lucrai cu bazele de date, sunt prezentate subtipurile implementate n sistemul de gestiune a bazelor de date Visual FoxPro. n acest sistem structurile de date de tip tablou de memorie sunt neomogene. Pentru operatorul de atribuire se folosete simbolul = : <nume> = <expresie> De exemplu, n=n+100 nseamn c variabilei n i se atribuie valoarea expresiei n+100, adic valoarea obinut prin adugarea numrului 100 la valoarea avut anterior operaiei de atribuire.
3
47
pentru reprezentarea numrului (un caracter pentru semnul minus folosit de numerele negative, numrul de cifre pentru partea ntreag, numrul de cifre pentru partea zecimal i un caracter pentru punctul folosit ca separator ntre partea ntreag i partea zecimal) i numrul de caractere folosite numai pentru partea zecimal. Deoarece numrul maxim de octei este 20 (deci numrul maxim de caractere folosite pentru numr este 20), acest subtip poate fi folosit pentru reprezentarea cu precizie sczut a numerelor raionale mici. Subtipul double (dublu) poate fi folosit i el pentru numerele reale. Reprezentarea numrului pe suportul de memorare se face n virgul mobil, dubl precizie (o metod optim de reprezentare a numerelor reale) i are o lungime fix de 8 octei. Acest subtip poate fi folosit pentru reprezentarea cu precizie mrit (pn la 15 cifre zecimale) a 4 numerelor reale foarte mari (pn la ordinul 10308) . Deoarece lungimea sa este fix, pentru o bun gestionare a spaiului de memorare nu se recomand folosirea acestui subtip pentru numere reale mici cu precizie sczut. Subtipul integer (ntreg) poate fi folosit numai pentru numerele ntregi. Reprezentarea numrului pe suportul de memorare se face n binar pe o lungime fix de 4 octei, folosindu-se un bit pentru semn i 31 de bii pentru numr. Deoarece 231 - 1 este egal cu 2147483647, domeniul de definiie al acestui subtip este [-2147483648, 2147483647]. Subtipul currency (monetar) poate fi folosit pentru memorarea valorilor numerice exprimate n uniti monetare. naintea numrului se introduce simbolul monetar ($). Poate fi folosit pentru date reale, cu o precizie de maxim 4 cifre zecimale i cu valori 5 cuprinse aproximativ n domeniul [-91014, 91014] . Este specific domeniului contabil, pentru a se preveni erorile de rotunjire. Pentru reprezentarea sa se folosesc 8 octei. Operatorii matematici care pot fi aplicai pe datele de tip numeric sunt:
Mai exact, numere din intervalul [-1,7976931348623210308 1,7976931348623210308] Mai exact, numere din intervalul [-922337203685477,5808 922337203685477,5807] 6 Pentru operaia modulo prin care se calculeaz restul mpririi unui operand de tip numeric ntreg la un al doilea operand de tip numeric ntreg. 7 Variante ale operatorului diferit.
48 Informatic
un octet, prin codul su ASCII. Lungimea maxim a irului de caractere este 254 de caractere. Lungimea irului de caractere dintr-un cmp este fix pentru ntregul tabel i poate fi stabilit de ctre utilizator pn la maxim 254 de caractere. Lungimea irului de caractere dintr-o variabil de memorie este variabil, n funcie de valoarea atribuit datei. Pentru constanta ir de caractere se pot folosi ambele tipuri de delimitatori: apostrof ('Caracter') i ghilimele ("Caracter"). Operatorii de concatenare care pot fi aplicai pe datele de tip ir de caractere sunt:
C = {+,-}
Operatorul + se numete operator de concatenare simplu, iar operatorul - se numete operator de concatenare special. Deosebirea dintre operatorul de concatenare simplu i operatorul de concatenare special este aceea c cel de-al doilea operator mut spaiile de la sfritul primului ir de caractere la sfritul irului de caractere concatenat. De exemplu: 'Pop ' + ' Ana' = 'Pop Ana' P o p + 'Pop ' - ' Ana' = 'Pop Ana P o p ' A n a = P o p A n a
49
care dinamic pentru astfel de cmpuri a spaiului de memorare de pe disc, diferit de la un cmp la altul, n funcie de necesitile de la un moment dat. Memorarea caracterelor din fiecare cmp memo se face ntr-un fiier asociat tabelului care conine cte o nregistrare de lungime variabil asociat fiecrui cmp memo din tabel. Acest fiier are extensia .fpt. n tabel, n cmpul memo se pstreaz pe 4 octei doar adresa la care se gsete nregistrarea asociat n fiier. Cmpurile de tip memo nu pot fi cmpuri cheie.
D = {+, -}
Dac notm cu a primul operand, cu b al doilea operand i cu c rezultatul, aceti operatori se aplic astfel:
50 Informatic
Operator Tip a ++ --D
8
Tip b
9
Tip c D D
D D
Execut Exemplu incrementeaz data din operandul a cu {08/31/01}+1= numrul de zile din operandul b {09/01/01} decrementeaz data din operandul a {08/01/01}-1= cu numrul de zile din operandul b {07/31/01} calculeaz diferena n zile dintre {08/01/01}primul operand i al doilea operand {07/01/01}=31
Subtipul datetime (timp calendaristic) permite memorarea momentelor de timp dintr-o zi, cu o precizie de sutime de secund, att fa de data curent, ct i fa de momentul zero al sistemului FoxPro care este considerat data de 1 ianuarie 100. Se memoreaz folosind 8 octei: 4 octei pentru data calendaristic (memorat sub form de ntreg care reprezint numrul de zile scurse de la momentul zero FoxPro) i 4 octei pentru timp (memorat sub form de ntreg care reprezint numrul de secunde scurse de la miezul nopii). i pentru constanta timp calendaristic se folosesc ca delimitatori parantezele acolad. 10 ntre paranteze se scriu data i timpul n formatul ll/zz/aa oo:mm:ss [xM] . oo reprezint un numr format din dou cifre pentru or: 00oo12 dac se folosete mprirea zilei n dou perioade AM (antemeridian) i PM (postmeridian) sau 00oo24 n caz contrar. mm este un numr format din dou cifre i reprezint numrul de minute (00mm59), iar ss este un numr format din dou cifre i reprezint numrul de secunde (00ss59). Operatorii timp calendaristic ce pot fi aplicai pe datele de tip timp calendaristic sunt:
T = {+, -}
Dac notm cu a primul operand, cu b al doilea operand i cu c rezultatul, aceti operatori se aplic astfel: Operator Tip a Tip b Tip c +T
11
--
--
Execut Exemplu incrementeaz timpul din {08/31/01 01:01:10 AM}+10 ={08/31/01 01:01:20 AM} operandul a cu numrul de secunde din operandul b {08/31/01 01:01:10 AM}-5 decrementeaz timpul din ={08/31/01 01:01:5 AM} operandul a cu numrul de secunde din operandul b {08/31/01 01:01:15 AM} calculeaz diferena n {08/31/01 01:01:10 AM} = 5 secunde dintre primul operand i al doilea operand
8 9
Tip dat calendaristic. Tip ntreg. 10 Parantezele [ ] semnific faptul c este opional coninutul lor. 11 Tip timp calendaristic;
51
formatul masca de introducere eticheta valoarea implicit regula de validare textul regulii de validare indexarea valoarea nul
Formatul (format). Aceast proprietate controleaz modul n care sistemul de gestiune a bazelor de date afiez valoarea memorat n cmp. Pentru fiecare tip sau subtip de dat exist mai multe formate de afiare. Masca de introducere (input mask). Aceast proprietate controleaz valorile datelor introduse n cmp. Ea determin numrul de poziii ale cmpului i, pentru fiecare poziie din cmp, tipul caracterului acceptat: numeric, alfabetic, alfanumeric, caracter special, un anumit caracter, orice caracter. Pentru caracterele alfabetice se poate stabili dac sunt litere mici sau litere mari. Se mai poate stabili dac introducerea datelor se face de la stnga la dreapta (pentru cmpurile aliniate la stnga, cum sunt de exemplu irurile de caractere) sau de la dreapta la stnga (pentru cmpurile aliniate la dreapta, cum sunt de exemplu numerele ntregi). O masc de introducere special este masca password care afieaz pe ecran cte un asterisc pentru fiecare caracter introdus. Eticheta (caption). Aceast proprietate controleaz titlul afiat pe ecran pentru cmp. Valoarea implicit pentru aceast proprietate este numele cmpului. Utilizatorul poate schimba aceast valoare.
52 Informatic
Valoarea implicit (default value). Aceast proprietate controleaz iniializarea cmpului. Prin ea se poate stabili valoarea iniial atribuit unui cmp la adugarea unei nregistrri n tabel. De exemplu, pentru cmpurile de tip dat calendaristic se poate stabili ca valoare iniial data curent, iar pentru cmpurile logice valoarea true. Regula de validare (validation rule). Aceast proprietate controleaz valorile datelor introduse n cmp. Regula de validare se exprim printr-o condiie logic, ce trebuie s aib valoarea true dup ce se introduce valoarea cmpului. Regula de validare se poate aplica la nivel de: 9 cmp, i anume se verific dac valoarea introdus pentru cmp se ncadreaz ntr-un anumit interval de valori sau ntr-o anumit mulime de valori. Aceast validare se declaneaz la introducerea sau modificarea valorii cmpului. 9 nregistrare, i anume se verific dac valoarea introdus pentru cmp respect anumite corelaii cu valorile altor cmpuri din nregistrare. Aceast validare se declaneaz dup validarea la nivel de cmp, n urma introducerii sau modificrii valorii unui cmp sau a tergerii valorii cmpului. Nu se declaneaz dac se terge toat nregistrarea. n expresia din condiia de validare pot fi folosite i funcii de sistem sau definite de utilizator. Textul regulii de validare (validation text). Aceast proprietate controleaz textul afiat n cazul n care datele introduse n cmp nu respect regula de validare (n cazul n care condiia logic pentru validare are valoarea false dup introducerea valorii cmpului). De obicei, prin acest text i se explic utilizatorului regulile de validare pe care trebuie s le respecte datele introduse n cmp. Indexarea (index). Aceast proprietate controleaz dac acel cmp este folosit pentru indexare. Indexarea este o tehnologie utilizat de sistemele de gestiune a bazelor de date care permite ordonarea logic, dup un anumit criteriu, a nregistrrilor dintr-un tabel, la exploatarea sau vizualizarea datelor din tabel, fr s fie afectat ordinea fizic a nregistrrilor din tabel (ordinea n care sunt scrise). Cmpul devine cheie de indexare. Valoarea nul (NULL). Aceast proprietate controleaz dac n cmp a fost memorat sau nu o valoare nul (NULL). Aceast proprietate este util pentru a putea face deosebirea dintre un cmp n care utilizatorul nu a introdus date i un cmp n care utilizatorul a introdus o dat neutr pentru acel tip de dat, cum ar fi: 0 pentru datele numerice, irul vid - irul de caractere de lungime zero ("") - pentru datele alfabetice, false pentru datele logice sau data vid ({ / / }) pentru datele de tip dat calendaristic. De exemplu, dac ai declarat cmpul telefon numeric, respectiv ir de caractere, valoarea NULL indic faptul c nu se cunosc detalii despre numrul de telefon al acelei persoane, iar valoarea 0, respectiv irul vid arat c acea persoan nu are telefon.
53
Adresarea indirect
Unele comenzi sau funcii Visual FoxPro cer s li se furnizeze un nume, cum ar fi: numele unui fiier baz de date, numele unui cmp, numele unui alias, numele unui fiier index, numele unei variabile de memorie, numele unui tablou de memorie etc. Folosind adresarea indirect, numele poate fi furnizat prin intermediul unei variabile de memorie sau al unui tablou de memorie, astfel nct s se poat generaliza comanda. Pentru adresarea indirect se poate folosi macrosubstituia: se memoreaz numele ntr-o variabil de memorie, dup care poate fi substituit ntr-o comand sau ntr-o funcie prin numele variabilei de memorie sau al elementului de tablou, precedat de semnul & (ampersand):
&<nume_variabil_de memorie>
sau
&<nume_variabil_de memorie>.<x>
unde <x> este o expresie de tip ir de caractere. n acest caz, irul de caractere x va fi concatenat cu numele memorat n variabila de memorie. Pentru adresarea indirect se mai poate folosi i expresia nume: se memoreaz numele ntr-o variabil de memorie dup care poate fi substituit ntr-o comand sau ntr-o funcie prin numele variabilei de memorie sau al elementului de tablou, nchis ntre paranteze rotunde:
(<nume_variabil_de memorie>)
Evaluai expresii Vei evalua mai multe tipuri de expresii folosind aplicaia Visual FoxPro. n expresii vei folosi i variabile de memorie. Deschidei fereastra aplicaiei Visual FoxPro. n fereastra aplicaiei este deschis o fereastr document care are numele Command. Aceasta este fereastra de comenzi n care putei s editai diferite comenzi. Pentru nceput vei scrie diferite comenzi pentru evaluarea unor expresii. Pentru a cere evaluarea unei expresii vei scrie naintea ei semnul ? care semnific operaia de afiare. Rezultatul evalurii va fi afiat n spaiul liber al ferestrei de aplicaie. 1. Evaluai expresia: E= pentru a=1, b=2, c=3 i d=3. a+b b +d a+c + + c c + a (a + b )3
Vei folosi cinci variabile de memorie a, b, c, d, i e. Atribuii valori primelor patru variabile de memorie. Scriei patru operaii de atribuire, cte una pe fiecare rnd. Terminai fiecare operaie de atribuire apsnd tasta Enter.
54 Informatic
a=1 b=2 c=3 d=4 Atribuii variabilei de memorie e valoarea expresiei. Scriei pe un rnd operaia de atribuire i apsai la sfrit tasta Enter. e=(a+b)/c + (b+d)/(c+a)+(a+c)/((a+b)**3) Afiai valoarea variabilei de memorie e. Scriei pe un rnd comanda i apsai la sfrit tasta Enter: ?e n fereastra aplicaiei va fi afiat valoarea 2.65.
? afieaz
55
Observai c dup fiecare operaie de atribuire pentru variabilele de memorie a i b s-a executat o nou operaie de atribuire pentru expresia e, pentru ca expresia s fie evaluat cu noile valori ale variabilelor a i b. 5. Verificai dac valoarea numrului real x aparine mulimii A = (0,10]{30} pentru x=50 i pentru x=5. Pentru fiecare valoare vei testa dac x aparine sau nu la mulimea A. Pentru apartenen vei evalua expresia logic: e = (x>0 and x<=10) or x=30 iar pentru a verifica dac nu aparine vei evalua expresia logic not e.
x=50 e=(x>0 and x<=10) or x=30 ?e .F. ? not e .T. x=5 e=(x>0 and x<=10) or x=30 ?e .T. ? not e .F.
8. Aplicai diferii operatori asupra datelor calendaristice. Adugai 2 zile la data de 10 februarie 2001 i obinei data de 12 februarie 2001, scdei 10 zile din data de 1 ianuarie 2001 i obinei data de 22 decembrie 2000 i calculai diferena de zile ntre datele 1 ianuarie 2001 i 22 decembrie 2000.
? {02/10/01}+2 02/12/01 ? {01/01/01}-10 12/22/00 ? {01/01/01}-{12/22/00} 10
Macrosubstituia &b afieaz coninutul variabilei a al crei nume este memorat n variabila b, adic valoarea 1. 10. Folosii macrosubstituia. Memorai n variabila a valoarea alfa:
a=alfa alfa1=Caldura alfa2=mare
56 Informatic
alfa3=monser! ? &a.1+&a.2+&a.2 Caldura mare monser!
Macrosubstituia &a.1+&a.2+&a.3 afieaz irul de caractere Caldura mare monser! Se afieaz acest ir de caractere deoarece &a.1 are urmtoarea semnificaie: numele memorat n variabila a se concateneaz cu caracterul 1, adic alfa+1 i se obine numele de variabil de memorie alfa1.
Aadar &a.1 nseamn coninutul variabilei de memorie alfa1, adic irul de caractere Caldura. n acelai mod, &a.2 nseamn coninutul variabilei de memorie alfa2, adic irul de caractere mare, iar &a.3 nseamn coninutul variabilei de memorie alfa3, adic irul de caractere monser!. Expresia nseamn de fapt concatenarea acestor trei iruri de caractere.
ncercai:
Adevrat/Fals: 1. Visual FoxPro accept pentru numere ntregi subtipul longinteger. 2. Operatorul relaional != folosit n Visual FoxPro se numete operatorul diferit. 3. Operatorul relaional $ se folosete pentru a verifica dac valoarea unei expresii este cuprins ntre dou valori v1 i v2. 4. Subtipul memo poate fi folosit n Visual FoxPro pentru iruri de caractere care au o lungime mai mare de 254 de caractere. 5. Subtipul datetime se reprezint n Visual FoxPro pe 16 octei. 6. Valoarea nul este o proprietate a cmpului care controleaz dac ntr-un cmp nu s-a introdus nici o dat. 7. Cmpurile care n Visual FoxPro au tipul general pot fi cmpuri cheie. 8. Macrosubstituia este o metod folosit pentru a defini proprietatea unui cmp. Completai: 1. Operatorul $ folosit n Visual FoxPro se numete i se aplic pe date de tip ....................................... 2. Subtipul Date poate fi folosit pentru a reprezenta date calendaristice cuprinse ntre ..................... i .................. 3. Operatorii care pot fi folosii pentru subtipul Datetime sunt: ................ 4. n Visual FoxPro constanta de tip dat calendaristic se delimiteaz folosind caracterele ........ 5. Expresia nume se folosete pentru ........................... Alegei rspunsul corect: 1. Dac trebuie s memorai ntr-un cmp al unei baze de date Visual FoxPro media general a unui elev, vei alege un cmp numeric cu subtipul: a) simplu b) dublu c) monetar
2. Dac folosii subtipul numeric simplu pe 4 octei pentru reprezentarea unui numr ntreg ntr-o baz de date Visual FoxPro, valoarea maxim pe care o vei putea reprezenta este:
57
4. Reprezentarea subtipului float folosit pentru cmpurile numerice din Visual FoxPro are lungimea de: a) 1 octet b) 20 octei c) cuprins ntre 1 octet i 20 de octei 5. Reprezentarea subtipului integer folosit pentru cmpurile numerice din Visual FoxPro are lungimea de: a) 4 octei b) 8 octei c) 16 octei 6. Operatorul folosit n Visual FoxPro pentru operaia modulo este : a) MOD b) \ c) % 7. n Visual FoxPro numrul maxim de caractere dintr-un ir de caractere este: a) 254 b) 255 c) 256 8. n Visual FoxPro rezultatul evalurii expresiei 12 + {08/15/01} - {07/15/01} = 43 este: a) .T. b) .F. c) eroare 9. n Visual FoxPro operatorul ! este un operator: a) relaional b) logic c) de concatenare Rspundei: 1. Ce subtipuri numerice se folosesc pentru cmpurile din Visual FoxPro? 2. n Visual FoxPro ce operatori relaionali se folosesc n plus pentru datele de tip ir de caractere fa de cele de tip numeric? 3. Ce operatori de concatenare se folosesc n Visual FoxPro? Care este deosebirea dintre ei? 4. Pentru ce tip de date a fost implementat subtipul memo? n ce caz se recomand folosirea lui? 5. Ce subtipuri de date se folosesc n Visual FoxPro pentru gestionarea timpului? 6. Pentru ce se folosete tipul de date general n Visual FoxPro? 7. Ce este valoarea nul a unui cmp? 8. Care sunt proprietile cmpurilor dintr-o baz de date? 9. Ce este regula de validare? La cte niveluri se poate aplica?
Adevrat/Fals: 1-F; 2-A; 3-F; 4-A; 5-F; 6-A; 7-F; 8-F. Completai: 1-inclus n, iruri de caractere; 2-1 ianuarie 100, 31 decembrie 9999; 3-+,-; 4-{ }; 5-adresarea indirect. Alegei rspunsul corect: 1) a; 2) b; 3) b; 4) c; 5) a; 6) c; 7) a; 8) a; 9) b.
spunsuri:
Capitolul
Baza de date relaional este un instrument complex de organizare a datelor. Ea este format nu numai din datele care reprezint informaia 1. propriu-zis (datele din tabele), dar i de multe date ajuttoare necesare pentru descrierea structurii tabelelor i a relaiilor dintre tabele, pentru 2. regsirea i interpretarea datelor, astfel nct s 3. v poat oferi acces la o mare cantitate de informaii care s v ajute s luai decizii. Pentru administrarea ei este necesar un software specializat numit sistem de gestiune a bazelor de date. Termenul de baz de date se refer la modelul de organizare a datelor pe suportul de me4. morare, iar termenul de gestiune se refer la aciunea de stocare i prelucrare a acestor date. Deja ai putut vedea ce tipuri de date se folosesc ntr-un sistem de gestiune a bazelor de date. Acesta a fost primul pas pentru a nelege complexitatea unui sistem de gestiune a bazelor de date.
Dup ce vei parcurge acest capitol trebuie s tii: S lucrai cu interfaa unei aplicaii specifi pentru gestiunea bazelor de date. S creai o baz de date definind tabelele i relaiile dintre ele. S executai prin intermediul interfeei operaii specifice gestiunii bazelor de date relaionale: actualizarea (adugarea, tergerea i modificarea nregistrrilor), sortarea, consultarea, cutarea, sortarea. S obinei informaii din baza de date sub form de rapoarte, interogri i vizualizri.
Orice sistem de gestiune a bazelor de date trebuie s asigure urmtoarele funcii elementare: 9 definirea bazei de date, 9 actualizarea datelor din baza de date prin: adugarea de noi nregistrri, tergerea unor nregistrri, modificarea valorii unor cmpuri din nregistrri; 9 interogarea bazei de date (extragerea informaiilor din baza de date). La aceste funcii elementare, pe msura dezvoltrii sistemelor de gestiune a bazelor de date s-au mai adugat i alte funcii, dintre care cele mai importante sunt: 9 generarea formularelor de ecran pentru introducerea datelor, 9 generarea rapoartelor,
59
9 noi modaliti de interogare a bazelor de date (de exemplu folosind un limbaj neprocedural cum este SQL).
Pe microcalculatoare au fost implementate mai multe tipuri de sisteme de gestiune a bazelor de date: 9 dBase II, III, III+, IV au fost realizate de firma Ashton-Tate. Ele au deinut supremaia muli ani i au impus un standard n domeniul bazelor de date relaionale, astfel nct sistemele dezvoltate ulterior, cum este i sistemul FoxPro, au preluat i dezvoltat acest standard. Deoarece bazele de date dBase au nmagazinat un volum foarte mare de date, pentru a nu se pierde aceste date i pentru a le putea folosi ulterior cu ajutorul aplicaiilor create cu alte sisteme de gestiune a bazelor de date, toate noile sisteme de gestiune a bazelor de date pentru microcalculatoare, dac nu folosesc standardul dBase, au implementat facilitatea de import al bazelor de date dBase. 9 Clipper a fost creat de firma Nantucket i respect standardul dBase. 9 Paradox creat de firma Borland a fost ulterior cumprat de firma Corel i integrat n setul software creat de aceast firm. Nu respect standardul dBase. 9 FoxPro a fost creat de firma FoxSoftware i a fost cumprat ulterior de firma Microsoft. Este sistemul de gestiune a bazelor de date care s-a impus cel mai mult n ultima vreme pe microcalculatoare. 9 Access a fost creat de firma Microsoft i integrat n setul Microsoft Office. Nu respect standardul dBase, dar poate importa baze de date dBase. Dintre sistemele de gestiune a bazelor de date folosite pe microcalculatoare vei studia aplicaia Visual FoxPro, deoarece este cea mai nou versiune a sistemului de gestiune a bazelor de date FoxPro. Termenul visual nseamn c aplicaia dispune de instrumentele folosite de programarea vizual. n aceast tehnic de programare, programatorii au la dispoziie programe utilitare care scriu singure secvena de instruciuni necesare pentru realizarea unor operaii. Rolul programatorului se reduce la specificarea unor opiuni (valoarea unor parametri) n cadrul unui dialog interactiv cu programul utilitar.
60 Informatic
9 Permite o adaptare uoar la lucrul cu mai muli utilizatori, fr s necesite implementarea unei variante speciale pentru lucrul n reea. 9 Are implementat conceptul de colecie de date definit ca un depozit cu informaii despre tabele, care permite folosirea numelor lungi pentru tabele i pentru cmpuri i implementarea integritii refereniale direct n tabelele bazei de date n loc s fie descris n programele de aplicaie. 9 Permite comunicarea i cu alte aplicaii folosind mecanisme DDE, cum este de exemplu, comunicarea cu aplicaia Excel. Orice modificare fcut ntr-o foaie de calcul Excel se va reflecta i n tabelul bazei de date FoxPro. 9 Are implementat protocolul OLE care permite schimbul de date ntre aplicaii diferite. Aplicaiile FoxPro sunt aplicaii client i n ele pot fi legate i ncapsulate diferite obiecte produse de aplicaiile server: texte, sunete, imagini, foi de calcul. 9 Permite importul i exportul diferitelor tipuri de date pstrate n diferite formate de fiiere: Access, dBase, Paradox, Oracle, Excel etc. 9 Dispune de un limbaj procedural puternic ce permite descrierea datelor i a aplicaiilor pe baza modelului programrii structurate, n care orice algoritm de rezolvare a unei probleme poate fi descris cu ajutorul a trei structuri de control: liniar, alternativ, repetitiv. 9 Are implementat pentru interogarea bazei de date, pe lng limbajul propriu, att limbajul de interogare de tip SQL, ct i limbajul de tip QBE (interogarea prin exemple, exemplele fiind create interactiv prin diferite obiecte puse la dispoziie de interfa). Aceste limbaje uureaz folosirea sistemului de ctre utilizatorii neinformaticieni. 9 ncepnd cu versiunea 3.0, n limbajul FoxPro este implementat i modelul programrii orientate pe obiecte. Dac n programarea clasic datele i programele care le prelucrau erau separate, n programarea orientat pe obiecte programul este definit ca un obiect care nglobeaz att ansamblul de date, ct i algoritmii care prelucreaz aceste date. n cadrul algoritmilor se folosete n continuare modelul programrii structurate. 9 Limbajul de programare propriu sistemului de gestiune a bazelor de date FoxPro are implementat i modelul programrii conduse de evenimente. n cadrul acestui model, programul este considerat un ansamblu de proceduri care nu se execut ntr-o ordine descris de programator, ci numai atunci cnd apar n sistem anumite evenimente. Un exemplu de astfel de eveniment este apsarea unei combinaii de taste, care se poate produce n orice moment n sistem i nu la momente determinate de programator. 9 Permite programarea vizual a aplicaiilor. Acest tip de proiectare ofer programatorilor posibilitatea de a realiza mai simplu aplicaii de exploatare a bazelor de date, deoarece ei nu mai sunt obligai s precizeze cum trebuie realizat aplicaia (s descrie algoritmul de rezolvare a problemei), ci ce trebuie s realizeze aplicaia. Pentru aceasta, FoxPro pune la dispoziia utilizatorilor diferite instrumente vizuale numite generatoare sau constructori. Acestea sunt programe care permit proiectarea interactiv a bazelor de date, a interogrilor, a rapoartelor, a elementelor de interfa (formulare de introducere a datelor, meniuri, ferestre), a aplicaiilor i a proiectelor. n plus, utilizatorul poate apela i la procedurile asistent (wizard) care l ndrum interactiv, pas cu pas n construirea acestor elemente. Elementul va fi realizat pe baza datelor furnizate de ctre programator n cadrul dialogului interactiv. 9 Are o vitez de lucru foarte mare, deoarece folosete o tehnologie special denumit tehnologie Rushmore care reduce timpul de acces la date prin optimizarea interogrilor.
61
Interfaa grafic
Interfaa grafic este de tip MDI (interfa cu mai multe documente), adic n fereastra aplicaiei pot fi deschise mai multe ferestre document. Ea este compatibil cu interfaa de tip Microsoft Office (meniurile, barele de instrumente, scurtturile de la tastatur). Fereastra aplicaiei prezint un sistem de meniuri care pun la dispoziia utilizatorului marea majoritate a comenzilor care formeaz limbajul de comand. n general, opiunea de meniu reprezint verbul comenzii, iar adverbele sunt precizate prin intermediul controalelor din caseta de dialog. Comenzile, n funcie de modul n care pot aciona, sunt grupate n meniuri. Astfel: Titlurile meniurilor Barele cu instrumente
Meniul Edit conine operaiile pentru editarea textelor, inclusiv a comenzilor din fereastra document Command.
n fereastra Command putei s editai comenzile. Pentru editare putei folosi aceleai tehnici ca i n cazul editoarelor de texte.
9 File conine opiuni pentru operaii cu fiiere: creare, deschidere, salvare, tiprire. Mai conine i opiunea pentru nchiderea aplicaiei Visual FoxPro: Exit.
62 Informatic
9 Edit conine opiuni pentru editarea textelor: operaii de selectare, operaii de copiere (Cut, Copy, Paste), operaii de cutare i nlocuire (Find i Replace), inserarea sau legarea obiectelor. 9 View conine opiuni pentru modificarea obiectelor afiate n fereastra aplicaiei. Cea mai important opiune este Toolbars... care v permite s alegei barele cu instrumente care vor fi afiate. 9 Format conine opiuni pentru formatarea textelor afiate n ferestrele document ale aplicaiei (fontul, dimensiunea i stilul caracterelor, indentarea i spaiul dintre liniile paragrafelor). 9 Tools conine opiuni prin care putei alege diferite instrumente: proceduri asistent, editorul de macrocomenzi, ferestrele pentru depanarea programului (Debug) sau pentru executarea pas cu pas a programului (Trace). 9 Program conine opiuni pentru compilarea i executarea programelor. 9 Window conine opiuni pentru operaii cu ferestrele document: aranjarea ferestrelor (Arrange All), ascunderea ferestrei active (Hide), tergerea ferestrei active (Clear), comutarea ntre ferestre (Cycle), deschiderea ferestrei de comenzi (Command Window), deschiderea ferestrei pentru vizualizarea tabelelor din baza de date deschis i a legturilor dintre tabele (View Window). 9 Help conine opiuni pentru asigurarea asistenei utilizatorului.
Sistemul de meniuri este dependent de context. n funcie de operaiile care se execut, mai pot s apar meniurile: Titlul meniului Database este afiat n bara de meniuri numai dac n fereastra aplicaiei este deschis o fereastr document de tip baz de date n care sunt afiate tabelele bazei de date i relaiile dintre ele.
63
9 Table conine opiuni pentru manipularea nregistrrilor din tabel: adugarea de noi nregistrri - Append New Record i Append Records..., marcarea pentru tergere a nregistrrilor (tergerea logic) - Delete, refacerea nregistrrilor terse logic - Recall tergerea fizic a nregistrrilor marcate pentru tergere - Remove Deleted Records, poziionarea pe o nregistrare din tabel - Go to Record..., nlocuirea valorilor unor cmpuri cu alte valori - Replace Field..., actualizarea indexului tabelului pentru a reflecta situaia actual - Rebuild Indexes etc. Meniul mai conine i opiuni pentru stabilirea proprietilor tabelului (Properties...) i pentru alegerea fontului, a dimensiunii i a stilului caracterelor cu care se afieaz datele din tabel (Font...) etc. 9 Database conine opiuni pentru manipularea tabelelor din baza de date: crearea unui tabel nou i adugarea lui la baza de date - New Table, adugarea unui tabel la baza de date - Add Table, crearea unei noi vizualizri i adugarea ei la baza de date New Local View, modificarea structurii tabelului selectat din baza de date - Modify, afiarea coninutului tabelului selectat din baza de date ntr-o fereastr de editare Browse, nlturarea unui tabel din baze de date - Remove, actualizarea indexului tabelului selectat din baza de date - Rebuild Table Indexes, tergerea fizic a nregistrrilor marcate logic pentru tergere din tabelul selectat din baza de date Remove Deleted Records..., editarea relaiei selectate dintre dou tabele ale bazei de date - Edit Relationship... deschiderea ferestrei generatorului pentru integritatea referenial a bazei de date - Referential Integrity... etc.
Titlul meniului Table este afiat n bara de meniuri numai dac n fereastra aplicaiei este deschis o fereastr document de tip tabel al bazei de date.
64 Informatic
Bara de stare furnizeaz informaii despre obiectul focalizat (titlu de meniu, opiune de meniu, buton din bara cu instrumente etc.), despre programul care se execut (numele programului) sau despre tabelul bazei de date selectat. n acest ultim caz, furnizeaz informaii despre identificatorul tabelului (<nume_baz_date> ! <nume tabel>) i aliasul tabelului, despre numrul nregistrrii curente x din numrul total de nregistrri y. Afiarea se face sub forma <x>/<y>. Aceste informaii sunt afiate n partea stng a barei de stare:
n partea dreapt a barei de stare sunt afiate informaii despre tastele comutator Insert (OVR), Num Lock (NUM) i Caps Lock (CAPS). Dac numele lor este afiat (ca n exemplu), nseamn c sunt activate. La fel ca la orice aplicaie Microsoft, utilizatorul mai are la dispoziie i meniul contextului sau meniul de comenzi rapide care se deschide atunci cnd executai clic cu butonul din dreapta al mouse-ului pe un obiect din fereastr. Opiunile din acest meniu depind de context (de obiectul indicat cu mouse-ul).
Ferestrele document care pot fi deschise n fereastra aplicaiei Visual FoxPro sunt:
Obiectul indicat cu mouse-ul a fost spaiul liber al ferestrei generatorului de baz de date. Meniul contextului conine opiuni care se refer la baza de date.
Obiectul indicat cu mouse-ul a fost un tabel al bazei de date. Meniul contextului conine opiuni care se refer la tabel.
9 Fereastra Command. Se folosete pentru editarea comenzilor. 9 Fereastra View. Se folosete la vizualizarea tabelelor bazei de date deschise, a relaiilor dintre tabele i a zonelor n care lucreaz fiecare tabel.
65
9 Ferestrele pentru constructori i generatoare. Se folosesc pentru crearea i modificarea diferitelor elemente Visual FoxPro: baze de date (Database Designer), tabele ale bazei de date i indeci (Table Designer), vizualizri (View Designer), interogri (Query Designer), formulare pentru introducerea datelor (Form Designer), rapoarte (Report Designer), meniuri (Menu Designer). 9 Fereastra pentru administratorul de proiecte (Project Manager). Proiectul este o colecie de fiiere, date, documente i obiecte Visual FoxPro folosite de o aplicaie. 9 Fereastra pentru editarea fiierelor cu texte, a fiierelor de programe i a cmpurilor memo. Numele ferestrei va fi numele fiierului, iar n cazul cmpului memo numele va fi format din numele tabelului i numele cmpului memo, separate prin punct. 9 Fereastra pentru editarea unui tabel. Poate s fie de tip Browse cnd sunt afiate mai multe nregistrri din tabel, cte o nregistrare pe fiecare rnd sau de tip Edit cnd este afiat o singur nregistrare, cte un cmp pe fiecare rnd. Numele ferestrei este numele tabelului. 9 Fereastra Debug. Se folosete pentru depanarea programelor. 9 Fereastra Trace. Se folosete pentru executarea pas cu pas a unui program.
Deschiderea unei ferestre document se face automat la alegerea unei opiuni de meniu sau printr-o comand. Operaiile cu ferestrele document (redimensionarea, minimizarea, maximizarea, mutarea, defilarea coninutului) se execut la fel ca la orice aplicaie Microsoft Office. Pentru operaia de ascundere a unei ferestre alegei opiunea Hide Window.
Barele cu instrumente grupeaz dup funcii butoanele scurtturi pentru opiunile din meniuri. Bara standard conine aceleai butoane ca orice bar standard din aplicaiiile Microsoft Office. Celelalte bare grupeaz n general butoane care corespund ferestrelor document ale generatoarelor (Database Designer, Form Designer, Report Designer, View Designer i Query Designer) sau butoane prin care pot fi inserate diferite controale n formulare sau rapoarte (Form Controls i Report Controls). Controalele care pot fi inserate ntr-un formular pot fi: etichete, casete de text, deruloare, butoane de comand, comutatoare, butoane de opiuni, liste, casete combinate, grile etc.
Limbajul de comand
Comenzile vor fi editate n fereastra Command. Fiecare comand se scrie pe un rnd. Terminarea unei comenzi se marcheaz prin acionarea tastei Enter. Acionarea acestei taste semnific faptul c interpretorul de comenzi poate prelua aceast comand s o analizeze, s o decodifice i s o lanseze n execuie.
Comanda este o succesiune de caractere organizate conform sintaxei limbajului, prin care i se cere calculatorului s execute o aciune. Sintaxa se refer la structura liniei de comand. Linia de comand are urmtoarea sintax: verb list adverbe
Enter
definete aciunea
66 Informatic
2. n general, adverbele din list pot fi scrise n orice ordine. 3. Cuvintele din comand pot fi scrise cu litere mari sau mici sau combinaie de astfel de litere. 4. Verbul comenzii poate fi prescurtat la primele patru caractere ale cuvntului. 5. Comanda trebuie scris pe un singur rnd. Dac vrei s o scriei pe mai multe rnduri, nainte de acionarea tastei Enter (care semnific terminarea comenzii), trebuie s scriei caracterul ; . Prezena lui nseamn c prin acionarea tastei Enter comanda nu se termin, ci se continu pe rndul urmtor. 6. Lungimea maxim a unei linii de comand este de 1024 caractere. 7. Adverbele pot fi: 9 nume de cmpuri, nume de variabile de memorie, nume de fiiere, aliasuri, expresii. 9 o list - reprezint un grup de elemente asemntoare (nume de cmpuri, nume de variabile de memorie etc.). Separarea lor n list se face prin virgul. 9 un domeniu (scope) - reprezint un grup de nregistrri dintr-un tabel. Domeniul poate fi precizat prin: a. cuvinte cheie: Record <n> - nregistrarea cu numrul n, Next <n> - urmtoarele n nregistrri, ncepnd cu nregistrarea curent, All - toate nregistrrile, Rest - toate nregistrrile pn la sfritul tabelului ncepnd cu nregistrarea curent. b. clauze (precizeaz un anumit tip de aciune): For <x> - numai nregistrrile care satisfac condiia precizat prin expresia logic x, ncepnd cu prima nregistrare a tabelului. While <x> - toat secvena de nregistrri care urmeaz nregistrrii curente pentru care expresia logic x este adevrat, pn la prima nregistrare pentru care expresia nu este adevrat. Alte clauze care pot fi folosite ca adverbe sunt: All/Like/Except <ablon> - poate fi folosit pentru a preciza un grup de variabile de memorie, tablouri de memorie sau fiiere, al cror nume corespunde ablonului. Comanda va aciona asupra tuturor (All), numai asupra celor care corespund ablonului (Like) sau numai asupra celor care nu corespund ablonului (Except). To - controleaz ieirea unei comenzi, redirecionnd-o fa de ieirea standard (care este ecranul). Ieirea poate fi: un fiier: File <nume_fiier> un tablou de memorie: Array <nume_tablou> imprimanta: Printer In <alias> - permite manipularea unui tabel ntr-o alt zon de lucru precizat prin alias. Alias este un nume care se atribuie unui tabel, diferit de numele pe care l-a primit acesta la crearea sa. Poate fi folosit pentru identificarea tabelului. Additive - controleaz modul n care se scriu date ntr-un fiier; prezena acestei clauze precizeaz c datele vor fi adugate la fiier (scrise la sfritul fiierului), iar absena clauzei precizeaz c datele vor fi scrise la nceputul fiierului (vechile date din fiier se vor distruge).
67
While <x>
nregistrarea curent
nu sfrit
De exemplu, linia de comand: Display next 30 adresa for nume=Popescu conine verbul display (afieaz) i adverbele care precizeaz ce nregistrri i cmpuri vor fi afiate din tabel. Lista de adverbe conine trei adverbe: next 30 - un adverb prin care se precizeaz domeniul nregistrrilor care vor fi afiate: urmtoarele 30 de nregistrri ncepnd cu nregistrarea curent; adresa - un adverb nume de cmp care precizeaz ce cmpuri se vor afia din nregistrri; for nume=Popescu - un adverb precizat printr-o clauz care definete domeniul nregistrrilor: toate nregistrrile pentru care valoarea cmpului nume este Popescu.
67
While <x>
nregistrarea curent
nu sfrit
De exemplu, linia de comand: Display next 30 adresa for nume=Popescu conine verbul display (afieaz) i adverbele care precizeaz ce nregistrri i cmpuri vor fi afiate din tabel. Lista de adverbe conine trei adverbe: next 30 - un adverb prin care se precizeaz domeniul nregistrrilor care vor fi afiate: urmtoarele 30 de nregistrri ncepnd cu nregistrarea curent; adresa - un adverb nume de cmp care precizeaz ce cmpuri se vor afia din nregistrri; for nume=Popescu - un adverb precizat printr-o clauz care definete domeniul nregistrrilor: toate nregistrrile pentru care valoarea cmpului nume este Popescu.
68 Informatic
memorat n fiier. n plus, de fiecare dat cnd se dorete executarea acelor comenzi, ele nu vor mai fi scrise, ci lansate direct n execuie din fiierul de comenzi. Pentru crearea unui fiier de comenzi se deschide fereastra editorului de texte folosind comanda: Modify command <nume_fiier> n fereastra de editare vei scrie comenzile, cte una pe fiecare rnd, aa cum le scriai i n fereastra de comenzi. Operaiile pentru editare (selectare, copiere sau mutare text selectat, cutare sau cutare cu nlocuire a unui ir de caractere, anularea ultimei operaii) sunt operaiile obinuite ale unui editor de texte Windows. Comenzile pentru aceste operaii se gsesc sub form de opiuni n meniul Edit. Dup ce ai scris comenzile, salvai fiierul cu opiunea SaveFile. Pentru nchiderea ferestrei de editare putei folosi scurtturile: Ctrl+W pentru nchiderea cu salvare sau Esc pentru nchiderea fr salvare. Lansai n execuie programul cu comanda: Do <nume_fiier>
69
Aceast form se folosete pentru parametrii care pot lua o valoare dintr-un domeniu de mai multe valori. Ei vor fi precizai prin valoare. De exemplu: Set Default to <cale_director> Schimb directorul curent n cel precizat prin <cale_director>. Set Clock to [<x>,<y>] Controleaz parametrul Clock care reprezint poziia afirii ceasului pe ecran. Ea poate fi precizat prin coordonatele <x> - numrul rndului i <y> - numrul coloanei. Poziia implicit de afiare este colul din dreapta sus al spaiului de lucru din fereastra de aplicaie Visual FoxPro. Set Hours to [12/24] Controleaz parametrul Hours care reprezint formatul de afiare al orei. El poate considera ziua ca fiind format din dou grupe de 12 ore (cu precizarea am sau pm) sau dintr-un grup de 24 de ore. Valoarea implicit este 12. Set Path to <list_ci_director> Permite stabilirea unei liste de cutare; aceast list conine mai multe ci de director n care se va cuta fiierul precizat n comand, dac nu va fi gsit n directorul curent. Pentru a vizualiza starea parametrilor care pot fi stabilii prin comenzi Set, folosii comanda: Display status Obinei informaii despre starea unui parametru care poate fi stabilit prin comenzi Set folosind funcia: Set (<nume parametru>[,1|2]) Numele parametrului se scrie ca un ir de caractere. Dac numele parametrului este folosit cu ambele forme ale comenzii Set (cum este de exemplu parametrul Clock), el reprezint doi parametri cu semnificaie diferit. n acest caz se folosete 1 sau 2 pentru a afla informaii despre fiecare parametru.
70 Informatic
Tipul ir de caractere. Putei folosi comanda:
Set Exact On|Off Controleaz modul n care se execut operaia de comparare a dou iruri. Dac are valoarea on, dou iruri pentru a fi egale trebuie s aib aceeai lungime i s fie identice la nivelul fiecrei poziii a caracterelor. Dac are valoarea off, irurile pot avea lungimi diferite. Ele vor fi egale numai dac se potrivesc pn cnd se termin irul din dreapta. Valoarea implicit este on.
71
9 Internationals pentru parametrii care stabilesc formatul datelor calendaristice, al datelor moment de timp i al datelor numerice.
72 Informatic
73
Din interfaa sistemului de operare Windows lansai aplicaia Visual FoxPro. Administrai interfaa aplicaiei Visual FoxPro 1. Identificai elementele ferestrei de aplicaie Visual FoxPro: bara de meniuri, bara cu instrumente, bara de stare, fereastra de comenzi i spaiul de lucru al ferestrei de aplicaie. 2. Fereastra Commands este o fereastr document. Executai cu aceast fereastr operaiile de minimizare, deplasare, maximizare, redimensionare i restaurare. Observai c aceste operaii se execut numai n cadrul ferestrei de aplicaie. 3. Deschidei caseta de dialog Toolbars cu opiunea Toolbars...View. n lista Toolbar executai clic pe comutatorul View Designer i apoi clic pe declanatorul Ok. Observai c n fereastra aplicaiei este afiat o nou bar cu instrumente. Deschidei din nou caseta de dialog Toolbars. Verificai s fie activat numai comutatorul Standard din lista Toolbar. Executai clic pe declanatorul Ok. Observai c n fereastra aplicaiei este afiat numai bara standard cu instrumente. 4. Deschidei meniul Window. Observai informaiile afiate n bara de stare. 5. Executai operaii cu ferestrele document: Ascundei fereastra document Command cu opiunea HideWindow. Observai c n bara de meniu nu mai este afiat titlul meniului Format, deoarece acest meniu conine opiuni pentru formatarea textelor editate. El depinde de existena unei ferestre care s permit editarea. Fereastra Command este o fereastr n care se editeaz comenzi. Ferestrele View i Debug pe care le vei deschide nu sunt ferestre de editare. Reafiai fereastra apsnd tastele Ctrl+F2 (scurttura opiunii CommandWindow). Deschidei fereastra View cu opiunea ViewWindow. Deschidei fereastra Debug cu opiunea Debug WindowTools. Activai pe rnd ferestrele document deschise, apsnd tastele Ctrl+F1. nchidei ferestrele View i Debug executnd clic pe butonul de nchidere. Folosii autodocumentarea 1. Vizualizai informaii despre comanda Display Status (help dependent de context): Scriei n fereastra Command comanda Help Display Status. Se deschide caseta de dialog Help Topics. n list este selectat subiectul DISPLAY STATUS command. Executai clic pe declanatorul Display. Se deschide caseta de dialog Topics Found. Selectai n list subiectul DISPLAY STATUS command i executai clic pe declanatorul Display. Se deschide fereastra aplicaiei Help. n fereastr sunt afiate informaii despre acest subiect. Executai clic pe butonul Glossary. Se deschide caseta de dialog Help Index. Executai clic pe butonul cu litera S. n caset este afiat lista cu termenii care ncep cu litera S. Executai clic pe termenul SQL. Se deschide o caset cu text n care v sunt furnizate informaii despre acest termen. nchidei aceast caset executnd clic n exteriorul ei.
74 Informatic
nchidei caseta de dialog cu glosarul executnd clic pe butonul de nchidere. nchidei fereastra Help executnd clic pe butonul de nchidere.
2. Vizualizai informaii despre controalele din caseta de dialog Toolbars (help dependent de context): Deschidei caseta de dialog Toolbars. Executai clic pe butonul Help. Se deschide fereastra Help. n fereastr este afiat subiectul Toolbar (View Menu). nchidei fereastra Help. n caseta de dialog Toolbars apsai tasta F1. Observai c aceast aciune are acelai efect ca i apsarea butonului Help. nchidei fereastra Help. 3. Lucrai cu controalele din fereastra Help (help independent de context): Deschidei fereastra Help cu ContentsHelp. n spaiul de lucru al ferestrei este prezentat o list de capitole cu subiecte. Fiecare titlu de capitol reprezint un salt ctre o list cu subcapitole. Executai clic pe numele capitolului Language Reference. n fereastr va fi afiat lista cu subcapitolele. Executai clic pe numele subcapitolului Language Reference A-Z. Se deschide caseta de dialog Help Index. Executai clic pe subiectul = Command. n fereastra Help va fi afiat coninutul subiectului = Command (Comanda =; operaia de atribuire). nchidei fereastra executnd clic pe butonul de nchidere. Lucrai cu ferestrele document ale constructorilor 1. Alegei opiunea OpenFile. Se deschide caseta de dialog Open. n list este afiat coninutul dosarului Vfp (Visual FoxPro). Deschidei din list dosarul cu exemple Sample. Deschidei apoi dosarul Data. Din lista ascuns Files of type alegei valoarea Database. Executai clic n lista cu fiiere i dosare pe numele fiierului Testdata.dbc. Executai clic pe declanatorul Ok. 2. Se deschide fereastra Database Designer (generatorul bazei de date). n fereastr este afiat baza de date a unei organizaii: tabelele i relaiile dintre tabele. n fereastr nu este activat nici un obiect. Observai c meniul Format a fost nlocuit cu meniul Database. 3. Deschidei meniul Database. Identificai opiunile disponibile. De ce nu sunt disponibile opiunile Modify..., Browse i Remove? nchidei lista meniului. 4. Executai clic pe tabelul Products. Observai informaiile din bara de stare. Deschidei meniul Database. Identificai opiunile disponibile. De ce nu este disponibil opiunea Edit Relationship...? nchidei lista meniului. 5. Executai clic pe legtura dintre tabelele Orders i Orditems. Deschidei meniul Database. De ce este acum disponibil opiunea Edit Relationship...? De ce nu sunt disponibile opiunile Modify..., Browse i Remove? nchidei lista meniului. 6. Executai dublu clic pe tabelul Products. Se deschide fereastra Table Designer (generatorul de tabele). Fereastra are numele tabelului - Products, iar n fereastr sunt afiate datele din acest tabel. n partea superioar a ferestrei sunt afiate numele cmpurilor din tabel (numele fiecrei coloane). Putei s derulai coninutul ferestrei folosind barele de derulare. Observai c meniul Database a fost nlocuit cu meniul Table. 7. Deschidei meniul Table. Identificai opiunile de meniu care pot fi folosite pentru administrarea nregistrrilor dintr-un tabel. nchidei lista meniului.
75
8. Deschidei meniul View. Observai c opiunile acestui meniu sunt dependente de context. n meniu au aprut opiuni noi. De exemplu, a aprut un grup de opiuni de tip butoane radio: Browse i Edit. Este activat opiunea Browse. Aceasta nseamn c fereastra generatorului de tabel este de tip Browse. Executai clic pe opiunea Edit. Observai c s-a modificat modul n care sunt afiate datele n fereastra tabelului. De data aceasta, pe fiecare rnd este afiat coninutul unui cmp. Numele cmpului apare scris la nceputul rndului. Revenii la modul de afiare Browse. 9. nchidei cele dou ferestre document. Observai c n fereastra Command au aprut comenzile pe care le-ai executat prin intermediul interfeei: OPEN DATABASE C:\VFP\SAMPLES\DATA\Testdata.dbc EXCLUSIVE MODIFY DATABASE Configurai mediul de lucru Visual FoxPro 1. Configurai ceasul i modul n care este afiat timpul:
set hours to 12 set clock to status ceasul este afiat n bara de stare n format de 12 ore ? set ('clock') STATUS ? set ( 'hours') 12 set clock off ceasul nu mai este afiat n bara de stare set clock on ceasul este afiat n colul din dreapta sus al spaiului de lucru al ferestrei ? set ('clock',1) 0.000, 122.333 set clock to 15,60 ceasul este n interiorul spaiului de lucru al ferestrei ? set ('clock',1) 15.000, 60.000 (noile coordonate ale ceasului) set hours to 24 ceasul este afiat n format de 24 de ore ? set ( 'hours') 12
3. Identificai modul n care putei modifica interactiv diferii parametri Set. Deschidei caseta de dialog Options la diferite seciuni i verificai controalele din urmtorul tabel n care este prezentat o comparaie ntre modul de lucru comand i modul de
76 Informatic
lucru interactiv. Reluai operaiile de la punctele anterioare folosind controalele din caseta de dialog Options. Parametru Mod comand Bell Set Bell On|Off Mod interactiv Seciunea General; grupul de butoane radio Off (fr sunet), Default (cu sunet implicit), Play (cu sunet ales prin intermediul unei casete de text). Seciunea View; caseta Show; comutatorul Clock. Seciunea International; grupul de butoane radio 12-Hour i 24-Hour. Seciunea International; caseta de text cu derulor Decimals Digit. Seciunea International; caseta de text Decimals Separator. Seciunea Data; comutatorul SET EXACT. Seciunea View; caseta Show; comutatorul Status Bar. Seciunea View; caseta Show; comutatorul Command Result.
Set Clock On|Off Set Clock to [12|24] Set Decimals to Set Point to
Exact Set Exact On|Off Status Bar Set Status Bar On|Off Talk Set Talk On|Off
Lucrai cu fereastra document a editorului de texte 1. Scriei n fereastra Command urmtoarele comenzi pe care le executai:
set fixed on set decimals to 4 set point to ',' x=4*30 ?x
Se afieaz rezultatul 120,0000: 2. Deschidei fereastra de editare cu comanda modify command a1. Numele ferestrei de editare este numele fiierului a1.prg. 3. Activai fereastra de comenzi executnd clic n aceast fereastr. Selectai comenzile introduse la punctul 1. Copiai n zona Clipboard aceste instruciuni apsnd tastele Ctrl+C. 4. Activai fereastra de editare executnd clic n spaiul ei de lucru. Copiai n aceast fereastr instruciunile din Clipboard apsnd tastele Ctrl+V. nchidei fereastra de editare cu salvarea coninutului apsnd tastele Ctrl+W. 5. Deschidei din nou fereastra de editare cu comanda modify command a1. n fereastra de editare sunt afiate instruciunile scrise anterior. Salvai acest coninut ntr-un alt fiier de program cu comanda Save As...File. n caseta de dialog Save As scriei n zona de editare Save a2. Observai numele dosarului n care se salveaz aceste fiiere cu programe. Executai clic pe declanatorul Save. Observai c acum numele ferestrei de editare este a2.prg. Ea conine comenzile din programul a1. Modificai instruciunile urmtoare, pentru a reveni la afiarea implicit a numerelor (2 poziii zecimale i separatorul punct):
set decimals to set point to
77
nchidei fiierul a2 cu salvarea modificrilor apsnd tastele Ctrl+W. 6. Executai comenzile din fiierul a1. Scriei n fereastra Commands comanda Do a1. Rezultatul afiat este 120,0000. 7. Executai comenzile din fiierul a2. Scriei n fereastra Commands comanda Do a2. Rezultatul afiat este 120.00. Manipulai fiierele 1. Copiai fiierul a1.prg sub numele nou.prg, folosind comanda: copy file a1.prg to nou.prg 2. Vizualizai lista cu fiiere cu programe din directorul curent. Identificai n list fiierele program create: a1.prg, a2.prg i nou.prg. Folosii comanda: dir like *.prg 3. Redenumii fiierul nou.prg cu numele a3.prg folosind comanda: rename nou.prg to a3.prg 4. Vizualizai lista cu fiiere cu programe din directorul curent create n aceast sesiune de lucru: a1.prg, a2.prg i a3.prg. Folosii comanda: dir like a*.prg 5. Deschidei caseta de dialog Filer folosind comanda: filer Identificai controalele din caseta de dialog. n list sunt afiate directoarele i fiierele din directorul curent. Pentru fiecare dintre ele se afieaz numele, dimensiunea, data i ora ultimei actualizri, atributele. Cele dou liste ascunse Drive i Directories se folosesc pentru a schimba discul implicit i directorul curent. Caseta de text Files Like se folosete pentru a comunica ablonul fiierelor afiate n list (implicit este *.*, adic toate fiierele). Pentru executarea operaiilor cu fiiere i directoare putei folosi declanatoarele: 9 Find - localizarea unui fiier sau director prin intermediul controalelor din caseta de dialog Find Files; 9 Copy - copierea fiierului sau a directorului selectat sau a grupului de fiiere sau directoare selectate; 9 Move - mutarea fiierului sau a directorului selectat sau a grupului de fiiere sau directoare selectate; 9 Delete - tergerea fiierului sau a directorului selectat sau a grupului de fiiere sau directoare selectate; 9 Sort - sortarea listei cu fiiere i directoare dup diferite criterii (nume, extensie, dat, dimensiune etc.); 9 Edit - editarea fiierului selectat (deschide fereastra de editare n care ncarc fiierul); 9 Attr - afiarea sau modificarea atributelor fiierului selectat; 9 Rename - redenumirea fiierului sau directorului selectat; 9 Size - afiarea dimensiunii fiierului selectat (n octei); 9 Tree - are efect de comutator: prin acionare schimb informaia afiat n list; n locul listei cu fiiere i directoare este afiat arborele de directoare. Scriei n caseta de text ablonul *.prg. Observai c n list sunt afiate numai fiierele care au extensia .prg. Revenii la afiarea tuturor fiierelor rescriind n aceast caset ablonul *.*.
78 Informatic
Selectai fiierul a1.prg i executai clic pe declanatorul Edit. Se deschide fereastra de editare n care este ncrcat fiierul a1.prg. nchidei fereastra de editare. n list exist fiierul a1.bak. El a fost creat automat de ctre sistem atunci cnd ai fcut modificarea n acest fiier. Acest tip de fiier conine penultima versiune a fiierului. Selectai acest fiier i executai clic pe declanatorul Delete ca s l tergei. Executai clic pe declanatorul Tree. Se afieaz structura arborescent a directoarelor. n locul acestui declanator este afiat acum declanatorul Files. Nu mai sunt afiate declanatoarele Find, Sort, Edit i Attr. n locul lor sunt afiate declanatoarele Chdir (pentru schimbarea directorului curent) i Mkdir (pentru crearea unui director). Executai clic pe declanatorul Files pentru a afia lista cu fiiere i directoare. Selectai toate fiierele create n aceast sesiune de lucru i executai clic pe declanatorul Delete.
ncercai:
Adevrat/Fals: 1. Meniul Database conine opiuni pentru manipularea tabelelor din baza de date. 2. ntr-o comand putei preciza grupul de nregistrri care ncepe cu nregistrarea curent i se termin cu ultima nregistrare folosind cuvntul cheie Next. 3. n general, adverbele dintr-o comand pot fi scrise n orice ordine. 4. Verbul comenzii poate fi prescurtat la primele patru caractere. 5. Configurarea mediului de lucru Visual FoxPro se poate face prin ansamblul de comenzi Set. 6. Folosind comanda Display status afiai informaii despre starea monitorului. 7. Numrul de zecimale dintr-un numr l stabilii cu comanda Set Fixed. 8. Formularul prin intermediul cruia putei s modificai interactiv parametrii sistemului este de tip fereastr document. Completai: 1. Informaiile despre activarea/dezactivarea tastelor comutator se gsesc n ............. 2. Fereastra folosit pentru editarea comenzilor se numete .................................. 3. Fereastra generatorului de tabele ale bazei de date se numete ................................. 4. Cuvntul cheie prin care putei preciza ntr-o comand un grup de n nregistrri, ncepnd cu nregistrarea curent este ...................... 5. Pentru redirectarea ieirii unei comenzi la imprimant folosii clauza ..................... 6. Comanda prin care cerei s aflai informaii despre operaia de tergere a fiierelor Erase este ................................ 7. Formularul prin intermediul cruia putei s administrai fiierele este de tip ................ ............................. i se numete .................................... 8. Autodocumentarea declanat prin acionarea butonului Help dintr-o caset de dialog se numete help ............................... de context. Alegei rspunsul corect: 1. Meniul Table conine opiuni pentru: a) crearea i formatarea tabelelor
79
2. Fereastra n care putei vedea ce tabele conine baza de date deschis, n ce zone lucreaz i ce legturi exist ntre ele se numete: a) Database Designer b) Form Designer c) View 3. Clauza prin care putei preciza numai nregistrrile care ndeplinesc o anumit condiie logic, ncepnd cu prima nregistrare din tabel este: a) While b) All Like c) For 4. Linia de comand trebuie scris cu: a) litere mari b) litere mici c) orice tip de liter c) spaiu c) Return
5. n adverbul de tip list, separarea elementelor se face prin: a) punct i virgul b) virgul 6. Lansai n execuie un program cu comanda: a) Modi Comm b) Do 7. Comanda Set clock status: a) afieaz starea ceasului b) afieaz ceasul n bara de stare c) este greit 8. Putei stabili interactiv parametrii sistemului prin intermediul: a) ferestrei document Trace b) casetei de dialog Option c) ferestrei document Project Manager
Rspundei: 1. Ce nseamn compatibil cu standardul dBase? 2. Ce nseamn termenul Visual din numele aplicaiei Visual FoxPro? Ce reprezint aceast tehnic? 3. Ce tipuri de limbaje are implementat Visual FoxPro pe lng limbajul propriu? 4. Ce informaii afieaz bara de stare atunci cnd este selectat un tabel din baza de date? 5. Ce tipuri de adverbe pot fi folosite n linia de comand? 6. Cte forme are comanda Set? Pentru ce tip de parametri se poate folosi fiecare form? Ce formular putei folosi n locul comenzii Set pentru a configura interactiv mediul de lucru Visual FoxPro? 7. Pentru ce operaii cu fiiere v pune la dispoziie comenzi aplicaia Visual FoxPro? Ce formular putei folosi n locul comenzilor pentru operaii cu fiiere? Cum deschidei acest formular? 8. Cte tipuri de autodocumentare folosete Visual FoxPro? Cum putei avea acces la fiecare tip de help?
Adevrat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-F; 8-F. Completai: 1- bara de stare; 2-Command; 3-Database Designer; 4-Next; 5-To Print; 6-Help Erase; 7-caseta de dialog, Filer; 8-dependent. Alegei rspunsul corect: 1-b; 2-c; 3-c; 4-c; 5-b; 6-b; 7-b; 8-b.
spunsuri:
80 Informatic
Numeric
Alfanumeric
Logic
Timp
Special
Logical Character ntreg Monetar Real Currency Integer Float Double Memo Date DateTime
General
Pentru prelucrarea datelor elementare (variabile de memorie sau cmpuri) putei folosi, pe lng operatorii specifici tipului de dat, i funciile. Acestea pot fi grupate dup tipul datelor care sunt folosite ca argumente (parametri de intrare sau date de intrare prelucrate de funcie).
81
Sqrt Exp Log Log10 Sin Cos Tan Asin Acos Atan Rtod Dtor Pi
Sqrt(x) Exp(x) Log(x) Log10(x) Sin(x) Cos(x) Tan(x) Asin(x) Acos(x) Atan(x) Rtod(x) Dtor(x) Pi()
Funcii trigonometrice Furnizeaz sinusul argumentului exprimat n radiani. Furnizeaz cosinusul argumentului exprimat n radiani. Furnizeaz tangenta argumentului exprimat n radiani. Furnizeaz arcsinusul argumentului exprimat n radiani. Furnizeaz arccosinusul argumentului exprimat n radiani. Furnizeaz arctangenta argumentului exprimat n radiani. Realizeaz conversia din radiani n grade. Realizeaz conversia din grade n radiani. Furnizeaz valoarea constantei (3,141592).
Observaii:
1. Putei exprima relaia dintre un numr, modulul su i semnul su astfel: x = abs(x)*sign(x) 2. Pentru a afla partea fracionar a unui numr x putei folosi expresia: x - int(x) 3. Putei folosi funciile exp() i log() pentru a calcula valoarea expresiei ab, adic a^b. tii deja c din punct de vedere matematic: ab = eb*ln(a). Putei exprima operatorul matematic pentru ridicare la putere folosind aceste funcii: a^b = exp(b*log(a)) 4. Putei folosi funciile log() i log10() pentru a calcula valoarea oricrui logaritm. tii deja c din punct de vedere matematic: logb(a)= log(a)/log(b) = log10(a)/log10(b) 5. Argumentele funciilor trigonometrice sin(x), cos(x) i tan(x) sunt specificate n radiani i nu n grade. Rezultatul furnizat de funciile asin(x), acos(x) i atan(x) Dtor() este n radiani. Pentru a transforma gradele (Degree) n radiani (Radian), i invers, se pot folosi funciile Dtor() i Rtod().
radiani
grade
Rtod()
Prelucrai date numerice cu ajutorul funciilor 1. Evaluai expresii numerice folosind funcia sqrt():
82 Informatic
a + 1- a 1 a + 1+ a 1 pentru a=4. Scriei comenzile:
a=4 e=((sqrt(a+1)-sqrt(a-1))/ (sqrt(a+1)+sqrt(a-1)))*(2-a) ?e -0.25 (rezultatul afiat)
(2 a )
-1 ? round(x,2) -5.25
4.
83
8. Evaluai funcii trigonometrice folosind funciile: sin(), cos(), tan(), asin(), acos(), atan(), pi(), rtod(), dtor():
? sin(pi()/2)
Len Isalpha
Isupper
Islower
Isdigit
Funcii care furnizeaz informaii despre un ir de caractere Len(x) Furnizeaz un rezultat de tip numeric ce reprezint lungimea irului de caractere. Isalpha(x) Furnizeaz un rezultat de tip logic prin care se testeaz dac primul caracter din irul de caractere este o liter (rezultatul este .T. dac primul caracter este o liter). Isupper(x) Furnizeaz un rezultat de tip logic prin care se testeaz dac primul caracter din irul de caractere este o liter mare (rezultatul este .T. dac primul caracter este o liter mare). Islower(x) Furnizeaz un rezultat de tip logic prin care se testeaz dac primul caracter din irul de caractere este o liter mic (rezultatul este .T. dac primul caracter este o liter mic). Isdigit(x) Furnizeaz un rezultat de tip logic prin care se testeaz dac primul caracter din irul de caractere este o cifr (rezultatul este .T. dac primul caracter este o cifr).
84 Informatic
Funcia Replicate Sintaxa Ce reprezint?
Space
Funcii pentru generarea de iruri de caractere Replicate(x,y) Argumentul x este de tip ir de caractere, iar argumentul y este de tip numeric. Funcia furnizeaz un ir de caractere obinut prin repetarea de y ori a irului de caractere x. Space(x) Argumentul x este de tip numeric. Funcia furnizeaz un ir de caractere format din x spaii.
Funcii pentru eliminarea spaiilor sau pentru inserarea spaiilor sau a altor caractere ntr-un ir de caractere Alltrim Alltrim(x) Elimin spaiile din faa i din spatele (din stnga i din dreapta) irului de caractere x. Ltrim Ltrim(x) Elimin spaiile suplimentare din faa (din stnga - left) irului de caractere x. Rtrim, Rtrim(x) Elimin spaiile din spatele (din dreapta - right) irului de Trim Trim(x) caractere x. Padc Padc(x,n[,y]) Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x la stnga i la dreapta cu irul de caractere y astfel nct irul rezultat s aib lungimea n. Padl Padl(x,n[,y]) Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x n fa (la stnga - left) cu irul de caractere y astfel nct irul rezultat s aib lungimea n. Padr Padr(x,yn[,y]) Argumentele sunt x,y de tip ir de caractere i n de tip numeric. Funcia completeaz irul de caractere x la sfrit (la dreapta - right) cu irul de caractere y astfel nct irul rezultat s aib lungimea n. Lower Upper Proper Funcii pentru transformarea unui ir de caractere Lower(x) Furnizeaz un ir de caractere n care literele din irul de carractere x sunt transformate n litere mici. Upper(x) Furnizeaz un ir de caractere n care literele din irul de caractere x sunt transformate n litere mari. Proper(x) Furnizeaz un ir de caractere n care literele din irul de caractere x sunt transformate astfel: prima liter este mare, iar celelalte sunt mici. Chrtran(x,y,z) Argumentele x, y, z sunt de tip ir de caractere. Furnizeaz un ir de caractere obinut prin transformarea irului de caractere x astfel: toate apariiile primului caracter din irul de caractere y sunt nlocuite cu primul caracter din irul z, toate apariiile celui de-al doilea caracter din irul y sunt nlocuite cu al doilea caracter din irul z etc. Dac expresia y are mai multe caractere dect expresia z, atunci caracterele care sunt n plus vor fi transformate n caracterul NULL. Dac expresia z are mai multe caractere dect expresia y, atunci caracterele care sunt n plus vor fi ignorate.
Chrtran
85
Stuff
Ce reprezint? Argumentele x, y, z sunt de tip ir de caractere, iar argumentele n i m sunt de tip numeric. Furnizeaz un ir de caractere prin nlocuirea n irul de caractere x a irului de caractere y cu irul de caractere z. nlocuirea ncepe cu apariia n a irului y i se vor nlocui numai m apariii. Dac nu se precizeaz irul z, el va fi considerat irul vid, iar efectul va fi tergerea a m apariii ale irului y ncepnd cu apariia n. Dac nu se precizeaz argumentul n, nlocuirea ncepe cu prima apariie, iar dac nu se precizeaz argumentul m, se vor nlocui toate apariiile. Stuff(x,n,m,y) Argumentele x i y sunt de tip ir de caractere, iar argumentele n i m sunt de tip numeric. Furnizeaz un ir de caractere obinut prin nlocuirea n irul de caractere x a unui subir, care ncepe din poziia n i are lungimea m, cu irul de caractere y.
Left
Right
Substr
At
Rat
Atc
Atline
Funcii pentru operaii cu subiruri de caractere Left(x,n) Argumentul x este de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un ir de caractere obinut prin extragerea a n caractere de la stnga irului x. Right(x,n) Argumentul x este de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un ir de caractere obinut prin extragerea a n caractere de la dreapta irului x. Substr(x,m,n) Argumentul x este de tip ir de caractere, iar argumentele n i m sunt de tip numeric. Furnizeaz un ir de caractere obinut prin extragerea unui subir de lungime n din irul x, ncepnd cu poziia m. At(x,y[,n]) Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la stnga la dreapta, innd cont de diferena dintre literele mari i mici. Dac se precizeaz argumentul n, se caut apariia n. Rat(x,y[,n]) Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la dreapta la stnga, innd cont de diferena dintre literele mari i mici. Dac se precizeaz argumentul n, se caut apariia n. Atc(x,y[,n]) Argumentele x iy sunt de tip ir de caractere, iar argumentul n este de tip numeric. Furnizeaz un rezultat numeric care reprezint poziia n irul y a subirului x. Cutarea se face de la stnga la dreapta, fr s in cont de diferena dintre literele mari i mici. Dac se precizeaz argumentul n, se caut apariia n. Atline(x,y) Argumentele x iy sunt de tip ir de caractere. Furnizeaz un rezultat numeric care reprezint linia de text din irul y n care apare prima dat subirul x. Cutarea se face innd
86 Informatic
Funcia Sintaxa Ce reprezint? cont de diferena dintre literele mari i mici i de la stnga la dreapta. Argumentele x i y sunt de tip ir de caractere. Furnizeaz un rezultat numeric care reprezint linia de text din irul y n care apare prima dat subirul x. Cutarea se face innd cont de diferena dintre literele mari i mici i de la dreapta la stnga. Argumentele x iy sunt de tip ir de caractere. Furnizeaz un rezultat numeric care reprezint linia de text din irul y n care apare prima dat subirul x. Cutarea se face innd cont de diferena dintre literele mari i mici i de la stnga la dreapta. Argumentele x iy sunt de tip ir de caractere. Furnizeaz un rezultat numeric care reprezint numrul de apariii al subirului x n irul y.
Ratline
Ratline(x,y)
Atcline
Atcline(x,y)
Occurs
Occurs(x,y)
Asc() 1. Putei folosi urmtoarele funcii pencod ASCII caracter tru conversia numr caracter: 2. Pentru irul vid funcia Len() furniChr() zeaz valoarea 0. 3. Funciile Replicate( ,n) i Space(n) furnizeaz acelai rezultat. 4. Funciile Alltrim(), Ltrim(), Trim(), Rtrim(), Padc(), Padl() i Padr() pot fi sintetizate n urmtoarele diagrame: a. Funciile pot fi folosite pentru dou tipuri de operaii: 9 eliminarea spaiilor: Alltrim(), Ltrim(), Trim(), Rtrim() 9 inserarea spaiilor sau a altor caractere: Padc(), Padl(), Padr() Padc(), Padl(), Padr()
Observaii:
ir cu spaii
ir fr spaii
b. Funciile acioneaz n diferite zone ale irului de caractere: 9 la stnga irului: Ltrim(),Padl() 9 la dreapta irului: Trim(), Rtrim(), Padr() 9 la ambele capete ale irului: Alltrim(), Padc()
Ltrim(),Padl() Trim(), Rtrim(),Padr()
Alltrim(), Padc()
5. Transformarea unui ir de caractere se poate face prin dou tipuri de operaii. a. transformarea din litere mari n litere mici i invers: Lower(), Upper(), Proper() b. nlocuirea unor caractere cu alte caractere: Chrtran(), Strtran(), Stuff()
87
x - irul n care se nlocuiete n = 2; nlocuirea se face ncepnd cu a doua apariie m = 3; numrul de apariii care se nlocuiesc
Folosind funcia Stuff() putei realiza urmtoarele operaii: 9 inserarea unui ir de caractere, dac m=0; 9 tergerea unui ir de caractere, dac y='' (irul vid). 6. Operaiile cu subiruri de caractere se fac prin trei tipuri de operaii: a. extragerea unui subir de caractere dintr-un ir se poate face din diferite poziii ale irului cu funciile : Left(), Right(), Substrr()
n irul x n n
Left(x,n)
m Substr(x,m,n) Right(x,n)
ntre aceste funcii exist urmtoarele relaii: 9 Left(x,n) = Substr(x,1,n); 9 Right(x,n) = Substr(x,len(x)-n+1,n). b. cutarea unui subir de caractere ntr-un ir se poate face innd cont de mai multe criterii: 9 cutarea se face pe o singur linie de text: innd cont de diferena dintre literele mari i mici At(), Rat() sau fr s se in cont de diferena dintre literele mari i mici Atc() 9 cutarea se face pe mai multe linii de text: innd cont de diferena dintre literele mari i mici Atline(), Ratline() sau
88 Informatic
fr s se in cont de diferena dintre literele mari i mici Atcline() cutarea se face n urmtoarele sensuri: de la stnga la dreapta At (), Atc(), Atline(), Atcline() sau de la dreapta la stnga Rat (), Ratline()
Rat(), Ratline()
Prelucrai iruri de caractere cu ajutorul funciilor Vei folosi mai multe funcii pentru iruri de caractere i vei observa rezultatul furnizat de aceste funcii: 1. Folosii funciile de conversie: asc(), chr():
? asc ('123') 49 codul ASCII al caracterului 1 ? asc ('abc') 97 codul ASCII al caracterului a ? asc('abc')>asc('123') .T. deoarece 97>49 ? asc ('A') 65 codul ASCII al caracterului A ? chr (65) A ? chr (7) bip semnal sonor ? asc ('1') = asc('123') .T. ? 'z'==chr (asc('z')) .T. ? 122=asc (chr(122)) .T. ? chr(asc('Z')+32) z 0 irul vid ? len ('Ana '+'Maria') 10 ? isalpha (x) .T. y='123' z=123 ? isalpha (y) .F. ? isdigit (y) .T. ? isalpha (z) mesaj de eroare ? isupper (x) .T. ? islower (x) .F.
2. Obinei informaii despre un ir de caractere folosind funciile len(), isalpha(), isdigit(), isupper(), islower():
x='Albastru' ? len (x) 8 ? len ('')
89
5. Transformai un ir de caractere folosind funciile: lower(), upper(), proper(), chrtran(), strtran(), stuff():
x= 'abc' y='ABC' ? upper (x) ABC ? lower (y) abc ? lower(y) = x .T. ? upper(x) = y .T.
? proper(x) Abc ? proper(y) Abc ? proper(y) = proper(upper(x)) .T. ? proper(lower(y)) = proper(x) .T. ? proper('AlFaBeT') Alfabet ? upper(x) = lower(y) .F. ? upper(y) = lower(x) .F. ? chrtran ('abcdef','bdf','111') a1c1e1 ? chrtran ('abcdef','bdf','xyz') axcyez ? chrtran ('abcdef','bdf','12') a1c2e ? len (chrtran('abcdef','bdf','12')) 5 ? chrtran ('abcdef','bdf','xyzu') axcyez ? chrtran ('mosor','ms','tp') topor ? chrtran ('cotor','cor','nal') natal a='Am cumparat bilet la "Ala Bala Portocala"' b='la' c='na' d='vala' e=strtran(a,b,c,2) ?e Am cumparat bilet la "Ana Bana Portocana" e=strtran(a,b,d,2,1) ?e Am cumparat bilet la "Avala Bala Portocala" ?stuff('parcare',4,1,'taj') partajare ?stuff('caviar',3,3,'') car s-a ters subirul 'via' ?stuff('car',3,0,'via') caviar s-a inserat subirul 'via' a=stuff('cod',4,0,'are') ?a codare a=stuff(a,1,0,'dec') ?a
90 Informatic
decodare ? at ('nr', a) 16 ? at ('Nr', a) 0 ? atc ('Nr', a) 16 ? rat('nr', a) 16 a='Ala Bala Portocala' ? at ('la',a,1) 2 ? at ('la',a,2) 7 ? at ('la',a,3) 17 ? rat ('la',a,3) 2 ? occurs('co','cocor') 2 ? occurs('la',a) 3
6. Executai operaii cu subiruri de caractere folosind funciile: left(), right(), substr(), at(), rat(), atc():
x= 'Marea Neagra' y='untdelemn' ? left (x,5) Marea ? right (x,6) Neagra ? left(y,3) unt ? substr(y,4,2) de ? right(y,4) lemn ? left(y,3)=substr(y,1,3) .T. ? substr(y,len(y)-4+1,4) = right(y,4) .T. a='str. Iezerului nr. 32'
Formatul determin modul n care este interpretat o dat de tip dat calendaristic atunci cnd este scris de la tastatur sau atunci cnd este citit din memorie i afiat pe ecran. Formatul implicit este cel american. Pentru schimbarea formatului se poate folosi comanda: Set date to <format> Pentru an se pot specifica dou sau patru cifre. Formatul implicit este cu dou cifre. Acest format nu deranjeaz, n special n cazul anilor mai mici de 2000. Se poate cere i o afiare a anului cu patru cifre folosind comanda: Set century on Se poate modifica separatorul folosit n cadrul reprezentrii datei folosind comanda: Set mark to <delimitator> Modul n care este afiat data pentru gestionarea timpului poate fi controlat cu urmtoarele comenzi:
91
Set hours to 12|24 care permite stabilirea unui format cu ziua format din 24 de ore sau a unui format cu ziua mprit n dou perioade de 12 ore (am i pm) i : Set seconds on|off care permite afiarea timpului cu secunde (on) sau fr secunde (off). Funcia Date DateTime Time Sintaxa Date() DateTime() Time() Ce reprezint? Funcii pentru aflarea timpului Furnizeaz data curent preluat din sistem. Rezultatul este de tip dat calendaristic. Furnizeaz data curent i momentul de timp preluate din sistem. Rezultatul este de tip ir de caractere. Furnizeaz numai momentul de timp preluat din sistem. Rezultatul este de tip ir de caractere.
Day Dow Cdow Week Month Cmonth Year Hours Minute Sec Seconds
Day(x) Dow(x) Cdow(x) Week(x) Month(x) Cmonth(x) Year(x) Hours(y) Minute(y) Sec(y) Seconds()
Furnizeaz numrul zilei din lun. Rezultatul este de tip N. Furnizeaz numrul zilei din sptmn. Rezultatul este de tip N. Furnizeaz numele zilei din sptmn. Rezultatul este de tip C. Furnizeaz numrul sptmnii din an. Rezultatul este de tip N. Furnizeaz numrul lunii din an. Rezultatul este de tip N. Furnizeaz numele lunii. Rezultatul este de tip C. Furnizeaz numrul anului. Rezultatul este de tip N (cu patru cifre). Furnizeaz numrul orei. Rezultatul este de tip N. Furnizeaz numrul minutelor. Rezultatul este de tip N. Furnizeaz numrul secundelor. Rezultatul este de tip N. Furnizeaz numrul secundelor scurse de la miezul nopii. Rezultatul este de tip N (real, n care partea ntreag reprezint secundele, iar partea fracionar milisecundele). Funcii pentru modificarea datei Argumentul x este de tip dat calendaristic, iar argumentul n de tip numeric ntreg. Funcia furnizeaz un rezultat de tip dat calendaristic a crei lun este incrementat cu n, dac n este pozitiv i decrementat cu n, dac n este negativ.
Gomonth
Gomonth(x,n)
Prelucrai date folosite pentru gestionarea timpului: 1. Extragei informaii din timpul sistemului folosind funciile: date(), time(), timedate():
? date() 03/02/01 set date to british ? date()
92 Informatic
02/03/01 set century on ? date() 02/03/2001 set century off ? time() 16:52:50 ? datetime() 02/03/01 04:53:00 PM set hours to 24 ? datetime() 02/03/01 16:54:23
4.
Extragei informaii despre luna din dat folosind funciile: month(), cmonth():
? month (d) 5 ? cmonth (d) May ? gomonth(d,3) 10/08/01
2. Extragei informaii despre ziua din dat folosind funciile: day(), dow(), cdow():
d={10/05/01} ? day(d) 10 ? dow(d) 5 ? cdow(d) Thursday
6. Extragei informaii despre or, minute i secunde din dat folosind funciile: hours(), minute(), sec(), seconds():
d=datetime() ? hours(d) 17 ? minute(d) 14 ? sec(d) 12 ? seconds() 62135.20
Funcia Str
Sintaxa Str(m,n,p)
Ce reprezint? Argumentele m,n i p sunt de tip numeric. Funcia convertete numrul m ntr-un ir de caractere de lungime n care conine p poziii pentru zecimale (cifre situate dup punctul zecimal). Dac numrul conine mai multe poziii dect argumentul n, rezultatul va
93
Val
Val(x)
Ce reprezint? fi un ir de asteriscuri. Dac numrul conine mai puine poziii dect argumentul n, irul de caractere va fi completat cu spaii pn la obinerea lungimii n. Dac numrul p este mai mic dect numrul de poziii zecimale, partea zecimal va fi trunchiat. Argumentul x este de tip ir de caractere. El trebuie s conin numai caracterele: cifre, punctul zecimal sau semnul minus, altfel conversia se va face eronat. Funcia convertete irul de caractere x ntr-un numr.
Dtoc(), Dtos()
Funcia Dtoc
Sintaxa Dtoc(x)
Dtos
Dtos(x)
Ctod
Ctod(x)
Ce reprezint? Argumentul x este de tip dat calendaristic. Funcia furnizeaz un ir de 8 caractere care reprezint data. Are forma ll/zz/aa (dou caractere pentru numrul lunii, dou pentru numrul zilei i dou pentru numrul anului, separarea fcndu-se cu caracterul /). Argumentul x este de tip dat calendaristic. Funcia furnizeaz un ir de 8 caractere care reprezint data. Are forma aaaallzz (patru caractere pentru an, dou pentru numrul lunii i dou pentru numrul zilei). Argumentul x este de tip ir de caractere care formeaz o dat calendaristic. Funcia furnizeaz data calendaristic precizat prin irul de caractere.
Ce reprezint? Argumentul x este de tip dat pentru gestionarea timpului. Funcia convertete aceast dat ntr-un ir de caractere. Argumentul x este de tip ir de caractere. irul de caractere este de forma zz/ll/aa hh:mm:ss apm (cte dou caractere pentru fiecare element: zi, lun, an, or, minut, secund i am/pm). Funcia convertete irul de caractere ntr-o dat pentru gestionarea timpului.
94 Informatic
d. tip dat pentru timp tip dat calendaristic
Dtot() tip dat pentru timp Ttod() tip dat calendaristic
Ce reprezint? Argumentul x este de tip dat pentru gestionarea timpului. Funcia convertete aceast dat ntr-o dat calendaristic. Argumentul x este de tip dat calendaristic. Funcia convertete aceast dat ntr-o dat pentru gestionarea timpului, considernd ora 12:00:00 am.
Observaie:
Avantajul folosirii funciei Dtos() n locul funciei Dtoc() este acela c formatul furnizat de ea permite compararea corect a dou date calendaristice.
Facei conversii ntre tipuri de date: 1. Convertii numere iruri de caractere folosind funciile: val(), str():
a='10' b='15' ? a+b 1015 ? val(a)+val(b) 25.00 c='-10' ? val(c) -10 x=val ('10,25') ? type('x') N ?x 10.00 ? val ('10a10') 10.00 a=10 b=15 ? a+b 25 ? str(a)+str(b) 10 15 ? len(str(a)+str(b)) 20 ? str(a,2)+str(b,2) 1015 ? len(str(a,2)+str(b,2)) 4 a=12.5 ? str(a) 13 ? len(str(a)) 10 a=12345123451 ? str(a) .1234E+11 ? len(str(a)) 10
2. Convertii date calendaristice iruri de caractere folosind funciile: dtoc(), dtos(), ctod():
d1={08/03/01} d2={07/04/01} x=dtoc(d1) ?x 08/03/01 y=dtoc(d2)
95
4.
Iif()
Inlist()
Type()
Empty
96 Informatic
Funcia Evaluate Sintaxa Evaluate(x) Ce reprezint? Funcia evalueaz un argument x scris ca un ir de caractere. n funcie de coninutul irului de caractere, funcia va furniza un rezultat de tip ir de caractere, numeric, dat calendaristic.
Observaii:
1. O dat vid este o dat care conine elementul neutru (nul) pentru acel tip de dat. De aceea, coninutul unei date vide difer n funcie de tipul datei. Astfel: Tipul datei ir de caractere Formatul de reprezentare irul vid sau irul de caractere format numai din spaii (Chr(30)), caractere nul (Chr(0)), caractere Tab (Chr(9)) i caractere sfrit de linie (Chr(13), Chr(10)). 0 {} sau {//} .F.
2. Funcia Evaluate poate identifica tipul datelor din irul de caractere. De exemplu, evaluate(2*5+5) furnizeaz un rezultat de tip numeric egal cu 15, funcia evaluate(2>5) furnizeaz un rezultat de tip logic egal cu .F., funcia evaluate({05/03/01}+2) furnizeaz un rezultat de tip dat calendaristic egal cu data 05/05/01, iar funcia evaluate("abc"+"123") furnizeaz un rezultat de tip ir de caractere egal cu abc123. 3. Funcia Type poate identifica tipul expresiei scrise ca ir de caractere. De exemplu, type(5+5) furnizeaz tipul numeric (N), funcia type(2>5) furnizeaz tipul logic (L), funcia type({05/05/01}+10) furnizeaz tipul dat calendaristic (D), iar funcia type($20.00) furnizeaz tipul monetar (Y). 4. Funcia Iif(x,y,z) poate fi folosit pentru o structur alternativ care este descris n pseudocod astfel: if x then write y else write z endif. nu x z y da
Prelucrai date de tipuri diferite cu ajutorul funciilor generale 1. Atribuii o valoare ntreag unei variabile de memorie i verificai dac acel numr este divizibil prin 3:
a=1 b1='Numarul este divizibil prin 3' b2='Numarul nu este divizibil prin 3' ? iif(a % 3 = 0, b1, b2) Numarul nu este divizibil prin 3 a=9 ? iif(a % 3 = 0, b1, b2) Numarul este divizibil prin 3
97
3 . C o m e n z i p e nt r u v a r i a b i l e d e m e m o r i e
tii c o variabil de memorie reprezint o zon de memorie creia i se atribuie un nume i n care se poate memora valoarea unei date elementare de un anumit tip. Referirea la variabila de memorie se face prin numele su.
98 Informatic
Visual Fox Pro folosete 9 variabile de memorie utilizator, 9 variabile de memorie sistem. Variabilele de memorie sistem sunt variabile proprii aplicaiei, pe care aceasta le creeaz automat la lansarea n execuie i pe care le pstreaz n memorie att timp ct este n execuie. Aceste variabile nu sunt terse de comenzile obinuite de tergere a variabilelor de memorie. Identificatorul lor ncepe cu caracterul linie de subliniere _. Variabilele de sistem sunt folosite de ctre aplicaie pentru configurarea mediului Visual FoxPro (de exemplu, configurarea formatelor de ieire ctre ecran sau ctre imprimant). Variabilele de memorie utilizator sunt create de ctre utilizatorul aplicaiei. Crearea lor nseamn: atribuirea unui nume, stabilirea tipului datelor pentru a se rezerva corespunztor o zon de memorie i atribuirea unei valori iniiale. Asupra unei variabile de memorie se pot executa operaii de creare i consultare. Crearea unei variabile de memorie se face prin:
1. iniializare folosind
9 operaia de atribuire a unei valori (constant sau valoare obinut prin evaluarea unei expresii) 9 comanda Store care are sintaxa:
Store <expresie> to <list_nume_variabile>
99
Putei obine informaii complexe despre un grup de variabile de memorie (nume, dac 1 sunt publice - public sau particulare - private, tip, valoare) folosind comenzile List Memory i Display Memory: List | Display Memory [Like <ablon>] [ to print | to file <nume_fiier>] <ablon> reprezint descrierea grupului de variabile folosind conveniile clasice pentru caracterele de nlocuire ? i *. Lista de variabile de memorie poate fi afiat pe ecran sau la imprimant (to print) ori salvat ntr-un fiier (to file <nume_fiier>). Chiar dac sistemul v permite s definii 65.000 de variabile de memorie, este bine s tergei variabilele de memorie pe care nu le mai folosii. Operaia se numete eliberarea memoriei interne. Putei folosi urmtoarele comenzi:
O variabil public sau global poate fi folosit de orice subprogram al aplicaiei, iar o variabil particular sau local poate fi folosit numai n subprogramul n care a fost creat. Toate variabilele create n fereastra de comenzi sunt publice.
100 Informatic
9 Comanda Restore from readuce n memoria intern variabilele de memorie dintr-un fiier identificat prin nume; dac nu se precizeaz clauza additive, variabilele de memorie i tablourile de memorie care existau n memorie naintea restaurrii vor fi distruse: Restore from <nume_fiier> [Additive]
Prelucrai variabile de memorie 1. Creai variabile de memorie; nainte de a crea aceste variabile de memorie eliberai memoria de orice alte variabile de memorie create anterior:
clear memory store 0 to a1, a2, a3 store .T. to b1, b2 x1='alfa' x2='beta' a1=2 a2=7 store a1*a2 to a3 accept 'Scrieti numele: ' to nume Scrieti numele: Popescu input 'Scrieti varsta: ' to varsta Scrieti varsta: 18 wait 'Raspundeti cu o litera: ' to b3 Raspundeti cu o litera: x
101
4. Testai urmtoarea secven de instruciuni pentru mai multe valori ale variabilelor a, b i c, definite astfel: (a,b,c) {(2,3,4), (2,3,3), (3,3,3), (2,1,4)}.
input 'a= ' to a input 'b= ' to b input 'c= ' to c b1='Nu este triunghi' b2='Triunghi oarecare' b3='Triunghi echilateral' b4='Triunghi isoscel' c1=a+b>c and b+c>a and c+a>b c2= a=b and b=c c3= a=b or a=c or b=c ? iif(c1, iif(c2, b3, iif(c3 b4,b2)),b1)
Ce realizeaz aceast secven de comenzi? Scriei secvena de comenzi ntr-un fiier de tip program executabil cu numele alfa. Folosii comanda: modify command alfa Executai programul pentru fiecare valoare a tripletului (a,b,c) din mulimea de definiie. Pentru executarea programului folosii comanda: do alfa 5. Testai urmtoarea secven de instruciuni pentru mai multe valori ale variabilelor a, b i c, definite astfel: (a,b,c) {(2,3,4), (5,3,4), (2,3,3), (2,1,4)}
input 'a= ' to a input 'b= ' to b input 'c= ' to c x=a^2 y=b^2 z=c^2 b1='nu este triunghi' b2='triunghi dreptunghic' b3='triunghi ascutitunghic' b4='triunghi optuzunghic' c1=a+b>c and b+c>a and c+a>b c2=x+y=z or y+z=x or z+x=y c3=x+y>z and y+z>x and z+x>y c4=x+y<z or y+z<x or z+x<y ? iif(c1, iif( c2,b2, iif(c3,b3, iif(c4,b4,''))),b1)
Ce realizeaz aceast secven de comenzi? Scriei secvena de comenzi ntr-un fiier de tip program executabil cu numele beta. Folosii comanda: modify command beta Executai programul pentru fiecare valoare a tripletului (a,b,c) din mulimea de definiie. Pentru executarea programului folosii comanda: do beta nlocuii ultima comand din program cu comanda: ? iif(c1, iif( c2,b2, iif(c3,b3,b4)),b1) Reluai execuia programului modificat pentru fiecare valoare a tripletului (a,b,c) din mulimea de definiie. Ce constatai?
102 Informatic
ncercai:
Artai corespondenele: Se evalueaz funcia: ?iif(inlist(n,1,2,3,4,5,6), iif(2**n=a,'1 octet', iif(2**n=b, ' 2 octeti', iif(2**n=c, '8 octeti', 'incorect'))), 'incorect') unde a=8, b=16, c=64. Legai prin linii fiecare element din coloana n de elementul corespunztor din coloana Afieaz: n: Afieaz: 1 2 3 4 5 6 7 8 Adevrat/Fals: 1. Funcia isdigit('123') furnizeaz rezultatul adevrat. 2. Pentru a afia irul de caractere 12345 din numrul ntreg 12345 folosii funcia str(12345,5,0). 3. Rezultatul funciei max(day(d)+2,month(d)+5) este 7 pentru valoarea {02/04/01} a variabilei de memorie d afiat n formatul american. 4. Funcia prin care convertii un caracter n codul su ASCII se numete val. 5. Eliminai spaiile din stnga unui ir de caractere cu funcia left(). 6. Funcia at() nlocuiete ntr-un ir de caractere un subir cu un alt subir. 7. Funcia floor() se folosete pentru aproximarea unui numr. 8. Comanda ?? se folosete pentru a afia la imprimant un ir de caractere. Completai: 1. 2. 3. 4. 5. 6. 7. 8. Funcia mod(10,5) furnizeaz rezultatul Funcia len(padc(5,'alfa')) afieaz valoarea ...... Funcia occurs('a','calamar') afieaz rezultatul ............... Funcia prin care convertii un numr ntr-un ir de caractere se numete ........ Pentru a extrage n caractere dintr-un ir de caractere folosii funcia .............. Funcia str() cu care putei s obinei irul de caractere 123 din numrul 123.45 este .... Pentru a obine valoarea numeric 23 din irul de caractere .1234 vei folosi funciile: ...... Pentru a obine valoarea 23 din numrul 1234 vei folosi funciile ............. a b c d 1 octet 2 octei 8 octei incorect
Alegei rspunsurile corecte: 1. Funcia ceiling(-3.5) afieaz: a) -3 b) -4 2. Funcia round(3.5) afieaz: a) 3 b) 4 c) 4 c) eroare
103
3. Funcia floor(3.5) afieaz: a) 3 b) 3.5 c) 4 4. Funcia int(-3.5) afieaz: a) -3 b) -4 c) 3 5. Secvena de comenzi set decimals to 3 i ?pi() afieaz: a) 3.1 b) 3.14 c) 3.142 6. Funcia inlist(1, 2, 3, 4) furnizeaz rezultatul: a) .T. b) .F. c) 10 7. Funcia between(1, 2, 3) furnizeaz rezultatul: a) .T. b) .F. c) 6 8. Funcia type('2B') furnizeaz rezultatul: a) N b) C c) U 9. Data d are valoarea {05/04/01} n formatul american. Rezultatul furnizat de funcia min(day(d)-2, month(d)-2,year(d)) are valoarea: a) 1 b) 2 c) 3 10. Funcia strtran('ala bala','a','o',2,1) furnizeaz rezultatul: a) olo bala b) alo bala c) alo bolo 11. Funcia str (12345,3, 2) furnizeaz rezultatul: a) 123.45 b) 12.345 c) eroare 12. Care dintre urmtoarele expresii logice va furniza rezultatul .T. dac i numai dac expresia w ncepe cu un caracter special: a) not (isalpha(w) and isdigit(w)) b) not (isalpha(w) or isdigit(w)) c) not isalpha(w) and not isdigit(w) d) not isalpha(w) or not isdigit(w) 13. Dac x='1234.56a', funcia val (left(x,6)) furnizeaz rezultatul: a) 1234.56 b) 1234.50 c) eroare 14. Dac x='10.5' i y=',25', pentru a obine valoarea numeric 10.25 folosii: a) val(left(x,2)+y) b) val(left(x,2))+val(y) c) val(x+y)-0.25 d) val(x+y) Rspundei: Cum putei afia o expresie la imprimant? De ce tip trebuie s fie expresia? Ci parametri are funcia round()? Ce se ntmpl dac lipsete un parametru? Ci parametri are funcia string()? Ce se ntmpl dac lipsete un parametru? Ce funcii putei folosi pentru a testa primul caracter dintr-un ir de caractere? Ce funcii putei folosi pentru a genera un ir de caractere? Ce funcii putei folosi pentru a elimina spaiile dintr-un ir de caractere? Ce criterii de comparare putei folosi pentru aceste funcii? 7. Ce funcii putei folosi pentru a insera un subir de caractere ntr-un ir de caractere? 8. Ce funcii putei folosi pentru a terge un subir de caractere ntr-un ir de caractere? 9. Ce funcii putei folosi pentru a descompune un cuvnt compus n cuvintele care l compun? 10. Cu ce comand putei stabili formatul unei date calendaristice? Cum se numete formatul zz/ll/aa? 1. 2. 3. 4. 5. 6.
104 Informatic
11. Ce funcie putei folosi pentru a testa dac valoarea unei date aparine unui interval? Dar pentru a testa dac aparine unei mulimi de valori? 12. Ce funcie putei folosi pentru a descrie o structur alternativ? 13. Scriei funciile prin care putei s realizai urmtoarele transformri de cuvinte: cor color covor cotor color cosor cosar covor cotor motor mosor calculator calator abator abatere 14. Scriei funciile prin care descompunei n cuvintele componente urmtoarele cuvinte compuse i expresii: via de vie, Spitalul de Urgen, Delta Dunrii i cocoul de munte. 15. Trebuie s tergei un grup de variabile de memorie. Ce operaie vei folosi dac putei s descriei grupul printr-un ablon? Ce operaie vei folosi dac nu putei s descriei grupul printr-un ablon?
Artai corespondenele: 1-d; 2-d; 3-a; 4-b; 5-d; 6-c; 7-d; 8-d. Adevrat/Fals: 1-A; 2-A; 3-A; 4-F; 5-F; 6-F; 7-A; 8-F. Completai: 1-0; 2-5; 3-3; 4-str(); 5-substr(); 6-str(123.45,3); 7-int(val(substr('.1234',3,2))); 8-int(val(substr(str(1234,4),2,2))) Alegei rspunsurile corecte: 1-a; 2-c; 3-a; 4-a; 5-c;6-b; 7-b; 8-c; 9-b; 10-b; 11-c;12-b,c; 13-b; 14-a,b,c.
spunsuri:
1. Creai variabilele de memorie a1 de tip numeric, a2 de tip ir de caractere, a3 de tip dat calendaristic i a4 de tip logic. Variabilele de memorie trebuie s fie vide. Verificai c ai definit corect variabilele de memorie afind tipul i dac sunt vide. 2. Vizualizai coninutul variabilelor de memorie create. 3. Aflai ce tip de rezultat furnizeaz funcia Seconds(). 4. Modificai coninutul variabilei de memorie astfel nct s-i pstreze tipul. n cele patru variabile de memorie vei pstra urmtoarele informaii: a1 - numrul de secunde scurse de la miezul nopii, a2 - un ir de caractere format din 10 grupuri de caractere *1!, a3 - data curent, a4 - rezultatul comparrii expresiilor e1 i e2: e1 = (72/5+5)*5 i e2 = (40-6+2*8)*2 Vizualizai coninutul variabilelor de memorie i verificai dac i-au pstrat tipul. Vizualizai variabila de memorie de tip dat calendaristic n formatul zz/ll/aa. 5. Afiai pe ecran o linie cu urmtorul coninut: zz/ll/aa ********** Buna ziua ********** hh:mm:ss Afiarea se va face printr-o singur comand, fr a folosi variabile de memorie. 6. Copiai coninutul variabilelor de memorie a1, a2, a3 i a4 n variabilele de memorie b1, b2, b3 i b4. 7. Afiai urmtoarele informaii:
105
9 partea ntreag din numrul memorat n variabila de memorie b1, 9 numrul memorat n variabila de memorie b1, rotunjit la partea ntreag, prin adugare, 9 numrul memorat n variabila de memorie b1, rotunjit la partea ntreag, prin pierdere, Extragei partea fracionar din numrul memorat n variabila de memorie b1. 8. Memorai n variabilele de memorie a1, a2, , a6 cuvintele din urmtorul text: Uf! Am terminat o saptamana obositoare Folosind macrosubstituia prin intermediul variabilei de memorie z, afiai textul pe ecran. Memorai textul n variabila de memorie w. 9. Afiai textul: Uf! Am terminat o saptamana obositoare!!! astfel nct la sfritul tipririi s se aud un semnal sonor. 10. Folosind textul din variabila de memorie w, scriei pe ecran urmtoarele texte: Uf! Am Terminat O Saptamana Obositoare!!! uf! am terminat o saptamana obositoare!!! UF! AM TERMINAT O SAPTAMANA OBOSITOARE!!! uf! Terminat OBOSITOARE 11. Verificai dac exist irul de caractere oa n variabila de memorie w. Dac exist, aflai poziia n care se gsete. Executai operaia n dou moduri. 12. Afiai n ce zi a sptmnii suntem. 13. Afiai cte zile mai sunt pn la sfritul anului. Afiai cte sptmni mai sunt pn la sfritul anului sub forma urmtorului mesaj: Mai sunt nn saptamani si m zile. Unde nn reprezint numrul de sptmni, iar m numrul de zile. ===== hh:mm:ss ===== 14. Afiai ora sub forma unui ir de caractere: Executai operaia n patru moduri diferite. 15. Construii variabila de memorie t care conine urmtorul ir de caractere: 5 spaii, ora i 5 spaii. Afiai coninutul irului i lungimea lui. 16. Eliminai spaiile din irul de caractere memorat n variabila t. Executai operaia n dou moduri diferite. Memorai irul de caractere fr spaii n variabila de memorie u. Comparai lungimile celor dou iruri de caractere. Afiai diferena dintre lungimile lor. 17. Transformai printr-o funcie pentru date de tip ir de caractere urmtoarele cuvinte: copac capac i capac copac. Executai operaia n dou moduri diferite. 18. Scriei un program care s rezolve urmtoarea problem: Pentru executarea unei piese sunt necesare x minute. Afiai timpul necesar confecionrii a n piese, exprimat n numr de zile, ore i minute. La fabricarea pieselor se lucreaz n ritm continuu (24 de ore pe zi). 19. Afiai lista cu variabilele de memorie pe care le-ai creat. n aceast list se gsesc i variabilele de memorie definite n programul de la punctul 18. De ce? 20. tergei variabilele de memorie a1, b2 i u. Verificai c operaia s-a executat corect. 21. tergei variabilele de memorie b1, b3 i b4. Verificai c operaia s-a executat corect. 22. tergei toate variabilele de memorie, mai puin variabila t. Verificai c operaia s-a executat corect. 23. Eliberai memoria intern.
106 Informatic
1) a1=0 | a2=space(0) | a3={ / / } | a4=.F. | ? empty(a1) | ? empty(a2) | ? empty(a3) | ? empty(a4) | ? type('a1'), a1 | ? type('a2'), a2 | ? type('a3'), a3 | ? type('a4'), a4 2) ? a1 | ? a2 | ? a3 | ? a4 3) ?type('seconds()') 4) a1=seconds() | a2=replicate('*1!',10) | a3=date() | a4=((75/5+5)*5=(40-6+2*8)*2) ? type('a1'), a1 | ? type('a2'), a2 | ? type('a3'), a3 | ? type('a4'), a4 | set date to british | ?a3 5) ?dtoc(Date())+' '+replicate('*',10)+' Buna ziua '+replicate('*',10)+' '+time() 6) b1=a1 | b2=a2 | b3=a3 | b4=a4 7) ?int(b1) | ?floor(b1) | ?ceiling(b1) | ?b1-int(b1) sau ?mod(b1,int(b1)) 8) b1=a1 | b2=a2 | b3=a3 | b4=a4 | z='a' | a1='Uf! ' | a2='Am ' | a3='terminat ' | a4='o ' | a5='saptamana ' | a6='obositoare' | ?&z.1+&z.2+&z.3+&z.4+&z.5+&z.6 | w=&z.1+&z.2+&z.3+&z.4+&z.5+&z.6 9) ?w+'!!!'+replicate(chr(7),5) 10) ?proper(w)+'!!!' | ?lower(w)+'!!!' | ?upper(w)+'!!!' | ?left(lower(w),4)+substr(proper(w),8,9)+right(upper(w),10) 11) ?at('oa',w) | ?rat('oa',w) 12) ?dow(date())| ?cdow(date()) 13) dif={31/12/01}-date() | ?dif | spt=int(dif/7) | ?spt | zile=mod(dif,7) | ?zile | ?str(spt,2)+' saptamani si '+str(zile,1)+' zile' | ?str(spt,2)+' saptamani si '+str(zile,1)+iif(zile=1,' zi',' zile') 14) ?padc(time(),18,'=') | ?padl(padr(time(),13,'='),18,'=') | ?replicate('=',5)+time()+replicate('=',5) | ?'====='+time()+'=====' 15) t=space(5)+time()+space(5) | ? t | ? len(t) 16) ?alltrim(t) sau ?ltrim(rtrim(t)) | u=alltrim(t) | ?len(u) | ?len(t) | ?len(u)=len(t) | ?len(t)>len(u) 17) ?chrtran('copac','o','a') sau ?strtran('copac','o','a') | ?strtran('capac','ap','op') sau ?stuff('capac',2,1,'o') 18) Creai fiierul cu programul folosind comanda modify command timp. Scriei n fereastra de editare urmtoarele comenzi: input 'timp executie piesa ' to x nr_ore=nr_tot_ore%24 input 'numar piese executate ' to n ? 'timpul necesar executarii pieselor este t=x*n de:' nr_min=t%60 ? nr_zile, 'zile', nr_ore, 'ore', nr_min, nr_tot_ore=int(t/60) 'minute' nr_zile=int(nr_tot_ore/24) Salvai comenzile scrise. Lansai n execuie programul cu comanda do timp. Introducei valori pentru x i n (de exemplu 50 de minute i 100 de piese). 19) display memory | nu se gsesc i variabilele de memorie create n program, deoarece la terminarea execuiei programului, zona de memorie alocat lui se elibereaz, inclusiv zona ocupat de variabilele de memorie create de el. Efectul este pierderea valorii acestor variabile de memorie. 20) release a1, b2, u | display memory 21) release all like b? | display memory 22) release all except t | display memory 23) clear memory | display memory
spunsuri:
107
Cutarea unei nregistrri dup valoarea unui cmp se face mult mai rapid atunci cnd nregistrrile sunt ordonate dup acel cmp, deoarece n cazul unei structuri ordonate se pot folosi diferii algoritmi de cutare. De exemplu, pentru a gsi nregistrarea care ndeplinete condiia a=34 (valoarea cmpului a este 34), n cazul unei parcurgeri secveniale se vor executa 8 operaii de verificare, cte una pentru fiecare nregistrare. n cazul ordonrii structurii se poate folosi, de exemplu, algoritmul de njumtire a intervalului. Cutarea se
108 Informatic
va face n fiierul index folosind acest algoritm. Se mparte fiierul n dou: n prima jumtate se vor gsi nregistrrile pentru care a[10,34], iar n a doua jumtate se vor gsi nregistrrile pentru care a[40,90]. Se verific i se vede c valoarea 34 a cmpului a aparine primului interval. Se mparte i acest interval n dou: n prima jumtate se vor gsi nregistrrile pentru care a[10,12], iar n a doua jumtate se vor gsi nregistrrile pentru care a[23,34]. Se verific i se vede c valoarea 34 a cmpului a aparine celui de-al doilea interval. Se mparte i acest interval n dou: n prima jumtate se va gsi o singur valoare (23), iar n a doua jumtate se va gsi o singur valoare (34), care este valoarea cutat. Pentru aceast valoare, n index exist numrul nregistrrii: 8. Se poziioneaz n tabel pointerul de nregistrare direct pe nregistrarea 8. n acest caz s-au executat numai trei operaii de verificare (de apartenen a valorii cmpului a la un interval). Start Indiferent de modul n care este exploatat tabelul, algoritmul de exploatare cuprinde urmtorii pai: deschiderea tabelului, prelucrarea i nchiderea. Open Tabelul este memorat ntr-un fiier de date care are acelai nume ca i tabelul i extensia .dbf. Pentru a se putea prelucra nregistrrile dintr-un Prelucrare tabel, trebuie deschis fiierul n care acesta este pstrat. Prin operaia de deschidere i se aloc o zon de memorie intern n care urmeaz s fie transferate de pe disc nregistrrile care vor fi prelucrate. Deschiderea Close fiierului se face fie folosind opiunea de meniu Open...File, fie prin intermediul comenzii: Stop use <nume_fiier> Dup ce ai prelucrat nregistrrile din tabel trebuie nchis fiierul. Prin operaia de nchidere se elibereaz zona de memorie intern alocat fiierului. nchiderea fiierului se face prin intermediul comenzii: use Mai putei s nchidei tabelul din fereastra View (pe care o deschidei cu opiunea View WindowWindow). Selectai numele tabelului i executai clic pe declanatorul Close. Operaiile puse la dispoziie de Visual FoxPro pentru administrarea datelor dintr-un tabel al bazei de date pot fi grupate astfel:
109
110 Informatic
unde <nume_tabel> este numele tabelului care se creeaz i a crui structur se definete prin precizarea pentru fiecare cmp a numelui su <nume_cmp>, a tipului <tip>, a dimensiunii <lime> i a numrului de poziii din partea fracionar <poz_zec> (numai pentru cmpurile reale numeric, float i double). 2. Prin preluarea structurii dintr-un alt tabel: 9 Prin preluarea structurii dintr-un tabel de structur. Tabelul de structur este un tabel n care se pstreaz informaii despre structura unui alt tabel (proprietile cmpurilor). El a fost creat cu comanda copy structure extended. Sintaxa comenzii este: create <nume_tabel1> from <nume_tabel2> unde <nume_tabel1> este numele tabelului a crui structur se creeaz prin preluarea structurii din tabelul de structur care are numele <nume_tabel2>. 9 Prin preluarea structurii dintr-un tabel deschis. Pot fi preluate toate cmpurile din structur sau numai o parte din ele. Sintaxa comenzii este: copy structure to <nume_tabel> [fields <list_nume_cmpuri>] unde <nume_tabel> este numele tabelului care se creeaz i a crui structur se preia din tabelul deschis n acel moment; se pot prelua toate cmpurile sau numai cmpurile precizate n lista clauzei fields.
111
adugate din aceste fiiere la noua structur de tabel. Putei s pstrai i vechea versiune, redenumind fiierele nume.bak cu nume_nou.dbf i nume.tbk cu nume_nou.fpt. Mai putei s deschidei caseta de dialog i din fereastra View. Selectai numele tabelului i executai clic pe declanatorul Properties.... n caseta de dialog Work Area Properties executai clic pe declanatorul Modify.... 3. Copierea structurii tabelului: Putei s copiai structura tabelului deschis: 9 ntr-un tabel de structur. Acest tabel are o structur predefinit. El conine 11 cmpuri, cte un cmp pentru fiecare proprietate a cmpului (de exemplu, field_name pentru numele cmpului, field_type pentru tipul cmpului, field_len pentru lungimea cmpului, field_dec pentru numrul de poziii ale prii fracionare, field_null pentru a stabili dac se accept valoarea null n cmp, field_defa pentru valoare implicit a cmpului etc.). n tabel exist cte o nregistrare pentru fiecare cmp (aadar, va avea attea nregistrri, cte cmpuri are tabelul pentru care pstreaz structura). Sintaxa comenzii este: copy to <nume_tabel> structure extended unde <nume_tabel> este numele tabelului n care se va pstra structura. 9 ntr-un tabel precizat prin <nume_tabel>. Pot fi copiate toate cmpurile din structur sau numai o parte din ele. Sintaxa comenzii este: copy structure to <nume_tabel> [fields <list_nume_cmpuri>] Observaie: Pentru a vedea ce conin tabelele n care au fost copiate structurile, trebuie s le deschidei. Observaie: Dac ntr-o comand nu se specific numele unui tabel, nseamn c ea se refer la tabelul deschis. De exemplu, comenzile list structure, modify structure etc.
112 Informatic
2. Prin intermediul funciilor se pot obine informaii despre cmpuri: 9 numele cmpului dintr-o poziie precizat se obine cu funcia field(<n>), unde <n> este numrul de ordine al cmpului; 9 numrul de cmpuri din tabel se obine cu funcia fcount(); 9 lungimea unui cmp din tabel se obine cu funcia fsize(<nume>) unde <nume> este numele cmpului; 9 dimensiunea nregistrrii din tabel se obine cu funcia recsize().
Obiectul: realizarea bazei de date a unei companii care ofer servicii de consultan.
Scopul bazei de date: gestionarea serviciilor de consultan asigurate clienilor de ctre angajaii companiei.
113
Cerine: 9 Fiecare angajat al companiei are o persoan din cadrul companiei care i monitorizeaz i i supervizeaz activitatea. 9 Atunci cnd un client solicit pentru prima dat serviciile acestei companii, i se repartizeaz un angajat care s se ocupe de el. De obicei angajatul se ntlnete cu clientul pn cnd i se rezolv problema. 9 n cadrul primei discuii, angajatul stabilete obiectivele consultanei, termenele i costul estimativ. Aceste date se pot modifica pe parcursul desfurrii consultanei. Toate aceste modificri trebuie pstrate n baza de date. 9 Pentru fiecare edin de consultan trebuie s se pstreze date despre modul n care serviciile prestate de angajat ndeplinesc obiectivele consultanei, n conformitate cu termenele stabilite. Pentru fiecare edin se vor nregistra urmtoarele date: data edinei, angajatul cu care s-a ntlnit clientul, durata edinei, suma facturat pentru edin, rezumatul modului n care a decurs ntlnirea. 9 Costul unui serviciu de consultan este n funcie de ore. Tariful orar depinde de angajatul care s-a ocupat de client: cu ct acesta are mai mult experien, cu att tariful este mai mare. Pentru fiecare edin de consultan se emite o not de plat. 9 Totalul sumelor facturate prin notele de plat trebuie s fie comparate cu valoarea estimat pentru costul consultanei. 9 Unii clieni sunt ntmpltori, alii devin permaneni, solicitnd frecvent diferite servicii de consultan. Compania poate derula la un moment dat dou sau mai multe contracte de consultan cu acelai client. Pentru fiecare contract se va ine o eviden separat a notelor de plat. 9 Pe lng notele de plat, baza de date trebuie s furnizeze un raport lunar al activitilor cu fiecare client. 9 Un angajat al companiei are mai muli clieni, iar un client poate lucra cu mai muli angajai ai companiei. Pentru a putea rspunde la toate aceste cerine, baza de date va fi format din urmtoa13 rele tabele : Tabelul Angajai care va trebui s conin urmtoarele date (sub form de cmpuri): 9 Identificatorul angajatului (id_ang, I). Este un numr care identific unic angajatul i este folosit pentru cheia primar. 9 Numele angajatului (nume, C, 20). Deoarece pot s apar cutri n tabel i dup numele angajatului, acest cmp va fi cheie de indexare mpreun cu cmpul prenume. 9 Preumele angajatului (pren, C, 20). 9 Tip angajat (tip_ang, C, 1). Acesta este un cod care folosete un singur caracter prin care se identific tipul angajatului: permanent cu norm ntreag (a), permanent cu jumtate de norm (b), temporar cu norm ntreag (c), temporar cu jumtate de norm (d), colaborator cu ora (e) sau cu angajamentul terminat (f).
13
n descrierea structurii de date a tabelelor se vor folosi pentru tipul datelor: I - integer, F - float, C - character, M - memo, D - date, T - DateTime, L - logic. n cazul n care lungimea cmpului nu este determinat de tipul datelor, se va preciza i lungimea cmpului. De exemplu, nume,C,20 nseamn cmpul nume este de tip Character i are lungimea 20.
114 Informatic
9 Identificatorul superiorului (id_sup, I). Este un numr care identific angajatul cruia i este subordonat. Trebuie s fie de acelai tip ca i cmpul identificatorul angajatului. deoarece superiorul este i el angajat al companiei. 9 Data naterii (data_n, D). Este data naterii angajatului. 9 Data angajrii (data_a, D). Este data angajrii. 9 Data ncetrii angajrii (data_i, D). Este data de la care angajatul nu mai face parte din firm (demisie, demitere, restrngere de activitate, pensionare etc.). El va fi pstrat n continuare n evidenele companiei. 9 Tariful orar (tarif, I). Este tariful perceput clientului pentru o or de consultan asigurat (prestat) de angajat. 9 Adresa angajatului (adresa, M). Deoarece adresa este un ir de caractere cu lungime care poate varia foarte mult de la un angajat la altul, pentru a nu se risipi spaiul de memorie se va folosi cmpul de tip Memo. 9 Localitatea (loc, C, 15). Deoarece compania are sucursale i birouri de reprezentan n mai multe localiti, i angajaii pot avea domiciliile n mai multe localiti. 9 Codul judeului (c_jud, C, 2). Pentru jude se nregistreaz numai codul. Separat, n tabelul Judee vor fi nregistrate i numele judeelor. 9 Codul potal (cp, C, 5). Este codul potal al adresei angajatului. 9 Telefonul fix (tel_f, C, 9). Este numrul telefonului fix al angajatului. 9 Telefonul mobil (tel_m, C, 9). Este numrul telefonului mobil al angajatului. 9 Observaii (obs, M). Conine informaii biografice ale angajatului sau referitoare la activitatea lui n cadrul companiei.
Tabelul Clieni care va trebui s conin urmtoarele date (sub form de cmpuri): 9 Identificatorul clientului (id_cl, I). Este un numr care identific unic clientul i este folosit pentru cheia primar. Este de acelai tip ca i cmpul id_ang din tabelul Angajai. 9 Numele clientului (nume, C, 20). Deoarece pot s apar cutri n tabel i dup numele clientului, acest cmp va fi cheie de indexare. Este de acelai tip ca i cmpul nume din tabelul Angajai. 9 Prenumele clientului (pren, C, 20). Este de acelai tip ca i cmpul pren din tabelul Angajai. 9 Tip client (Tip_cl, L). Cmpul va avea valoarea .T. n cazul unui client curent (are un contract de consultan n derulare). 9 Identificatorul angajatului (id_ang, I). Este un numr care identific angajatul atribuit clientului s se ocupe de el. Este de acelai tip ca i cmpul id_ang din tabelul Angajai. 9 Data intrrii (data_i, D). Este data de la care a devenit clientul companiei de consultan. 9 Adresa clientului (adresa, M). Este adresa clientului. Este de acelai tip ca i cmpul adresa din tabelul Angajai. 9 Localitatea clientului (loc, C, 15). Este localitatea de reziden a clientului. Este de acelai tip ca i cmpul loc din tabelul Angajai. 9 Codul judeului (c_jud, C, 2). Este codul judeului de reziden al clientului. Este de acelai tip ca i cmpul c_jud din tabelul Angajai. 9 Codul potal (cp, C, 5). Este codul potal al adresei clientului. Este de acelai tip ca i cmpul cp din tabelul Angajai. 9 Fax (fax, C, 9). Este numrul de fax al clientului. 9 Telefonul fix (tel_f, C, 9). Este numrul telefonului fix al clientului. Este de acelai tip ca i cmpul tel_f din tabelul Angajai. 9 Telefon mobil (tel_m, C, 9). Este numrul telefonului mobil al clientului. Este de acelai tip ca i cmpul tel_m din tabelul Angajai.
115
9 Observaii (obs, M). Conine scurte informaii despre client i relaiile sale cu compania de consultan.
Tabelul Judee care va trebui s conin urmtoarele date (sub form de cmpuri): 9 Codul judeului (c_jud, C, 2). Este folosit pentru cheia secundar. 9 Numele judeului (n_jud, C, 15). Un angajat poate s aib mai muli clieni, iar de un client se pot ocupa mai muli angajai. Aadar, ntre tabelele Angajai i Clieni, tipul de relaie este de mai-multe-lamai-multe. Din aceast cauz trebuie creat un tabel intermediar Contracte, care ine evidena contractelor de consultan: 9 Identificatorul contractului (id_cont, I). Este un numr unic folosit pentru identificarea contracului de consultan. 9 Identificatorul clientului (id_cl, I) care beneficiaz de contractul de consultan. 9 Tipul contractului (tip_c, C, 1). Este un cod atribuit contractului care definete categoria de consultan: instruire, proiectare etc. 9 Observaii (obs_c, C, 254). Conine o scurt descriere a contractului de consultan. 9 Data nceperii (data_i, D). Este data la care ncepe derularea contractului de consultan. 9 Terminat (term_c, L). Are valoarea .T. dac s-a ncheiat consultana. Deoarece estimrile se modific pe parcursul derulrii contractului (vor fi mai multe estimri pentru acelai contract) i deoarece se dorete pstrarea unui istoric al acestor estimri, ele vor fi nregistrate ntr-un tabel separat Estimri care are urmtoarea structur: 9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se face estimarea. El va fi o cheie secundar, propagat din tabelul Contracte. 9 Numrul estimrii (nr_est, I). Reprezint a cta estimare este pentru acelai contract. 9 Identificatorul angajatului (id_ang, I). Este identificatorul angajatului care a fcut estimarea. 9 Obiectivul estimrii (obiectiv, C, 254). Este descrierea obiectivelor pentru aceast estimare a derulrii contractului. Descrierea trebuie s se fac precis i concis. 9 Termene (term, I). Este numrul estimativ de edine n care se va derula contractul. 9 Cost estimat (cost_e, I). Este costul estimativ al contractului de consultan. 9 Data estimriii (data_e, D). Este data la care s-a fcut estimarea. 9 Data terminrii (data_t, D). Este data estimat pentru terminarea contractului de consultan. Dar fiecare contract de consultan se desfoar pe parcursul mai multor edine de consultan. Din aceast cauz trebuie creat un tabel intermediar edine care s in evidena acestora i care are urmtoarea structur: 9 Numrul edinei (nr_s, I). Este un numr unic atribuit edinei i este folosit ca o cheie primar a tabelului care ajut la identificarea unei nregistrri din tabel (a unei edine). 9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se desfoar edina de consultan. Va fi o cheie secundar propagat din tabelul Contracte. 9 Identificatorul angajatului (id_ang, I) care s-a ocupat de aceast edin de consultan. 9 Data edinei (data_s, D). 9 Durata edinei (timp_s, I). Este timpul n care s-a derulat edina. Se msoar n minute. 9 Costul edinei (cost_s, I). Se calculeaz ca produs ntre durat i tariful angajatului. 9 Rezumat (rez_s, C, 254). Este un rezumat scurt al edinei, care va fi tiprit pe notele de plat ale clientului. 9 Observaii (obs_s, M). Sunt observaii despre modul n care a decurs edina. Sunt folosite numai n interiorul companiei.
116 Informatic
Aadar, tabelul Contracte leag ntre ele toate edinele prestate pentru o consultan, iar tabelul edine leag ntre ei clientul i angajatul care au participat la acea edin. Pentru serviciile prestate, compania ncaseaz bani de la client. Clientul nu pltete o singur dat valoarea final a contractului de consultan. El va face mai multe pli pe parcursul derulrii contractului. Din aceast cauz, ncasarea nu va fi nregistrat n tabelul Contracte. Clientul nu pltete nici la fiecare edin. Din aceast cauz, ncasarea nu va fi nregistrat nici n tabelul edine. Clientul poate s aib cu compania mai multe contracte de consultan. Din aceast cauz, ncasarea nu va fi nregistrat nici n tabelul Clieni. Va trebui creat un tabel separat, tabelul ncasri, cu urmtoarea structur: 9 Numrul ncasrii (nr_i, I). Este un numr unic atribuit ncasrii. El este folosit ca o cheie primar a tabelului i ajut la identificarea unei nregistrri din tabel (a unei ncasri). 9 Identificatorul contractului (id_cont, I). Este identificatorul contractului pentru care se face ncasarea. El va fi o cheie secundar propagat din tabelul Contracte. 9 Data plii (data_p, D). 9 Modul plii (mod_p, C,50). Se folosete pentru a descrie modul n care s-a fcut plata: numerar (chitana ncasrii), ordin de plat (banc, numr), fil cec (banc, numr) etc. 9 Valoare (valoare, I). Este valoarea ncasrii i reprezint o parte din valoarea total a consultanei. 9 Observaii (obs_i, C, 254). Sunt detalii referitoare la obiectivul plilor. ntre aceste tabele s-au stabilit urmtoarele relaii: Tabelul 1 Judee Angajai Judee Clieni Contracte Contracte Contracte Tabelul 2 Angajai edine Clieni Contracte edine Estimri ncasri Tipul relaiei una-la-mai-multe una-la-mai-multe una-la-mai-multe una-la-mai-multe una-la-mai-multe una-la-mai-multe una-la-mai-multe Cmpul de legtur codul judeului codul angajatului codul judeului codul clientului numrul contractului numrul contractului numrul contractului
Angajai
Clieni
Judee Contracte
edine
Estimri
ncasri
117
Creai un tabel definind structura interactiv: Creai structura tabelului Angajai: Deschidei caseta New cu opiunea New...File. Activai butonul radio Table i apoi executai clic pe butonul New File. Se deschide caseta de dialog Create care conine aceleai controale ca i o caset de dialog de tip Save As. Alegei din lista ascuns Save As Type tipul de fiier Table/DBF. Scriei n caseta de text Enter table numele tabelului Angajai. Executai clic pe declanatorul Save. Se deschide fereastra generatorului de tabele Table Designer. Seciunea Table conine controalele prin care definii structura tabelului. Structura de cmpuri o definii n grila derulant care are cinci coloane. n coloana Name scriei numele cmpului n caseta de text (de exemplu id_ang). Numele trebuie s conin numai litere, cifre i linie de subliniere. Atunci cnd creai un tabel liber, numele nu trebuie s depeasc 10 caractere, iar cnd definii un tabel ntr-o baz de date, poate s aib pn la 128 de caractere. n coloana Type alegei din lista ascuns tipul cmpului (de exemplu Integer). Dimensiunea cmpului este prestabilit. Nu se pot accepta valori nule n acest cmp. Verificai s nu fie activat comutatorul din coloana NULL. Repetai aceste operaii pentru toate cmpurile din tabel.
Coloanele grilei reprezint proprieti ale cmpului pe care l definii.
Comutatoare: Insert - insereaz un cmp deasupra cmpului selectat; Delete - terge cmpul selectat;
Bara de stare afieaz informaii despre tabel: identificatorul tabelului, numrul de nregistrri - Records (are valoarea 0 pentru c nu s-au introdus date), numrul de cmpuri definite - Fields (s-au definit 16) i lungimea nregistrrii n octei - Length (reprezint suma lungimilor tuturor cmpurilor) .
Definii un index structural pentru acest tabel, cmpul de indexare fiind cmpurile nume i prenume (nregistrrile vor fi aranjate logic n ordinea alfabetic a numelui i
118 Informatic
prenumelui; adic, atunci cnd numele este acelai, vor fi aranjate n ordinea alfabetic a prenumelui). Executai clic pe seciunea Index. n grila derulant scriei n caseta Name numele etichetei index: Nume. n stnga acestei casete de text se gsete butonul cu sgeat. Sgeata indic ordinea de aranjare: cresctor sau descresctor . Verificai ca simbolul s corespund ordonrii cresctoare. Dac este necesar, schimbai ordinea executnd clic pe buton. Putei alege din lista ascuns Type tipul de index: Primary, Candidate, Unique sau Regular (cheia obinuit). Alegei pentru acest index valoarea Regular.
Tipul de index ales Scriei expresia cheii de este Regular. indexare: nume+prenume. Butonul Move care v permite s mutai un rnd care definete un index.
Comutatoare: Insert - insereaz un index deasupra indexului selectat; Delete - terge indexul selectat;
n zona Expression trebuie s definii cheia de indexare. Ea poate s conin maxim 240 de caractere i poate fi format dintr-un singur cmp (expresie simpl) sau poate s fie obinut prin concatenarea mai multor cmpuri (expresie complex). Deoarece nu se pot concatena dect cmpuri de tip ir de caractere, trebuie s convertii celelalte cmpuri n tipul ir de caractere. Pentru a v uura munca de construire a unei expresii complexe de indexare, putei s facei apel la constructorul de expresii (Expression Builder). Aadar, fie scriei expresia, fie executai clic pe buton ca s se deschid caseta de dialog Expression Builder.
Expresia se construiete n caseta de text Expression. Folosind controalele putei alege numele unui cmp (n lista Fields executai dublu clic pe numele cmpului), numele unei variabile de memorie sistem sau utilizator (executai dublu clic pe numele variabilei din lista Variables), tabelul (l alegei din lista ascuns From Table). Din grupul de liste ascunse Function alegei funcia pe care o vei folosi n expresie. Ea poate fi o funcie matematic (Math), o funcie pentru iruri de caractere (String), o funcie logic sau un operator relaional (Logical) sau o funcie pentru date calendaristice (Date). n momentul n care alegei o funcie (executnd clic pe numele ei) vor fi afiate i parantezele (). Scriei parametrii ntre paranteze.
119
Dup ce ai definit toat structura tabelului, o salvai acionnd declanatorul Ok. Se deschide caseta de dialog prin care suntei ntrebai dac vrei s introducei date: Input data records now? Executai clic pe declanatorul Yes. Se deschide o fereastr de editare a tabelului, de tip browse. Scriei cinci nregistrri:
100, Popescu, Andrei, a, 100, 300000, 02/03/1960, 04/08/1995, / / , Str. Morilor nr. 50 sector 2, Bucuresti, B, 23451, 014567890, 092111111, 101, Andronescu, Ana, a, 100, 280000, 09/05/1958, 09/15/1996, / / , Str. Cuza Voda nr. 20 sector 1, Bucuresti, B, 23456, 012345678, 092122222, 102, Ionescu Maria, a, 100, 280000, 03/01/1961, 03/15/1998, / / , Str. Zorilor nr. 23 sector 4, Bucuresti, B, 34561, 012346789, 093189467,
200, Petrescu Radu, a, 200, 280000, 03/08/1964, 06/15/1998, / / , Soseaua Mangalia nr. 34, Constanta, Ct, 34512, 041123123, 092134567, 201, Popescu Mihai, a, 200, 250000, 01/01/1965, 09/15/1998, / / , Str. Lujerului nr. 56, Constanta, Ct, 34562, 041237893, 092341561,
Creai un tabel definind structura prin intermediul comenzii SQL: Creai tabelul Judee folosind comanda SQL: create table judete (c_jud c (2), n_jud C (15)) Creai un tabel prelund structura dintr-un alt tabel: Creai tabelul Clieni prin preluarea unor cmpuri din tabelul Angajai: Deschidei tabelul Angajai cu comanda: use angajati Afiai structura tabelului Angajai cu comanda: display structure Copiai din tabelul Angajai n tabelul Clieni numai cmpurile id_ang, nume, pren, id_sup, data_n, adresa, loc, c_jud, cp, tel_m, tel_f, obs cu comanda: copy structure to clienti fields id_ang, nume, pren, id_sup, data_n, adresa, loc, c_jud, cp, tel_m, tel_f, obs Deschidei tabelul Clieni cu comanda: use clienti Deschidei caseta de dialog Table Designer pentru a face modificri n structura tabelului. Folosii comanda: modify structure n caseta de dialog facei urmtoarele modificri. Schimbai numele cmpurilor: id_ang n id_cl, id_sup n id_ang i data_n n data_i. Inserai n poziia corespunztoare cmpurile: tip_cl i fax. Vizualizai structura tabelului Clieni cu comanda display structure. Obinei informaii despre cmpurile din tabel: Aflai cte cmpuri are nregistrarea folosind funcia (rspunsul este 14): ?fcount() Aflai ce dimensiune are cmpul loc folosind funcia (rspunsul este 15): ?fsize('loc')
120 Informatic
Aflai cum se numete cmpul din poziia 10 folosind funcia (rspunsul este cp): ?field(10) Aflai ce dimensiune are nregistrarea folosind funcia (rspunsul este 126): ?recsize() nchidei tabelul folosind comanda use.
121
continue
continue
Poziionai pointerul de nregistrare folosind numrul nregistrrii: Deschidei tabelul Angajai cu comanda: use angajati Executai mai multe operaii de poziionare folosind comenzile goto i skip. Observai informaia afiat n bara de stare dup fiecare operaie de poziionare.
?recno() 1 ?reccount() 5 ?bof() .F. skip-1 ?bof() .T.
122 Informatic
goto 3 ?recno() 3 goto bottom ?recno() 5 goto top ?recno() 1 skip 2*3 ?recno() 6 ?eof() .T. skip 2 End of file encountered ?recno() 6 skip -7 ?recno() 1 skip -10 Beginning of file encountered ?recno() 1
Executai operaii de poziionare folosind opiunea de meniu. Deschidei mai nti fereastra de editare a tabelului cu opiunea de meniu Browse "Angajati"View. Observai dup fiecare operaie de poziionare informaia afiat n bara de stare i nregistrarea pe care s-a poziionat pointerul de nregistrare n fereastra de editare:
Table Goto Record4 Next nregistrarea 2 (era urmtoarea nregistrare) Table Goto Record4 Bottom nregistrarea 5 (ultima nregistrare) Table Goto Record4 Record#... caseta de dialog Go to Record: scriei n caseta cu derulor Record valoarea 2 i executai clic pe declanatorul Go to nregistrarea 2.
nchidei fereastra de editare. Observai n fereastra Command comenzile corespunztoare aciunilor executate:
skip go bottom go 2
Folosii pentru poziionare comenzile locate i continue. Urmrii efectul lor observnd informaiile afiate n bara de stare.
locate for id_ang=100 (Se caut angajatul cu codul 100.) ? nume, pren, adresa, loc (Se afieaz numele, prenumele, adresa i localitatea angajatului.) Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureti continue (Se continu cutarea angajatului cu codul 100.) End of locate scope (Nu s-a mai gsit un angajat cu codul 100.) ? found() (Se testeaz dac s-a mai gsit o nregistrare.) .F (Nu s-a mai gsit un angajat cu codul 100.) locate for id_sup=100 (Se caut angajaii care au ca superior angajatul cu codul 100.) ? nume, pren, adresa, loc (Se afieaz numele, prenumele, adresa i localitatea angajatului.) Popescu Andrei Str. Morilor nr. 50 sector 2 Bucureti continue (Se continu cutarea angajailor care au superiorul cu codul 100.) ? found() (Se testeaz dac s-a mai gsit o nregistrare.) .T. (S-a mai gsit angajatul care are ca superior angajatul 100.) ? nume, pren, adresa, loc (Se afieaz numele, prenumele, adresa i localitatea angajatului.) Andronesu Ana Str. Cuza Vod nr. 20 sector 1 Bucureti continue (Se continu cutarea angajailor care au superiorul cu codul 100.) ? found() (Se testeaz dac s-a mai gsit o nregistrare.) .T. (S-a mai gsit angajatul care are ca superior angajatul 100.) ? nume, pren, adresa, loc (Se afieaz numele, prenumele, adresa i localitatea angajatului.) Ionescu Maria Str. Zorilor nr. 23 sector 4 Bucureti continue (Se continu cutarea angajailor care au superiorul cu codul 100.) End of locate scope (Nu s-au mai gsit angajai subordonai angajatului 100.) ? found() (Se testeaz dac s-a mai gsit o nregistrare.) .F. (Nu s-au mai gsit angajai subordonai angajatului cu codul 100.) ? eof() (Se testeaz dac s-a ajuns la sfritul fiierului.)
123
.T. (S-a ajuns la sfritul fiierului.) locate for day(data_n)=day(date()) and month(date_n) = month(date()) Se caut angajatul care are data de natere astzi. Dac s-a gsit, afiai-i numele i prenumele. locate for upper(nume)='ANDRONESCU' and upper(pren)='ANA' Se caut angajatul care are numele Andronescu i prenumele Ana. Deoarece nu tii cu ce tip de caractere au fost scrise numele i prenumele, le transformai n litere mari. ?tel_f, tel_m (se afieaz numerele de telefon) 012345678 921222222
nchidei fereastra de editare. Observai n fereastra Command comenzile corespunztoare aciunilor executate:
locate all locate for Angajati.pren= proper('Maria')
124 Informatic
9 dintr-un alt tabel - se realizeaz fie prin intermediul opiunii de meniu Append Records...Table, fie prin intermediul comenzii:
append from <nume_tabel> [fields <list_cmpuri>] [for <cond>] unde <nume_tabel> este numele tabelului din care se adaug nregistrri. Implicit se adaug toate nregistrrile i toate cmpurile din tabel, dar se poate explicita numai adugarea anumitor cmpuri (cmpurile precizate n lista de cmpuri a clauzei fields) i/sau numai a anumitor nregistrri (cele care ndeplinesc condiia precizat prin expresia <cond> a clauzei for). 2. Prin inserarea n interiorul tabelului: 9 Operaia se realizeaz prin comanda: insert [before] [blank] Implicit se insereaz o nregistrare vid dup nregistrarea curent i se deschide fereastra de editare pentru a completa valorile cmpurilor. Explicit, inserarea se poate face naintea nregistrrii curente, folosind clauza before, sau se poate insera numai o nregistrare vid folosind clauza blank.
125
efectul unui comutator. Dac nregistrarea nu este marcat, o marcheaz, i invers, dac este marcat, i anuleaz marcajul.
126 Informatic
:B = <val_1>,<val_2> - se verific dac dup editare cmpul aparine intervalului definit de valorile <val_1> (limita inferioar) i <val_2> (limita superioar). Cele dou valori trebuie s fie de acelai tip. n cazul n care valoarea cmpului nu se ncadreaz ntre cele dou limite, se afieaz un mesaj de eroare care poate fi personalizat cu opiunea :F. :H = <nume_cmp> - numele cmpului afiat n fereastra de editare este nlocuit cu '<nume_cmp>' de tip ir de caractere. :W = <cond> - se va intra n operaia de editare cu cmpul respectiv numai dac este ndeplinit condiia <cond>. font - permite stabilirea fontului caracterelor afiate n fereastra de editare prin nume font i dimensiune font (de exemplu, font 'arial',12). style - permite stabilirea stilului caracterelor afiate n fereastra de editare (de exemplu, 'b' - bold, 'u' - underline, 'i' - italic, 'o' - outline, 's' - shadow). freeze - permite selectarea pentru editare a unui singur cmp (precizat prin <nume_cmp>); restul cmpurilor sunt numai pentru informare. last | noinit - fereastra este deschis cu configuraia pe care a avut-o la ultima operaie de editare. noappend - nu permite utilizatorului s adauge noi nregistrri n tabel. nodelete - nu permite utilizatorului s tearg logic nregistrri din tabel. noedit | nomodify - nu permite utilizatorului s modifice nregistrrile din tabel (numai s adauge sau s tearg). normal - deschide fereastra de editare cu valori implicite pentru parametri (culoare, dimensiune, poziie, titlu etc.). title - modific titlul ferestrei de editare cu numele <nume_t> de tip ir de caractere. partition - precizeaz coloana <m> n care se mparte fereastra n dou partiii: una de tip browse, alta de tip edit; fiecare dintre ele poate fi vzut independent. lpartition - la deschiderea ferestrei de editare, cursorul va fi afiat n partiia din partea stng, n primul cmp, altfel este poziionat n partea dreapt. nolink - cele dou partiii nu sunt legate, altfel ele sunt legate, adic atunci cnd se deruleaz coninutul unei partiii se deruleaz i coninutul celeilalte partiii. ledit - partiia din partea stng este de tip invers fa de fereastra de editare (de tip browse pentru fereastra edit i de tip edit pentru fereastra browse). redit - partiia din partea dreapt este de tip invers fa de fereastra de editare (de tip browse pentru fereastra edit i de tip edit pentru fereastra browse). valid - valideaz valorile introduse n cmpuri (validarea se face la nivelul nregistrrii i nu la nivelul cmpului cum face opiunea V); dac este adevrat condiia <cond_3>, se trece la urmtoarea nregistrare, altfel se rmne la nregistrarea care se modific i se afieaz un mesaj de eroare. Mesajul de eroare poate fi personalizat cu <mesaj> (de tip ir de caractere) cu clauza error. Opiunea :f foreaz executarea operaiei de validare chiar dac nu s-au fcut modificri n nregistrare. when - are acelai efect ca i opiunea w, cu deosebirea c se aplic la nivelul ntregii nregistrri, i nu numai la nivelul unui cmp. width - limiteaz limea cmpurilor la <p> caractere; afecteaz numai formatul de afiare din fereastr, nu i structura tabelului.
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
9 9
127
Comanda browse mai poate avea clauzele: 9 lock <n> - precizeaz numrul de cmpuri <n> care pot fi vzute n partiia din stnga a ferestrei browse fr s se deruleze coninutul; partiia se va dimensiona automat pentru a realiza acest format de afiare. 9 nolgrid, norgrid - nltur grila din partiia stng, respectiv dreapt a ferestrei de editare browse.
Adugai nregistrri:
use angajati Se deschide tabelul Angajai care conine deja cinci nregistrri. append Se deschide fereastra de editare. Adugai cinci nregistrri. use judete Se deschide tabelul Judee care nu conine nregistrri. append Adugai numai nregistrarea pentru Bucureti. browse fields c_jud:v=isalpha(left(c_jud,1)) and isalpha(right(c_jud,1)) :e='cod gresit':h='cod judet', n_jud:h='nume_judet' Executai clic pe opiunea Append Mode View (putei s adugai nregistrri i n fereastra de editare de tip Browse). Adugai restul nregistrrilor n fereastra Browse. Verificai mesajele de eroare care apar atunci cnd nu scriei codul judeului format din dou litere. use angajati Se deschide tabelul Angajai care conine zece nregistrri. copy structure to ang Copiai structura tabelului ntr-un tabel nou ang. use ang Se deschide tabelul Ang care nu conine nregistrri. append blank (de 5 ori) Se adaug cinci nregistrri vide. browse n fereastra de editare sunt afiate cele 5 nregistrri vide.
128 Informatic
replace all tip_ang with 'a' Se completeaz pentru toi angajaii cmpul tip_ang cu 'a'. goto top Poziionai pointerul la nceputul tabelului, deoarece comanda replace all l-a pozionat la sfritul tabelului. replace next 3 id_sup with 300, loc with 'Buzau', c_jud with 'Bz',tel_f with '038' Primii trei angajai sunt din Buzu i sunt subordonai aceleiai persoane. Pentru numrul de telefon se scrie prefixul pentru Buzu. Pointerul de nregistrare va fi poziionat pe nregistrarea 3. skip Salt la urmtoarea nregistrare (nregistrarea 4) replace rest id_sup with 100, loc with 'Bucuresti', c_jud with 'B',tel_f with '01' Ultimii doi angajai sunt din Bucureti i sunt subordonai aceleiai persoane. Pentru numrul de telefon se scrie prefixul pentru Bucureti. Pointerul de nregistrare va fi poziionat pe nregistrarea 5. browse n fereastra de editare completai cu valori restul cmpurilor. use angajati Se deschide tabelul Angajai. append from ang for c_jud='B' Se adaug din tabelul Ang la sfritul tabelului, angajaii din Bucureti. append from ang for c_jud='Bz' Se adaug din tabelul Ang la sfritul tabelului, angajaii din Buzu. browse Deschidei fereastra de editare. Observai cum s-au executat operaiile. use clienti Se deschide tabelul Clieni. browse Nu conine nici o nregistrare. appen blank (de 6 ori) Adugai 6 nregistrri vide. browse Se completeaz pentru toate nregistrrile codul clientului i codul angajatului care se ocup de el. replace for id_ang>=100 and id_ang<200 loc with 'Bucuresti', c_jud with 'B', tel_f with '01', fax with '01' Se completeaz pentru clienii de care se ocup angajaii din Bucureti localitatea, codul judeului i prefixul pentru telefon i fax. replace for id_ang>=200 and id_ang<300 loc with 'Constanta', c_jud with 'Ct', tel_f with '041', fax with '041' Se completeaz pentru clienii de care se ocup angajaii din Constana localitatea, codul judeului i prefixul pentru telefon i fax. replace for id_ang>=300 and id_ang<400 loc with 'Buzau', c_jud with 'Bz', tel_f with '038', fax with '038' Se completeaz pentru clienii de care se ocup angajaii din Buzu localitatea, codul judeului i prefixul pentru telefon i fax. brow Completai restul cmpurilor.
129
browse Se afieaz modificrile fcute n fereastra de editare. replace id_sup with 100 for id_sup=1000 Se nlocuiete n tot tabelul codul superiorului 1000 cu 100. browse Se afieaz modificrile fcute n fereastra de editare. browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365) Se afieaz n fereastra browse numai cmpurile nume, pren i varsta (un cmp calculat). Pentru cmpul pren se afieaz eticheta prenume. replace for id_ang=104 tip_ang with 'c' Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n c. replace for id_ang=302 tip_ang with 'b' Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n b. browse Se afieaz modificrile fcute n fereastra de editare.
tergei nregistrri:
delete for lower(c_jud)='ct' browse nregistrrile din judeul Constana sunt marcate logic pentru tergere. set deleted on browse nregistrrile marcate logic pentru tergere nu mai sunt afiate. set deleted off browse nregistrrile marcate logic pentru tergere sunt afiate. Poziionai cursorul pe o nregistrare marcat logic pentru tergere. ?deleted() .T. Poziionai cursorul pe o nregistrare care nu este marcat pentru tergere. ?deleted() .F. recall for lower(c_jud)='ct' Refacei nregistrrile marcate logic pentru tergere. delete record 1 Marcai logic pentru tergere nregistrarea 1. set deleted on browse nregistrarea 1 nu este afiat n fereastra de editare. recall record 1 Refacei nregistrarea marcat logic pentru tergere. browse nregistrarea 1 este afiat n fereastra de editare. set deleted off
4 . 4 . C o n s u l t a r e a t a be l u l u i
Bazele de date se construiesc pentru a obine informaii ntr-un timp mai scurt. Informaiile obinute dintr-un tabel pot fi: 1. Detaliate - sub forma unor liste: Se pot folosi comenzile list sau display . Sintaxa lor este: list | display [ [fields] <list_cmpuri>] [<domeniu>] [for <cond_1>] [while <cond_2>] [to printer | to file <nume_fiier>] [noconsole] [off] Deosebirile dintre comanda list i display sunt:
129
browse Se afieaz modificrile fcute n fereastra de editare. replace id_sup with 100 for id_sup=1000 Se nlocuiete n tot tabelul codul superiorului 1000 cu 100. browse Se afieaz modificrile fcute n fereastra de editare. browse fields nume, pren:h='prenume', varsta= int((date()-data_n)/365) Se afieaz n fereastra browse numai cmpurile nume, pren i varsta (un cmp calculat). Pentru cmpul pren se afieaz eticheta prenume. replace for id_ang=104 tip_ang with 'c' Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n c. replace for id_ang=302 tip_ang with 'b' Se modific pentru angajatul cu identificatorul 104 tipul angajatului din a n b. browse Se afieaz modificrile fcute n fereastra de editare.
tergei nregistrri:
delete for lower(c_jud)='ct' browse nregistrrile din judeul Constana sunt marcate logic pentru tergere. set deleted on browse nregistrrile marcate logic pentru tergere nu mai sunt afiate. set deleted off browse nregistrrile marcate logic pentru tergere sunt afiate. Poziionai cursorul pe o nregistrare marcat logic pentru tergere. ?deleted() .T. Poziionai cursorul pe o nregistrare care nu este marcat pentru tergere. ?deleted() .F. recall for lower(c_jud)='ct' Refacei nregistrrile marcate logic pentru tergere. delete record 1 Marcai logic pentru tergere nregistrarea 1. set deleted on browse nregistrarea 1 nu este afiat n fereastra de editare. recall record 1 Refacei nregistrarea marcat logic pentru tergere. browse nregistrarea 1 este afiat n fereastra de editare. set deleted off
4 . 4 . C o n s u l t a r e a t a be l u l u i
Bazele de date se construiesc pentru a obine informaii ntr-un timp mai scurt. Informaiile obinute dintr-un tabel pot fi: 1. Detaliate - sub forma unor liste: Se pot folosi comenzile list sau display . Sintaxa lor este: list | display [ [fields] <list_cmpuri>] [<domeniu>] [for <cond_1>] [while <cond_2>] [to printer | to file <nume_fiier>] [noconsole] [off] Deosebirile dintre comanda list i display sunt:
130 Informatic
diferene domeniul implicit de aciune modul de afiare efectul valorii on a parameterului deleted list toate nregistrrile defilare nu afieaz nregistrrile terse logic display nregistrarea curent paginat (ecran plin) afieaz nregistrrile terse logic
Aadar, comanda list este echivalent cu comanda display rest, iar comanda display este echivalent cu comanda list next 1 sau list record recno(). Implicit sunt afiate pe ecran toate cmpurile, inclusiv numrul nregistrrii. Explicit se poate afia numai un grup de nregistrri precizat prin <domeniu> sau clauzele for sau while, numai anumite cmpuri precizate prin clauza fields, fr numrul nregistrrii folosind clauza off, iar ieirea poate fi redirectat la imprimant sau ntr-un fiier. 2. Sintetizate - sub forma unor valori: Se pot folosi comenzi sau funcii: Comanda count sum average calculate Funcia Efectul cnt() furnizeaz numrul de nregistrri sum(<expn>) furnizeaz suma unor cmpuri numerice avg(<expn>) furnizeaz media aritmetic a unor cmpuri numerice furnizeaz rezultatul evalurii funciilor cnt(), sum() i avg().
Sintaxa comenzilor este: sum | average | calculate [<list_expresii_numerice>] [<domeniu>] [for <cond_1>] [while <cond_2>][ to <nume_variabil>] count [<domeniu>] [for <cond_1>] [while <cond_2>] [ to <nume_variabil>] Domeniul implicit de aciune al acestor comenzi este: comanda se aplic asupra tuturor nregistrrilor i asupra tuturor cmpurilor numerice, iar rezultatul se afieaz pe ecran. Explicit, comenzile acioneaz numai asupra grupului de nregistrri precizat prin <domeniu> sau clauza for sau while i numai asupra cmpurilor numerice precizate n <list_expresii_numerice>, iar rezultatul poate fi memorat n variabile de memorie.
Aflai media aritmetic: Deschidei tabelul Angajai. Aflai media aritmetic a tarifului folosind comanda:
average tarif average tarif to v ?v calculate avg(tarif) average for tip_ang='a' Se calculeaz i se afieaz media aritmetic a tarifului pentru toi angajaii. Se calculeaz media aritmetic a tarifului pentru toi angajaii i se pstreaz n variabila de memorie v al crui coninut se afieaz ulterior. Calculai media aritmetic cu ajutorul funciei avg(). Se afieaz media aritmetic pentru toate cmpurile numerice (inclusiv pentru cele care conin codurile angajailor i ale superiorilor; din aceast cauz cererea de informaie nu s-a fcut corect)
131
Se afieaz media aritmetic a tarifului pentru angajaii permaneni cu norm ntreag (tip 'a'). Se afieaz media aritmetic a tarifului pentru angajaii care nu sunt permaneni cu norm ntreag (tip diferit de 'a').
Numrai nregistrri: Prin numrarea nregistrrilor care corespund unui criteriu, putei s aflai ci angajai ndeplinesc acel criteriu:
count for id_sup=100 count for id_sup=100 to v ?v count for lower(c_jud)='ct' count for tarif > 250000 Se numr i se afieaz ci angajai sunt subordonai angajatului cu identificatorul 100. Se numr ci angajai sunt subordonai angajatului cu identificatorul 100 i rezultatul se pstreaz n variabila de memorie v al crui coninut se afieaz ulterior. Se numr i se afieaz ci angajai sunt din Constana. Se numr i se afieaz ci angajai au tariful mai mare dect 250000 lei.
Afiai liste: n liste putei s afiai anumite cmpuri precizate prin lista de cmpuri i anumite nregistrri precizate prin domeniu sau clauzele for sau while:
list nume, pren, data_n for month(data_n)=03 Se afieaz numele, prenumele i data naterii pentru toi angajaii nscui n luna martie. list for id_sup=100 Se afieaz toate cmpurile pentru angajaii subordonai angajatului cu codul 100. list nume, pren, id_ang for id_sup=100 Se afieaz numele, prenumele i identificatorul pentru angajaii subordonai angajatului cu codul 100. list nume, pren, id_ang for id_sup=id_ang Se afieaz numele, prenumele i identificatorul pentru angajaii care nu sunt subordonai altor angajai. display nume, pren, id_ang for id_sup=id_ang list id_ang, nume, pren to file alfa Lista, care conine numai cmpurile cu identificatorul angajatului, numele i prenumele pentru toi angajaii, este copiat ntr-un fiier. dir alfa.* Se afieaz lista fiierelor care au numele alfa din directorul curent. Fiierul n care s-a transferat lista are extensia .txt. type alfa.txt Se afiez coninutul fiierului alfa.txt care conine lista.
Testai modul n care sunt tratate nregistrrile terse logic: Controlul se face prin parametrul deleted:
delete for lower(c_jud)='ct' set deleted on display list display all set deleted off display Se marcheaz pentru tergere logic nregistrrile angajailor din Constana. Se atribuie parametrului deleted valoarea on. Se afieaz nregistrarea curent cu comanda display. Se afieaz toate nregistrrile cu comanda list. Se afieaz toate nregistrrile cu comanda display all. Se atribuie parametrului deleted valoarea off. Se afieaz nregistrarea curent cu comanda display.
132 Informatic
list display all recall for lower(c_jud)='ct' Se afieaz toate nregistrile cu comanda list. Se afieaz toate nregistrile cu comanda display all. Se refac nregistrrile marcate logic pentru tergere.
Testai efectul filtrului definit pentru nregistrri: Putei s definii filtre pentru nregistrri cu ajutorul parametrului filter:
Se construiete un filtru. Scopul este de a lsa s treac numai angajaii din Bucureti. ?filter() Se cere afiarea filtrului. upper(c_jud)='B' Se afieaz condiia logic din filtru. list id_ang, nume, pren, loc Se afieaz att angajaii din Bucureti ct i cei din Buzu. browse Aadar, filtrul nu a fost construit corect. set filter to upper(c_jud)=='B' Se definete din nou filtrul, cu o alt condiie logic. ?filter() Se cere afiarea filtrului. upper(c_jud)=='B' Se afieaz condiia logic din filtru. list id_ang, nume, pren, loc Nu se afieaz nici o nregistrare. Din nou filtrul nu a fost definit browse corect. set filter to upper(c_jud)=='B ' Se definete din nou filtrul, cu o alt condiie logic. ?filter() Se cere afiarea filtrului. (c_jud)=='B ' Se afieaz condiia logic din filtru. list id_ang, nume, pren, loc Se afieaz numai angajaii din Bucureti. Condiia din filtru a browse fost definit corect. set filter to Se anuleaz filtrul. list id_ang, nume, pren, loc Se afieaz toate nregistrrile. browse set filter to upper(c_jud)='B'
Testai efectul filtrului definit pentru cmpuri: Putei s definii filtre pentru cmpuri cu ajutorul parametrului fields. Deschidei tabelul Clieni cu comanda use clienti.
set fields to id_cl, nume, pren, id_ang list Sunt afiate numai cmpurile identificator client, nume i prebrowse nume client, identificatorul angajatului care se ocup de client. display (numai cmpurile id_cl, nume, pren, id_ang) set fields to browse Nu este afiat nici un cmp. set fields to all browse Sunt afiate toate cmpurile.
4 . 5 . S o r t a r e a t a b e l u lu i
n urma sortrii unui tabel se creeaz un alt tabel n care nregistrrile sunt rearanjate conform criteriului de sortare folosit. Operaia acioneaz asupra tabelului deschis. Sintaxa comenzii este: sort to <nume_tabel> on <cmp_1> [/a | /d] [ /c] [, <cmp_1> [/a | /d] [ /c].... ] [ascending | descending] [<domeniu>] [for <cond_1>] [while <cond_2>] [fields <list_cmpuri>] Forma implicit a comenzii este: sort to <nume_tabel> on <cmp>
133
unde <nume_tabel> este numele tabelului obinut n urma sortrii tuturor nregistrrilor din tabelul deschis, iar <cmp> este numele cmpului folosit pentru cheia de sortare. Sortarea se face n ordinea cresctoare a cmpului cheie de sortare. Tabelul sortat va avea aceeai structur ca i tabelul surs. Explicit, se pot sorta din tabelul surs numai nregistrrile precizate prin <domeniu> sau clauzele for sau while i pot fi folosite mai multe chei de sortare <cmp_1>, <cmp_2> etc. Sortarea se poate face descresctor, dup toat lista de cmpuri cheie de sortare folosind clauza descending, sau poate fi controlat ordinea de sortare la nivelul fiecrui cmp, folosind adverbele /a - cresctor, /d - descresctor sau /c fr s se in cont de diferena dintre literele mari sau mici. Tabelul sortat poate s conin numai cmpurile precizate prin lista din clauza fields.
4 . 6 . I n d e x a r e a t a b e lu l u i
Pentru a putea exploata un tabel n acces direct, trebuie organizat astfel nct s avei acces direct la o nregistrare n funcie de valoarea unui cmp sau a unor cmpuri care vor forma cheia de acces. Soluia este de ordonare logic a nregistrrilor prin intermediul fiierelor index, iar cheia de acces se mai numete cheie de indexare. Visual FoxPro permite crearea a dou tipuri de fiiere de index pe lng indexul structural: 9 index simplu care conine o singur cheie de indexare ntr-un fiier (numele diferit de al tabelului i extensia idx), 9 index compus care conine mai multe chei de indexare (etichete index) ntr-un fiier (numele diferit de al tabelului i extensia cdx). Cheia de indexare poate fi format dintr-un singur cmp sau din mai multe cmpuri legate printr-o expresie de concatenare. Din aceast cauz, dac nu sunt de tip ir de caractere, cmpurile trebuie convertite ntr-un ir de caractere cu ajutorul funciilor de conversie. Am notat cp1 - cmpul 1, cp2 - cmpul 2 i e(cp1,cp2) - expresia format din cele dou cmpuri. tip cp1 C C C C N N N D D T tip cp2 C N D T N D T D T T cp1 convertit cp1 cp1 cp1 cp1 str(cp1) str(cp1) str(cp1) dtos(cp2) dtos(cp2) ttoc(cp2) cp2 convertit cp2 str(cp2) dtos(cp2) ttoc(cp2) str(cp2) dtos(cp2) ttoc(cp2) dtos(cp2) ttoc(cp2) ttoc(cp2) e(cp1,cp2) cp1+cp2 cp1+ str(cp2) cp1+ dtos(cp2) cp1+ ttoc(cp2) str(cp1)+ str(cp2) str(cp1)+ dtos(cp2) str(cp1)+ ttoc(cp2) dtos(cp1)+ dtos(cp2) dtos(cp1)+ ttoc(cp2) ttoc(cp1)+ ttoc(cp2)
134 Informatic
Forma implicit a comenzii este: 9 pentru indexul simplu: index on <expresie_index> to <nume_fiier.idx> 9 pentru indexul compus: index on <expresie_index> tag <nume_etichet> of <nume_fiier.cdx> Implicit, se ordoneaz cresctor toate nregistrrile din tabel, iar la crearea noului index toate celelalte fiiere index asociate tabelului sunt nchise (cu excepia indexului structural). Explicit, prin fiierul index putei avea acces numai la nregistrrile precizate cu clauza for, ordonarea logic poate fi cresctoare (ascending) sau descresctoare (descending) i se pot pstra deschise fiierele index deschise anterior (folosind clauza additive).
135
Funcia testeaz dac exist o nregistrare care are cheia de indexare egal cu expresia <expresie>. Dac o gsete, poziioneaz pointerul pe aceast nregistrare i furnizeaz valoarea .T., altfel poziioneaz pointerul la sfritul fiierului i furnizeaz valoarea .F..
Sortai tabele: Deschidei tabelul Angajai. Sortai acest tabel dup urmtoarele criterii:
use angajati Se deschide tabelul Angajai. browse Se afieaz coninutul tabelului n fereastra de editare. sort on nume, pren to a1 Se sorteaz tabelul dup cmpurile nume i pren. Rezultatul sortrii este n tabelul a1. sort on id_ang to a2 Se sorteaz tabelul dup cmpul id_ang. Rezultatul sortrii este n tabelul a2. sort on id_sup to a3 Se sorteaz tabelul dup cmpul id_sup. Rezultatul sortrii este n tabelul a3. sort on loc, id_ang to a4 Se sorteaz tabelul dup cmpurile loc i id_ang. Rezultatul sortrii este n tabelul a4. use a1 Se deschide tabelul a1. list nume, pren, id_ang, id_sup, loc browse nregistrrile sunt aranjate alfabetic dup valoarea cmpurilor nume i pren. Pentru acelai nume, sunt ordonate alfabetic dup prenume. use a2 Se deschide tabelul a2. list nume, pren, id_ang, id_sup, loc browse nregistrrile sunt aranjate cresctor dup valoarea cmpului id_ang. use a3 Se deschide tabelul a3. list nume, pren, id_ang, id_sup, loc browse nregistrrile sunt aranjate cresctor dup valoarea cmpului id_ang. use a4 Se deschide tabelul a4. list nume, pren, id_ang, id_sup, loc browse nregistrrile sunt aranjate alfabetic dup localitate. Pentru aceeai localitate, sunt aranjate n ordinea cresctoare a identificatorului de angajat.
Indexai tabele:
use judete S-a deschis tabelul Judee. modify structure n caseta de dialog Table Designer, deschidei seciunea Index. Observai c pentru acest tabel nu s-a definit la creare nici un index structural. index on c_jud tag cod of judete S-a definit un index structural. Conine o singur etichet cod, iar cheia de indexare a etichetei este cmpul c_jud (codul judeului). modify structure n caseta de dialog Table Designer, deschidei seciunea Index. Observai c indexul definit este de tip Regular. Schimbai tipul n Candidate. list nregistrrile sunt afiate n ordinea alfabetic a codului judeului. browse n fereastra de editare, nregistrrile sunt afiate n ordinea alfabetic a codului judeului. seek 'ct' Caut nregistrarea pentru care codul judeului este ct. ?iif (found(),n_jud, 'nu a gasit')
136 Informatic
Constanta S-a gsit nregistrarea. ?iif(seek('bz'),n_jud,'nu a gasit') Buzau S-a gsit nregistrarea. use angajati S-a deschis tabelul Angajai. browse nregistrrile sunt afiate n ordinea n care le-ai creat. modify structure n caseta de dialog Table Designer, deschidei seciunea Index. Observai c pentru acest tabel este definit deja de la creare indexul nume care are cheia determinat de expresia nume+pren. Definii un nou index cu numele cod, de tip Candidate i cu expresia de indexare id_ang. Mutai acest index pe prima poziie n list. Definii un nou index cu numele data, de tip Regular i cu expresia de indexare dtos(data_n)+ dtos(data_a). set order to tag cod Ordinea de indexare este dat de eticheta cod. browse Observai ordinea n care sunt afiate nregistrrile. list id_ang, nume, pren set order to tag nume Ordinea de indexare este dat de eticheta cod. list id_ang, nume, pren browse Observai ordinea n care sunt afiate nregistrrile.
#
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
ncercai:
Completai:
137
Alegei rspunsurile corecte: 1. Obinei dimensiunea unei nregistrri cu funcia: a) fsize() b) recsize() c) reccount() 2. Ordonarea fizic a nregistrrilor din tabel se face cu operaia de: a) indexare b) sortare c) concatenare 3. Vrei s indexai dup dou cmpuri numerice a i b. Expresia cheii de indexare este: a) a+b b) a,b c) str(a)+str(b) 4. Vrei s sortai dup dou cmpuri numerice a i b. Expresia cheii de sortare este: a) a+b b) a,b c) str(a)+str(b) 5. Putei vedea structura unui tabel cu comanda: a) list structure b) display structure c) modify structure 6. Cu comanda set filter to controlai accesul la: a) cmpuri b) nregistrri c) nregistrri i cmpuri 7. Comanda goto next poziioneaz pointerul de nregistrare pe: a) nregistrarea urmtoare b) nregistrarea curent c) eroare 8. Comanda delete: a) terge logic nregistrarea curent b) terge fizic nregistrarea curent c) terge logic toate nregistrrile d) terge fizic toate nregistrrile 9. Combinaia comanda seek + funcia found() poate fi nlocuit de: a) comanda locate + funcia found() b) funcia seek() c) comanda found 10. Comanda insert blank insereaz: a) spaii ntr-un cmp de tip ir de caractere b) o nregistrare vid dup nregistrarea curent c) o nregistrare vid naintea nregistrrii curente Rspundei: 1. Ce este un tabel liber? 2. Prin cte metode putei crea structura unui tabel? Ce comenzi folosii? 3. Ce este un tabel de structur? 4. Ce sunt indecii? De cte tipuri sunt? Unde sunt memorai n afara sesiunii de lucru? 5. Ce este un index structural compus? Ce avantaje are folosirea acestui index? 6. Ce tip de etichet de index trebuie s definii pentru cmpul care va asigura legtura cu un alt cmp al bazei de date? 7. Ce avantaj are folosirea a dou operaii de tergere: logic i fizic? 8. Cum controlai accesul la nivel de nregistrare i la nivel de cmp ntr-un tabel? 9. Ce informaii putei obine despre cmpurile din tabel cu ajutorul funciilor? 10. Ce informaii putei obine despre nregistrrile din tabel cu ajutorul funciilor? 11. Care este deosebirea dintre comenzile list i display? 12. Care este deosebirea dintre comenzile edit i browse? spunsuri: R Adevrat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F; 8-A; 9-A; 10-F.
Completai: 1-etichete index; 2-create table; 3-modify structure; 4-cmpuri; 5-fcount; 6-reccount; 7-locate; 8-fields; 9-avg(); 10-set order to Alegei rspunsurile corecte: 1-b; 2-b; 3-c; 4-b; 5-a,b,c; 6-b; 7-c; 8-a; 9-b; 10-b.
138 Informatic
139
141
se vor nchide toate bazele de date deschise, toate tabelele ncorporate n bazele de date sau libere i toate fiierele asociate exploatrii bazelor de date care erau deschise n acel moment.
142 Informatic
Operaiile care se pot executa n zonele de lucru sunt: 9 n zona activ se poate citi din tabel i se poate scrie n tabel. 9 n celelalte zone se poate numai citi din tabel. Identificarea tabelelor se face astfel: 9 n zona activ, numele tabelului se subnelege (este implicit n comenzi). 9 n celelalte zone, prin aliasul su sau prin numele zonei. Identificarea cmpurilor dintr-un tabel se face astfel: 9 n zona activ prin numele cmpului. 9 n celelalte zone prin identificatorul <alias>.<nume_cmp> sau <alias>-><nume_cmp>. Putei s obinei informaii despre zonele de lucru i tabelele deschise n aceste zone cu funciile: 9 select([1]) furnizeaz implicit numrul zonei de lucru active; dac folosii parametrul 1, va furniza numrul ultimei zone de lucru nefolosite. 9 used([<zona>]) furnizeaz un rezultat logic prin care se precizeaz dac zona este ocupat (.T.) sau liber (.F.). Implicit, rezultatul funciei se refer la zona curent, explicit, se refer la zona precizat prin parametrul <zona>. 9 used(<nume_tabel>) furnizeaz un rezultat logic prin care se precizeaz dac tabelul este deschis ntr-o zon de lucru (.T.) sau nu (.F.). 9 dbf([<zona>]) furnizeaz un rezultat de tip ir de caractere care poate conine numele fiierului deschis n zona de lucru sau irul vid, dac nu este deschis nici un fiier. Implicit, rezultatul funciei se refer la zona curent, explicit, se refer la zona precizat prin parametrul <zona>. 9 alias([<zona>]) furnizeaz un rezultat de tip ir de caractere care poate conine aliasul fiierului deschis n zona de lucru sau irul vid, dac nu este deschis nici un fiier. Implicit, rezultatul funciei se refer la zona curent, explicit, se refer la zona precizat prin parametrul <zona>. nchiderea unui tabel se face cu comanda: use [in <zona>] Implicit, se nchide tabelul din zona curent, explicit, se nchide tabelul din zona precizat cu clauza in. Tabelul mai poate fi nchis i cu comanda de nchidere a bazei de date (close databases) sau comanda de nchidere a tuturor fiierelor (close all).
Folosii fereastra View pentru a vizualiza zonele de lucru Deschidei baza de date din exemplul (testdata) din dosarul Data, din dosarul Samples, din dosarul aplicaiei Visual FoxPro. Pentru deschidere folosii comanda OpenFile. Se deschide fereastra Database Designer n care sunt afiate tabelele i relaiile dintre tabelele bazei de date. Deschidei fereastra View folosind comanda View WindowWindow. n fereastr nu este afiat nici un tabel n list, deoarece ai deschis baza de date, nu i tabelele din baza de date.
143
Deschidei caseta de dialog Open executnd clic pe declanatorul Open din fereastra View. Lista ascuns din care alegei baza de date.
Lista din care alegei tabelul pe care l deschidei. Grupul de butoane radio din care alegei tabele (Tables) sau vizualizri (Views). Dup ce ai deschis mai multe tabele, numele lor va fi afiat n lista Aliases. Ele sunt afiate n list n ordinea invers deschiderii. Selectai un fiier din list. n bara de stare se va afia numrul zonei de lucru n care este deschis (Work Area) i numrul total de nregistrri (Records). Observai c zonele de lucru au fost alocate n ordinea deschiderii: primului tabel deschis, zona 1, celui de-al doilea tabel deschis, zona 2 etc. Putei s definii relaii ntre dou tabele. Selectai din lista Alias tabelul surs i apoi executai clic pe declanatorul Relations. Numele tabelului va fi afiat n lista Relations. Selectai din lista Alias tabelul destinaie i apoi executai clic pe declanatorul Relations. Numele tabelului va fi afiat n lista Relations. Se deschide caseta de dialog Set IndexOrder n care este afiat lista de etichete index definite pentru tabel. Executnd clic pe eticheta index corespunztoare relaiei, se deschide caseta de dialog Expression Builder prin intermediul creia putei construi relaia.
Deschidei pe rnd toate tabelele din baza de date: fie executai dublu clic n fereastra Database Designer pe fiecare tabel pentru a deschide fereastra de editare a tabelului i implicit tabelul, fie n fereastra View executai clic pe declanatorul Open i n caseta de
144 Informatic
dialog Open executai clic pe rnd pe numele fiecrui tabel din lista Tables in Database. Deschidei pe rnd, ncepnd cu zona 1 i terminnd cu zona 5 tabelele: Customer, Products, Orditems, Orders i Employee. Dup ce ai deschis tabelele, ele vor fi afiate n fereastra View. Selectai pe rnd fiecare tabel din list. n bara de stare a ferestrei vor fi afiate informaii despre tabelul selectat: numrul zonei de lucru i numrul total de nregistrri. nchidei fereastra de comenzi. Obinei informaii despre tabelele deschise: select 1 ?used() .T. ?used(5) .T. ?used(10) .F. ?used('orders') .T. Creai baza de date din exemplu: ?dbf(3) c:\vfp\samples\data\orditems.dbf ?alias(3) orditems ?dbf(10) nimic ?alias(10) nimic
Creai baza de date Compania cu comanda: create database compania Afiai informaii despre baza de date nou creat cu comanda: display database Se vor afia numele bazei de date, calea fiierului baz de date i versiunea. Afiai baza de date n fereastra Database Designer cu comanda modify database Fereastra este vid.
Observaie: Tabelele din baza de date trebuie s conin urmtoarele chei, astfel nct s putei stabili legturi ntre ele: 9 Tabelul Angajai - cmpul id_ang cheie primar; cmpul cheie c_jud se va declara de tipul regular deoarece un tabel nu poate avea dect o cheie primar. 9 Tabelul Clieni - cmpul id_cl cheie primar; cmpul cheie c_jud se va declara de tipul regular deoarece un tabel nu poate avea dect o cheie primar. 9 Tabelul Contracte - cmpul id_cont cheie primar; cmpul cheie id_cl de tipul regular. 9 Tabelul edine - cmpul nr_s cheie primar; cmpurile cheie id_ang i id_cont se vor declara de tipul regular. 9 Tabelul Estimri - cmpul id_cont cheie de tipul regular. 9 Tabelul ncasri - cmpul nr_i cheie primar; cmpul cheie id_cont de tipul regular. 9 Tabelul Judee - cmpul c_jud se va declara de tipul cheie primar.
Adugai la baza de date tabelele libere create fie folosind opiunea de meniu, fie cu butonul din bara de instrumente, fie cu comenzile: add table angajati add table clienti add table judete Afiai informaii despre baza de date cu comanda:
145
display database Se vor afia numele bazei de date, calea fiierului baz de date, versiunea i, pentru fiecare tabel adugat la baza de date, numele, calea fiierului i structura de cmpuri.
Afiai informaii despre tabelele din baza de date cu comanda: display tables Se va afia lista cu numele tabelelor i cile fiierelor. Adugai la baza de date un tabel nou cu comanda : create contracte Se deschide fereastra Table Designer, care spre deosebire de cea afiat la crearea unui tabel liber, conine controale noi. De exemplu, pentru cmpul tip_c putei defini o regul de validare care s nu permit introducerea n cmp dect a uneia dintre valorile: 'e'-evaluare, 'i' - instruire, 'p'-proiect. Regula de validare poate fi exprimat prin una dintre urmtoarele condiii logice: lower(tip_c)='i' or lower(tip_c)='p' or lower(tip_c)='e' sau inlist (lower(tip_c),'i','p','e'). Definii structura tabelului i indecii.
n partea inferioar a ferestrei au aprut controale noi care permit stabilirea unei reguli de validare la nivelul cmpului selectat (Validation Rule), mesajul de eroare afiat (Validation Text), valoarea implicit a cmpului (Default Value), eticheta cmpului (Caption), comentarii despre cmp (Field Comment). n exemplu s-au completat aceste casete de text pentru cmpul tip_c - tipul contractului. Regula de validare este: lower(tip_c)='i' or lower(tip_c)='p' or lower(tip_c)='e' iar valoarea implicit este 'p'.
Adugai la baza de date i celelalte tabele cu comenzile : create estimari create sedinte create incasari Dup fiecare comand se deschide fereastra Table Designer n care definii structura tabelului i indecii. Modificai structura tabelelor create liber, adugndu-le reguli de validare i indeci. Executai pentru fiecare tabel deschiderea cu comanda use i apoi modificarea cu comanda modify structure. Dup ce ai adugat tabelele n baza de date, fereastra Database Designer va conine aceste tabele:
146 Informatic
ntre tabele nu sunt stabilite relaii permanente. n prealabil, n tabelele conductoare s-a stabilit cte un index primar, iar n tabelele conduse indeci de tip regular. Vei stabili interactiv relaii n fereastra Database Designer, glisnd indexul primar din tabelul conductor peste indexul regular din tabelul condus. De exemplu, glisai cheia cu numele angajat din tabela Angajai (cmpul index este id_ang) peste cheia angajat din tabela edine (cmpul index este id_ang). Se deschide caseta de dialog Edit Relationship n care executai clic pe declanatorul OK. Dup ce ai definit relaiile, fereastra Database Designer va afia:
Observai c ntre tabelul Judee i tabelele Angajai i Clieni nu s-au stabilit nc relaii. n tabelele Angajai i Clieni cheia c_jud nu poate fi declarat cheie candidat, deoarece exist mai multe nregistrri cu aceeai valoare a cheii (mai muli angajai i clieni din acelai jude). Aadar, se poate stabili o relaie de tip una-la-mai multe ntre tabelul Judee i tabelul Angajai, respectiv Clieni.
147
Deoarece tabelele din baza de date trebuie gestionate mpreun, trebuie asigurat integritatea referenial. Definii pentru fiecare relaie regula de integritate referenial astfel: n fereastra Database Designer executai dublu clic pe o relaie. Se deschide caseta de dialog Edit Relationship n care executai clic pe declanatorul Referential Integrity.... Se deschide caseta de dialog Referential Integrity Builder care conine trei seciuni:
9 seciunea Rules for Updating n care putei stabili regula de integritate referenial pentru operaiile de actualizare, 9 seciunea Rules for Deleting n care putei stabili regula de integritate referenial pentru operaiile de tergere i 9 seciunea Rules for Inserting n care putei stabili regula de integritate referenial pentru operaiile de adugare. Aceste operaii se refer la tabelele conductoare, n care modificarea valorii cheii primare poate s duc la ruperea legturii cu unele nregistrri din tabelul condus. Deschidei seciunea corespunztoare operaiei pentru care stabilii regula de integritate, selectai relaia tabel printe - tabel copil pentru care stabilii regula i activai apoi butonul radio corespunztor regulii de integritate. Putei alege una dintre urmtoarele reguli de integritate: Cascade (se terg sau se modific n cascad toate nregistrrile din tabelul copil, legate de nregistrarea tears sau modificat din tabelul printe), Restrict (dac exist n tabelul copil o nregistrare legat de nregistrarea care se terge sau se modific n tabelul printe, se oprete procesul i se afieaz un mesaj de eroare), Ignore (operaiile se pot executa fr restricii). Deschidei acum prin comenzi fiecare tabel ntr-o zon diferit: select 1 use clienti select 6 use angajati select 4 use estimari select 2 use contracte select 7 use judete select 5 use incasari select 3 use sedinte Verificai integritatea datelor existente n acest moment folosind comanda: validate database Adugai date la fiecare tabel.
#
1. 2. 3. 4. 5.
ncercai:
Completai: 1. Putei vedea arhitectura bazei de date n fereastra .......................... 2. Putei verifica integritatea bazei de date cu comanda ............................ 3. Dac ai deschis mai multe baze de date, putei activa o baz de date cu comanda .............................................. 4. Putei nchide o baz de date cu comanda .................................... 5. Putei s deschidei fereastra Database Designer pentru o baz de date deschis cu comanda .............................. Alegei rspunsul corect: 1. Adugai un tabel liber la o baz de date cu comanda: a) add table b) new table 2. Adugai un tabel nou la o baz de date cu comanda: a) add table b) new table 3. Stabilii zona de lucru activ cu comanda: a) open b) select 4. Aflai dac un tabel este deschis cu funcia: a) dbf() b) used() 5. Aflai numrul zonei de lucru active cu funcia: a) select() b) used() Rspundei: 1. Care sunt etapele de creare a unei baze de date? 2. Prin ce metode putei vedea arhitectura bazei de date?
R spunsuri:
Adevrat/Fals: 1-A; 2-F; 3-A; 4-A; 5-F. Completai: 1-Database Designer; 2-validate database; 3-set database to; 4-close databases; 5-modify database. Alegei rspunsul corect: 1-a; 2-c; 3-b; 4-b; 5-a.
149
6.1. Interogrile
Interogarea este operaia prin care extragei date din baza de date fr s le tergei sau s le modificai i pe care le afiai ntr-un anumit format. Extragerea se face n funcie de un anumit criteriu numit criteriu de interogare. Acesta trebuie s defineasc datele pe care vrei s le extragei: numele cmpurilor, tabelele din care fac parte, criteriile prin care se extrag nregistrrile i n ce ordine sunt pezentate. Interogarea este scopul bazei de date. Cnd un utilizator interogheaz baza de date, el pune de fapt o ntrebare: Ce date din baza de date ndeplinesc aceste condiii?". Folosind o interogare putei: 9 s combinai nregistrri din mai multe tabele ntr-un singur tabel, 9 s selectai numai nregistrrile care ndeplinesc un anumit criteriu, 9 s afiai nregistrrile n ordinea dorit, 9 s afiai cmpuri calculate. Interogrile pot afia nregistrri din mai multe tabele. Dac relaia dintre cele dou tabele este de una-la-mai-multe, interogarea va afia pe mai multe rnduri cmpurile corespunztoare nregistrrilor din al doilea tabel (mai-multe) legate de o singur nregistrare din primul tabel (una), iar n aceste rnduri se vor repeta cmpurile din primul tabel.
150 Informatic
Pentru operaia de interogare, orice sistem de gestiune a bazelor de date are implementate diferite instrumente prin care s se comunice sistemului criteriul de interogare. Unul dintre aceste instrumente este limbajul SQL, care este limbajul standard de interogare. n Visual FoxPro putei crea o interogare: 9 interactiv folosind generatorul de interogri (Query Designer); 1 9 prin limbajul de comand SQL (instruciunea select ). n urma operaiei de creare, interogarea este salvat ntr-un fiier cu extensia .qpr care conine specificaiile criteriului de interogare. Acest fiier este un fiier de tip ASCII n care se memoreaz comanda SQL asociat. Deoarece fiierul conine o comand SQL, pentru a o executa trebuie s lansai n execuie fiierul cu comanda: do <nume_fiier>.qpr Ai vzut c operatorul relaional select aplicat pe un tabel creeaz un alt tabel care conine submulimi de date din tabelul surs. Aadar i rezultatul unei interogri va fi tot un tabel, care va conine datele specificate de criteriul de interogare. Destinaia interogrii (destinaia datelor din tabelul obinut) poate fi: 9 fereastra de editare Browse, 9 diagrama (graph), 9 ecranul (screen), 9 raportul (report), 9 tabelul permanent (table) sau temporar (cursor). Aadar, interogarea se aplic pe mai multe tabele ale bazei de date numite tabele surs, iar rezultatul unei interogri este un tabel numit tabel destinaie; modificrile fcute n tabelul destinaie nu se reflect i n tabelele surs. Parametrii folosii n construirea unei interogri sunt: 9 Cmpurile (fields) din tabelele bazei de date (tabelele surs). Se recomand s se preia din tabelele surs numai cmpurile strict necesare. 9 Legtura (join) dintre tabelele bazei de date (tabelele surs). Pe lng legturile stabilite ntre tabele n cadrul bazei de date, care vor fi preluate automat, se mai pot stabili noi legturi cu tabele care nu au fost legate la baza de date. Dac definii dou legturi ntre tabele, le putei lega cu operatorii logici or sau and. 9 Filtrul (filter) prin care se precizeaz condiiile de filtrare, adic modul n care vor fi selectate datele din tabelele bazei de date. Un criteriu de selecie sau de filtrare trebuie s precizeze cmpul sau expresia care conine cmpul, operatorul relaional i valoarea cu care se compar. Pot fi definite mai multe criterii de filtrare legate ntre ele prin operatorii logici or sau and (ordinea de evaluare este and i apoi or). 9 Ordonarea (order by) prin care se precizeaz ordinea n care vor fi prezentate rezultatele interogrii (n tabelul destinaie). Ordinea este dat de un criteriu de ordonare determinat de un cmp din tabel sau de mai multe criterii de ordonare determinate de mai multe cmpuri. n acest caz, un criteriu de ordonare este luat n consideraie numai dac cele definite anterior au aceeai valoare a cmpurilor pentru dou nregistrri.
Este diferit de comanda select folosit pentru selectarea unei zone de lucru.
151
9 Gruparea (group by) prin care se precizeaz un criteriu de grupare a datelor. Acest criteriu este dat de cheia de grupare format din unul sau mai multe cmpuri ale tabelului. Conform acestei chei, nregistrrile care au aceeai valoare a cheii de grupare vor fi cumulate n tabelul destinaie ntr-o singur nregistrare, n care fiecare cmp numeric va fi calculat prin nsumarea valorilor corespunztoare cmpului din toate nregistrrile grupului. Mai pot fi definite i criterii de selecie la nivel de grup prin care se precizeaz condiia pe care trebuie s o ndeplineasc grupul de nregistrri pentru a face parte din tabelul destinaie. Condiia este precizat prin cmpul sau expresia care conine cmpul, operatorul relaional i valoarea cu care se compar.
6.2. Vizualizrile
Vizualizrile sunt tabele virtuale, construite pe baza datelor din tabelele bazei de date, care pot fi legate prin relaii i care permit modificarea lor de ctre utilizator. Aadar, dac n cazul unei interogri utilizatorul poate vedea numai un rezultat, n cazul vizualizrii utilizatorul poate interveni i poate modifica valoarea datelor. Orice modificare fcut ntr-o vizualizare se va regsi i n tabelul real al bazei de date. Cnd se creeaz o vizualizare, se pune de fapt ntrebarea: Cu ce date din baza de date poate interaciona utilizatorul?". Construirea unei vizualizri const, ca i n cazul unei interogri, n extragerea anumitor date din baza de date, pe baza unui criteriu. Rezultatul va fi memorat n fiierul bazei de date (.dbc). De aceea, pentru a folosi o vizualizare, trebuie deschis mai nti baza de date i apoi vizualizarea, ca orice tabel din baza de date. Aadar, vizualizarea este o structur de date, la fel ca i tabelele bazei de date, iar interogarea este un fiier care conine o comand i care trebuie lansat n execuie la fel ca orice fiier de program. Dac n cazul interogrilor datele circul ntr-un singur sens, de la tabelele bazei de date la formatul ales pentru afiare, n cazul vizualizrilor ele pot circula n ambele sensuri ntre tabelele bazei de date i vizualizare. Vizualizrile se pot construi cu constructorul de vizualizri (View Designer). Vizualizarea folosete, pe lng parametrii ntlnii la interogri, urmtorii parametri: 9 Cmpurile cheie. Aceste cmpuri sunt alese astfel nct s identifice unic relaia dintre vizualizare i tabelele surs. Pentru fiecare tabel surs trebuie s se defineasc unul sau mai multe cmpuri cheie care s identifice unic fiecare nregistrare din acel tabel. 9 Cmpurile actualizate i cmpurile neactualizate. Acest parametru stabilete modul n care se transmit datele ntre vizualizare i tabelele surs. Astfel, dac n vizualizare se face modificarea ntr-un cmp actualizat, modificarea va fi transmis i n tabelele surs, altfel, dac modificarea se face ntr-un cmp nemodificat, ea nu se va transmite i ctre tabelele surs.
6.3. Rapoartele
Raportul este o colecie de informaii obinute din datele stocate n tabelele bazei de date, prezentate utilizatorului ntr-o form ct mai clar i mai concis. El poate fi tiprit la
152 Informatic
imprimant sau afiat pe ecran i prezint un set de date legate ntre ele, preluate din tabelele bazei de date. Permite descrierea elementelor care pot s apar: textul afiat deasupra coloanelor, cmpurile din coloane, la care pot fi adugate i alte texte sau imagini grafice (linii, chenare, imagini bitmap sau vectoriale etc.). Raportul nu modific datele din tabele. El parcurge secvenial nregistrrile din tabele pentru: 9 obinerea unor date sintetice: subtotaluri i totaluri, 9 obinerea unor rezumate, 9 gruparea datelor pe mai multe niveluri, fiecare nivel cu propriile sale informaii sintetice i rezumate, 9 analize complexe i grafice. n general, raportul este conceput sub forma unui tabel. n plus are i funcia de sortare i grupare a datelor. Raportul se compune din: 9 Seciunea de date (Detail) conine date care se repet pentru fiecare nregistrare. 9 Antetul paginii (Page Header) definete elementele care trebuie s apar n partea de sus a fiecrei pagini a raportului. 9 Subsolul paginii (Page Footer) definete elementele care trebuie s apar n partea de jos a fiecrei pagini a raportului. 9 Antetul raportului (Report Header sau Title) apare numai pe prima pagin a raportului. El este ca un titlu pentru ntregul raport i poate conine texte i imagini (de exemplu sigla firmei). 9 Subsolul raportului (Report Footer sau Summary) apare numai pe ultima pagin a raportului i cuprinde de obicei un rezumat al datelor din diferite seciuni ale raportului. 9 Grupul (Group). Un raport poate prezenta coninutul unui tabel sau al mai multor tabele din baza de date. Aceste date pot fi grupate dup diferite criterii i totalizate la nivel de grup. n linia totalului pot fi inserate totaluri ale unor cmpuri, adic date n care sunt cumulate valorile aceluiai cmp pentru ntreg grupul de nregistrri. Pot fi definite mai multe niveluri de grupare. Pentru fiecare nivel trebuie definit un criteriu de grupare caracterizat printr-o expresie care este evaluat la fiecare nregistrare. Dac exist un singur nivel de grupare, numrul de grupuri va fi egal cu numrul de valori diferite ale cheii de grupare. 9 Antetul grupului (Group Header) afieaz un titlu al grupului (criteriul de grupare). 9 Subsolul grupului (Group Footer) afieaz date sintetice despre grup. Raportul conine informaii utile personalului care are atribuii de conducere n cadrul organizaiei. n funcie de nivelul de conducere pentru care se produce raportul, cantitatea de date prezentat difer. La nivelul inferior de conducere, nivelul operaional, la care personalul de conducere are rolul de a monitoriza i a controla activitile zilnice ale angajailor, rapoartele trebuie s fie detaliate i s conin informaii specifice despre activitile zilnice (de exemplu rapoartele de ncasri). La nivelul mediu de conducere (director tehnic, director de vnzri, director de resurse umane etc.) ele trebuie s conin mai puine detalii i mai multe treceri n revist, rezumate i analize ale datelor din istoric. Aceste date trebuie s-i ajute s planifice i s controleze operaiile i s implementeze strategii care trebuie s fie bine formulate i argumentate. De exemplu, aceste rapoarte pot prezenta un rezumat al activitilor (ncasrile rezultate din contractele de consultan cu un client, ncasrile rezultate
153
dintr-un anumit tip de consultan - de exemplu instruire), pot prezenta situaii de excepie, care depesc limitele normale (clieni care au derulat n ultimul trimestru mai mult de cinci contracte de consultan) sau, atunci cnd trebuie s se concentreze pe o problem, pot conine date la cerere (dac un client nu i-a mai pltit de mult edinele de consultan, se poate cere un raport despre client care s conin contractele i modul n care a pltit pe o perioad de timp). n funcie de informaia prezentat, exist trei categorii de rapoarte: 9 Rapoarte periodice. Se produc la intervale de timp regulate (sptmnal, lunar, trimestrial etc.), cum este de exemplu raportul lunar al edinelor cu clienii. 9 Rapoarte la cerere. Sunt produse la cerere, cum este de exemplu raportul cu contractele de consultan ale unui client. 9 Rapoarte ale excepiilor. Sunt produse pentru a atrage atenia asupra unor evenimente deosebite, cum este de exemplu raportul ncasrilor lunare ale unui angajat permanent cu norm ntreag, care sunt cu mult sub nivelul normal. Pentru construirea unui raport se poate folosi constructorul de rapoarte (Report Designer). El simplific procesul de creare a rapoartelor, deoarece folosete o procedur simpl: utilizatorul trebuie s precizeze numele coloanelor din tabele care trebuie s apar n raport, totalurile pe coloane, subtotalurile pe grupuri de nregistrri, diferite alte calcule. n urma comunicrii acestor date, el va genera un tabel care conine toate datele i caracteristicile raportului i care sunt memorate ntr-un fiier cu extensia .frx.
Creai o interogare Interogarea trebuie s rspund la urmtoarea ntrebare: Ce angajai (identificai prin nume, prenume i numele judeului) au tariful cuprins ntre 260.000 i 300.000?". Afiarea se va face ntr-o fereastr de editare Browse. Fiierul n care vei salva interogarea va fi a1.qry. Deschidei baza de date Compania cu comanda: open database compania. Alegei opiunea NewFile. Se deschide caseta de dialog New n care din grupul de butoane cu opiuni File Type activai butonul Query dup care executai clic pe butonul New File. Se deschide caseta de dialog Add Table or View. Din lista Tables in Database selectai mai nti tabelul Angajai i executai clic pe butonul Add Table din bara de instrumente Query Designer, apoi selectai tabelul Judee i executai clic pe butonul Add Table. Se deschide fereastra generatorului de interogri Query Designer. n partea superioar este afiat un panou care conine tabelele care au fost selectate din baza de date pentru a face parte din interogare. Fiecare tabel este reprezentat ntr-o fe-
154 Informatic
reastr redimensionabil n care sunt afiate cmpurile i indecii tabelului. Dac ntre tabele exist legturi, sunt afiate i acestea. Pe lng aceste legturi definite deja n baza de date, putei crea noi legturi fie glisnd un cmp index de la tabelul surs la tabelul destinaie, fie prin intermediul obiectelor din caseta de dialog Join Condition pe care o deschidei executnd dublu clic pe butonul Add Join din bara de instrumente Query Designer. n partea inferioar este afiat un panou cu mai multe seciuni: 9 Selection Criteria - conine controale pentru a stabili criteriul de selectare a nregistrrilor. Criteriul poate conine anumite valori ale unui cmp i condiii pentru legturile temporare dintre tabele. 9 Fields - conine controale pentru a stabili cmpurile din tabel sau cmpurile calculate care vor fi afiate de interogare. 9 Order By - conine controale pentru a stabili cmpurile din tabel sau cmpurile calculate care vor determina ordinea de afiare n interogare. 9 Group By - conine controale pentru a stabili modul n care vor fi grupate nregistrrile afiate de interogare. Deschidei seciunea Fields. n lista Available Fields sunt afiate cmpurile disponibile n tabelele selectate. Selectai din aceast list grupul de cmpuri Angajai.nume, Angajai.pren, Angajai.tarif i Judee.n_jud (executai clic pe numele cmpului cu tasta Ctrl apsat). Executai apoi clic pe declanatorul Add>. Cmpurile selectate vor fi copiate n lista cu cmpurile selectate pentru a fi afiate - Selected Output. n seciune mai putei folosi urmtoarele controale: butoanele Add All>> (copiaz toate cmpurile din tabele n lista Selected Output), <Remove (nltur cmpul selectat), i <<Remove All (nltur toate cmpurile din lista Selected Output) precum i caseta combinat Functions/Expressions prin care putei defini cmpurile calculate. Bara de instrumente Query Designer conine urmtoarele butoane:
Adaug un tabel nou la interogare. nltur tabelul selectat din interogare. Implicit vor fi nlturate cmpurile, criteriile de selectare, criteriile de sortare i criteriile de grupare definite de cmpurile din acest tabel. Adaug noi legturi ntre tabelele interogrii. Deschide fereastra de editare n care este afiat comanda SQL asociat interogrii definite interactiv. Maximizeaz panoul cu tabele. Panoul cu seciuni nu va mai fi afiat. Deschide o caset de dialog care conine controale pentru a alege destinaia interogrii: o fereastr Browse, ecranul, o diagram etc.
3 Add Join 4 Show the SQL Window 5 Maximize the table Window 6 Query Destination
Deschidei seciunea Selection Criteria. Executai dublu clic pe butonul Condition. Se deschide caseta de dialog Join Condition n care este afiat condiia care definete legtura dintre cele dou tabele. Deoarece legtura este realizat prin dou cmpuri de tip ir de caractere, pentru a evita unele nepotriviri din cauza scrierii cu litere mari sau cu litere mici a aceluiai cod de jude, activai comutatorul Ignore Upper/Lower Case. nchidei caseta de dialog. Vei observa c n urma acestei operaii, s-a activat n gril comutatorul Case corespunztor condiiei. n grila afiat n seciune adugai criteriul pentru selectarea nregistrrilor: tarif>260000 and tarif<300000. Pentru aceasta executai clic pe declanatorul Insert, alegei din lista ascuns Field Name numele cmpului Angajai.tarif, din lista ascuns Criteria operatorul More Than i scriei n caseta de text Example valoarea
155
260000. Executai din nou clic pe declanatorul Insert, alegei din lista Field Name din nou numele cmpului Angajai.tarif, din lista Criteria operatorul Less Than i scriei n caseta de text Example valoarea 300000. Cele dou condiii au fost adugate n gril. Condiiile sunt legate implicit prin operatorul logic and. Dac trebuie schimbat operatorul logic and cu or se execut clic pe declanatorul Add Or. Dac vrei s schimbai ordinea n care sunt afiate condiiile n gril selectai condiia pe care vrei s o mutai i executai clic pe butonul (Mover Box). Dac vrei s nlturai o condiie, o selectai n gril i executai clic pe declanatorul Remove.
condiia pentru legtura dintre tabele butonul Condition lista cmpurilor din interogare
Deschidei seciunea Order By pentru a stabili ordinea n care vor fi afiate nregistrrile. Selectai, din lista Selected Output care afieaz cmpurile din interogare, cmpurile Angajai.nume i Angajai.pren dup care acionai declanatorul Add>. Cmpurile vor fi adugate n lista Ordering Criteria. n grupul de butoane radio Order Options este activat butonul Ascending (ordinea alfabetic a numelui i prenumelui). Ordinea cmpurilor din cheia de sortare este Angajai.nume i Angaja1i.pren, adic ordinea din lista Ordering Criteria (ordinea este dat de ordinea de adugare la aceast list). Dac vrei s nlturai un criteriu de sortare, l selectai n lista Ordering Criteria i acionai declanatorul <Remove. Deschidei seciunea Group By numai pentru a identifica controalele, deoarece interogarea nu conine grupuri de nregistrri. n seciune sunt dou liste Available Fields (cmpurile disponibile) din care putei selecta cmpul folosit pentru cheia de grupare, lista Group By Fields n care vor fi afiate cheile de grupare, declanatoarele Add> i <Remove cu care putei aduga sau nltura chei de grupare. Prin acionarea declanatorului Having... se deschide caseta de dialog Having prin intermediul creia putei stabili criterii de selecie la nivelul unui grup.
156 Informatic
Executai clic pe butonul Query Destination din bara de instrumente Query Designer. Se deschide caseta de dialog Query Destination n care executai clic pe butonul Browse pentru ca rezultatul interogrii s se afieze ntr-o fereastr de editare Browse. Vizualizai comanda SQL asociat acestei interogri. Executai clic pe butonul Show the SQL Window din bara de instrumente. Se deschide fereastra de editare care afieaz comanda SQL:
SELECT Angajati.nume, Angajati.pren, Angajati.tarif, Judete.n_jud; FROM compania!angajati, compania!judete; WHERE UPPER(Judete.c_jud) = UPPER(Angajati.c_jud); AND (Angajati.tarif > 260000; AND Angajati.tarif < 300000); ORDER BY Angajati.nume, Angajati.pren
nchidei fereastra de editare. nchidei fereastra generatorului de interogri i salvai interogarea sub numele a1.qry. Observai c n fereastra Command este afiat comanda asociat interogrii create interactiv: create query Afiai rezultatul interogrii cu comanda: do a1.qri Se deschide fereastra de editare de tip Browse:
Modificai interogarea astfel nct rezultatul s fie afiat pe ecran. Deschidei interogarea pentru modificare, fie cu opiunea OpenFile, fie cu comanda: modify query c:\vfp\a1.qpr Se deschide fereastra generatorului de interogri Query Designer. Executai clic pe butonul Query Destination din bara de instrumente. Se deschide caseta de dialog Query Destination n care executai clic pe butonul Screen. Vizualizai comanda SQL asociat acestei interogri. Executai clic pe butonul Show the SQL Window din bara de instrumente. Se deschide fereastra de editare care afieaz comanda SQL, la care observai c a fost adugat opiunea to screen. nchidei fereastra de editare a comenzii. nchidei fereastra generatorului cu salvare. Afiai rezultatul interogrii cu comanda: do a1.qri
157
Rezultatul va fi afiat pe ecran, la fel ca rezultatul unei comenzi list/display. Modificai aceast interogare astfel: se vor afia i angajaii care au un tarif de 300000 lei, se va afia o coloan nou cu vrsta angajailor, iar rezultatul va fi afiat ntr-o fereastr Browse. Deschidei interogarea pentru modificare. Se deschide fereastra generatorului de interogri Query Designer. Deschidei seciunea Selection Criteria i nlocuii valoarea 300000 cu 300001. Deschidei seciunea Fields i scriei n caseta combinat expresia prin care se calculeaz valoarea cmpului vrsta: int((date()-data_n)/365). Executai clic pe butonul Query Destination din bara de instrumente. Se deschide caseta de dialog Query Destination n care executai clic pe butonul Browse. nchidei cu salvare fereastra generatorului de interogri. Afiai rezultatul interogrii cu comanda do a1.qri Modificai interogarea astfel nct n fereastra de editare coloana Pren s aib numele Prenume, coloana N_jud numele Jude, iar coloana cmpului calculat numele Varsta. Modificarea se va face n comanda SQL. Pentru aceasta vei deschide o fereastr de editare cu comanda: modi comm a1.qpr Fereastra de editare va afia comanda SQL. Modificai comanda astfel:
SELECT Angajati.nume, Angajati.pren As Prenume, Angajati.tarif, Judete.n_jud As Judet; INT((DATE()-Angajati.data_n)/365) As Varsta; FROM compania!angajati, compania!judete; WHERE Judete.c_jud = Angajati.c_jud; AND (Angajati.tarif > 260000; AND Angajati.tarif < 300001); ORDER BY Angajati.nume, Angajati.pren
nchidei fereastra de editare. Afiai din nou rezultatul interogrii. Observai modificrile aprute n fereastra Browse. nchidei interogarea i baza de date cu comanda close all.
Creai o vizualizare Vizualizarea trebuie s rspund la urmtoarea ntrebare: Cu ce date din baza de date poate interaciona utilizatorul pentru angajaii (identificai prin nume, prenume, vrst i numele judeului) care au tariful cuprins ntre 260.000 i 300.000?". Utilizatorului i se va permite s interacioneze doar cu cmpul tarif. Deschidei baza de date Compania. Alegei opiunea NewFile. Se deschide caseta de dialog New n care din grupul de butoane cu opiuni File Type activai butonul View, dup care executai clic pe butonul New File. Se deschide caseta de dialog Add Table or View. Din acest moment vei urma aceiai pai pe care i-ai executat atunci cnd ai creat o interogare. Bara de instrumente View Designer conine primele cinci butoane din bara Query Designer. Fereastra generatorului de vizualizri conine n plus seciunea Update Criteria. Prin intermediul controalelor din aceast seciune putei stabili cmpurile cheie (cmpurile care realizeaz legtura ntre vizualizare i tabelele surs) i cmpurile actualizate (cmpurile a cror modificare se transmite i ctre tabelele surs). Deschidei aceast seciune pentru a stabili parametrii vizualizrii. Lista Field Name conine lista cmpurilor din vizualizare disponibile pentru actualizare, din tabelul Angajai. Se stabilesc mai nti cmpurile cheie (care vor identifica unic relaia vizualizare-tabel surs). Aceste
158 Informatic
cmpuri sunt nume i pren. Se selecteaz fiecare dintre aceste cmpuri i se activeaz comutatorul pentru cmpul cheie. Se pot stabili acum cmpurile care pot fi actualizate (ele nu pot fi cmpuri cheie). Singurul cmp care a mai rmas este cmpul tarif. l vom marca pentru actualizare fie executnd clic pe comutatorul de actualizare din dreptul su din lista Field Name, fie executnd clic pe declanatorul Update All. Actualizarea cmpului marcat se poate face n dou moduri, pe care le stabilii cu butoanele radio Update using: prin tergerea vechilor nregistrri i reinserarea celor modificate (SQL DELETE then INSERT) sau prin scrierea modificrilor direct n nregistrare (SQL UPDATE). Activai butonul radio SQL UPDATE. Activai comutatorul Send SQL updates (dac vrei ca aceste actualizri s se i realizeze). Salvai vizualizarea sub numele a1. Deschidei vizualizarea (ca pe un tabel cu comanda use). Afiai vizualizarea n fereastra de editare Browse (cu comanda browse). Facei modificri n cmpurile vizualizrii.
coloana de comutatoare pentru cmpuri actualizate coloana de comutatoare pentru cmpuri cheie
Deschidei tabelul Angajai. Afiai coninutul acestui tabel ntr-o fereastr browse. Observai ce modificri fcute n vizualizare se regsesc n tabel. nchidei baza de date.
Creai un raport Se construiete un raport n care se prezint situaia ncasrilor cu subtotaluri pentru fiecare contract. Deschidei baza de date Compania. Alegei opiunea NewFile. Se deschide caseta de dialog New n care, din grupul de butoane cu opiuni File Type, activai butonul Report, dup care executai clic pe butonul New File. Se deschide fereastra generatorului de rapoarte care este
159
mprit n mai multe benzi, fiecare band reprezentnd o zon din raport. Putei modifica dimensiunea unei zone pe vertical, glisnd bara delimitatoare a zonei. Definii mediul de date al raportului (tabelele din care preia datele). Alegei opiunea Data Environment...View. Se deschide fereastra care este vid. Alegei opiunea Add... Data Environment. Se deschide caseta de dialog Add Table or View. Alegei din list tabelul ncasri. Reluai operaia i alegei din list tabelul Contracte. Tabelele i relaia dintre ele vor fi adugate n fereastr. Adugai n fereastra generatorului de rapoarte benzile pentru antetul i subsolul raportului. Alegei opiunea Title/Summary... Report. Se deschide caseta de dialog Title/Summary n care activai comutatorul Title band pentru antetul raportului i comutatorul Summary band pentru subsolul raportului. Stabilii caracteristicile caracterelor din raport. Alegei opiunea Default Font... Report. Alegei n caseta de dialog Font fontul Arial.
Banda pentru
subsol de pagin
1 1 2 3 4 5 6 7 8
Select Object Label Field Line Rectangle Rounded Rectangle Data Grouping Report Controls Toolbar
Selecteaz un obiect. Activeaz scrierea textului. Activeaz inserarea unui cmp Activeaz trasarea unei linii. Activeaz trasarea unui dreptunghi. Activeaz trasarea unui dreptunghi cu coluri rotunjite. Permite gruparea datelor. Activeaz bara cu instrumente Report Controls.
Scriei titlul raportului. Executai clic pe instrumentul Label, executai clic n banda pentru antetul raportului n locul n care vrei s scriei titlul i scriei: Situaia ncasrilor pe contracte. Executai clic n banda de antet de pagin i scriei titlurile coloanelor: Nr. ncasare, Nr. contract, Client, Data i Valoare. Adugai la raport cmpurile care vor fi afiate. Executai clic pe instrumentul Field. Executai apoi clic n banda Detail, sub titlul coloanei Nr. ncasare n poziia n care vrei s apar valoarea cmpului. Se deschide caseta de dialog Report Expression. Executai clic pe butonul Expression i se deschide caseta de dialog Expression
160 Informatic
Builder n care alegei din lista Fields cmpul ncasri.nr_i. Reluai operaia pentru cmpurile ncasri.id_cont, Contracte.id_cl, ncasri.data_p, ncasri.valoare. Creai grupuri de nregistrri dup numrul contractului. Alegei opiunea Data Grouping...Report. Se deschide caseta de dialog Data Grouping n care vei defini un singur nivel pentru grup. Executai clic pe butonul primului grup. Se deschide caseta de dialog Expression Builder n care alegei din lista Fields cmpul ncasari.id_cont. Definii totalul la nivelul raportului i subtotal la nivelul fiecrui grup pentru cmpul valoare. Executai clic pe instrumentul Field. Executai apoi clic n banda Group, sub cmpul Valoare. Se deschide caseta de dialog Report Expression. Executai clic pe butonul Expression i din caseta de dialog Expression Builder alegei cmpul incasari.valoare. n caseta de dialog Report Expression executai clic pe butonul Calculations.... Se deschide caseta de dialog Subtotal or Calculate Field n care activai n grupul de butoane radio Subtotal or Calculate butonul Sum. Reluai aceleai operaii i pentru banda subsolului de raport.
Salvai raportul sub numele a1. nchidei caseta de dialog. n fereastra Command este afiat comanda cu care a fost creat raportul: create report. Previzualizai raportul cu comanda: report form a1 preview. Putei modifica raportul cu comanda: modify report a1. Vei modifica raportul astfel: deoarece cmpurile pentru numrul contractului i pentru identificatorul clientului se repet la nivelul grupului, vei aduga aceste date n antetul grupului i le vei scoate din seciunea de date a raportului. Putei tipri un raport cu comanda: Report form <nume_fiier> [heading <exp_C>] [summary] [<domeniu>][for <expL1>][ while <expL2>][to printer | to file <nume_fiier>] unde clauza heading permite afiarea unui antet suplimentar la nceputul fiecrei pagini, iar clauza summary inhib afiarea rndurilor cu date i afieaz numai rndurile cu totaluri i subtotaluri.
161
162 Informatic
with blank - cmpurile sunt separate prin spaiu; with <delimitator> - cmpurile de tip caracter vor fi delimitate de caracterul <delimitator> n locul ghilimelelor. 1. Importul datelor este operaia prin care se preiau date create cu alte aplicaii i sunt transformate ntr-un tabel al bazei de date Visaul FoxPro. Se realizeaz cu comenzile: Import i Append from . a. Sintaxa comenzii Import este: Import from <nume_fiier> type <tip>
extensie produs de Tabele din baz de date fox2x .dbf versiuni anterioare FoxPro (pentru MS-DOS sau Windows pdox .db Paradox versiuni 3.5/4.0 Foi de calcul wk1/wk3/ wk1/wk3/ Lotus 1-2-3 - diferite wks wks versiuni xls/xl5 xls Excel vers. 2.0/5.0 Fiiere text sdf txt fiiere ASCII delimited txt fiiere ASCII <tip>
b. Sintaxa comenzii Append from este: Append from <nume_fiier> type <tip> unde <nume_fisier> este numele fiierului din care se import datele, iar <tip> reprezint tipul fiierului. 2. Exportul datelor este operaia prin care se transfer date dintr-un tabel al bazei de date ntr-un alt tip de fiier, specific unei alte aplicaii. Se realizeaz cu comenzile: Export i Copy to. a. Sintaxa comenzii Export este: Export to <nume_fiier> [fields <list_cmpuri>] [<domeniu>] [for <expL1>] [while <expL2>] type <tip> b. Sintaxa comenzii copy to este: Copy to <nume_fiier> [fields <list_cmpuri>] [<domeniu>] [for <expL1>] [while <expL2>] type <tip> unde <nume_fisier> este numele fiierului din care se import datele, iar <tip> este tipul fiierului. Implicit se transfer toate cmpurile din tabel. Explicit se transfer numai cele precizate prin lista clauzei fields. Implicit se transfer toate nregistrrile din tabel. Explicit se transfer numai cele precizate prin clauzele <domeniu>, for sau while. Import Append from tabel al bazei de date Copy to Export alt tip de fiier
163
Poziionai cursorul n document n poziia n care vrei s inserai datele din tabel. Afiai bara de instrumente Database cu opiunea DatabaseToolbarsView. Executai clic pe butonul Insert Database. Se deschide caseta de dialog Database. Executai clic pe declanatorul Get Data... Din caseta de dialog Open Data Source alegei numele tabelului, de exemplu Angajai. Se revine n caseta de dialog Database. Executai clic pe declanatorul Query Options... Se deschide caseta de dialog Query Options care conine trei seciuni pentru stabilirea unui criteriu de interogare. Deschidei seciunea Filter Records pentru a stabili criteriul de filtrare (de exemplu numai angajaii din Bucureti). Din lista ascuns Field alegei cmpul c_jud, din lista Comparison operatorul Equal to, iar n caseta de text Compare to scriei B. Deschidei seciunea Sort Records pentru a stabili cheia de sortare (de exemplu dup nume i prenume). Putei alege maxim trei chei de sortare. Alegei din lista ascuns Sort by cmpul nume etc. Deschidei seciunea Select Fields pentru a stabili cmpurile care vor fi preluate din baza de date. Alegei din list cmpurile nume, pren, tel_f i tel_m. nchidei caseta de dialog Query Options. Executai clic pe declanatorul Table Auto Format dac vrei s alegei unul dintre formatele predefinite pentru tabele. Executai clic pe declanatorul Insert Data.... Se deschide caseta de dialog Insert Data din care putei alege domeniul nregistrrilor. Datele din tabelul bazei de date vor fi inserate n document sub forma unui tabel.
Deschidei baza de date Compania i apoi tabelul Clienti. open database compania use clienti
Exportai datele din tabel n diferite formate de fiier text ASCII:
copy to cl1.txt sdf copy to cl2.txt delimited copy to cl3.txt; delimited with blank modi file cl1.txt ................ modi file cl5.txt
164 Informatic
Creai un raport cu evidena edinelor. edinele vor fi grupate dup numrul contractului i pentru acelai contract vor fi afiate n ordine cronologic. Afiai subtotaluri la nivel de grup i un total la nivel de raport pentru durata edinelor i pentru costul edinelor. 4. Importai fiierele cu texte cl1.text, ..., cl5.txt n tabele. Vizualizai coninutul acestor tabele. 5. Exportai tabelul Clieni ntr-o foaie de calcul Excel. Vizualizai coninutul foii de calcul. 6. Importai foaia de calcul ntr-un tabel. Vizualizai coninutul tabelului. 3.
#
1. 2. 3. 4. 5. 6. 7.
ncercai:
Adevrat/Fals: Prin intermediul interogrii putei face modificri n tabelele bazei de date. Prin intermediul unei vizualizri putei modifica orice cmp din tabelele bazei de date. Folosind interogarea putei stabili o ordine de afiare a nregistrrilor. Folosind interogarea putei combina nregistrri din mai multe tabele. Putei insera date dintr-un tabel al bazei de date ntr-un document Word. Putei exporta un tabel Visual FoxPro ntr-un tabel FoxPro for MS-DOS. Comanda copy to alfa.txt delimited with ! va exporta datele din tabel ntr-un fiier de tip text n care cmpurile din tabel vor fi separate de semnul !.
Completai: 1. Criteriul de interogare este salvat ntr-un fiier sub form de .......................... 2. Vizualizarea este salvat ntr-un fiier sub form de .......................... 3. Obinei rezultatul unei interogri cu comanda .............................................. 4. Putei construi interactiv un raport folosind .................................... 5. Datele din cmpurile nregistrrii vor fi inserate n raport n banda............................ 6. Pentru a obine n urma exportului dintr-un tabel un fiier text n care cmpurile sunt separate prin tabulatori folosii clauza............................. 7. Putei introduce o imagine ntr-un cmp de tip General folosind .................... Rspundei: 1. Ce este o interogare a bazei de date? 2. Ce este o vizualizare a bazei de date?
R spunsuri:
Adevrat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-A; 7-F. Completai: 1-comand SQL; 2-tabel; 3-do; 4-generatorul de rapoarte; 5-Detail; 6-delimited with tab; protocolul OLE.
165
8. Tablouri de memorie
Visual FoxPro permite crearea i manipularea structurilor de date de tip tablou de memorie care, n acest sistem au urmtoarele caracteristici: 9 Se pot crea numai tablouri cu o singur dimensiune (vectori) sau cu dou dimensiuni (matrice). 9 Tablourile de memorie Visual FoxPro sunt tablouri neomogene. 9 La creare, elementele tabloului sunt iniializate cu valoarea logic .F. 9 La un moment dat, n memoria intern gestionat de Visual FoxPro se pot crea maxim 65.000 de tablouri de memorie, iar un tablou de memeorie poate avea 65.000 de elemente.
9 schimbarea dimensiunii: din vector n matrice i din matrice n vector; 9 mrirea (creterea numrului de elemente) sau micorarea (diminuarea numrului de elemente) tabloului.
5. Copierea unui tablou funcia acopy() 6. Sortarea unui tablou funcia asort() 7. Salvarea informaiilor ntr-un tablou const n salvarea:
coninutului unui director funcia adir() structurii unui tabel din baza de date (fiier .dbf) funcia afield()
166 Informatic
8.1.1. Crearea unui tablou de memorie:
Crearea unui tablou de memorie se face prin dou operaii: a. Definirea structurii cu ajutorul comenzilor declare/define. Comenzile au sintaxa: declare | define <nume_tablou1> (<expN11>[,<expN12>]) [,<nume_tablou2> (<expN21>[,<expN22>]) ....... ]
Numele tabloului de memorie Numrul de elemente dup prima dimensiune Numrul de elemente dup a doua dimensiune
Observaii: 9 Nu exist nici o diferen ntre comenzile declare i define (exist ambele comenzi pentru a crea compatibilitate cu versiunile anterioare de limbaje de comand specifice sistemelor de gestiune a bazelor de date compatibile dBase). 9 Printr-o comand pot fi definite mai multe tablouri de memorie identificate prin nume <nume_tablou1>, <nume_tablou2>, .... Tablourile definite pot fi att de tip vector, ct i de tip matrice. 9 Comenzile au un singur adverb: lista de tablouri de memorie care se definesc. Separarea tablourilor n list se face prin virgul. Pentru fiecare tabel se precizeaz numele i numrul de elemente dup o dimensiune, dac se definete un vector (<expN11>, <expN21>, ...), respectiv numrul de elemente dup dou dimensiuni, dac se definete o matrice (<expN11> i <expN12>, <expN21> i <expN22>, ...). Dup ce ai definit structura tabloului, putei identifica orice element din tablou astfel: pentru vectori : <nume_tablou>(<expN>), unde <expN> reprezint numrul de ordine al elementului n cadrul vectorului; pentru matrice : <nume_tablou>(expN1,<expN2>), unde identificarea elementului se face prin numrul liniei <expN1> i numrul coloanei <expN2>. Elementele unei matrice se pot identifica i prin numrul de ordine. innd cont c n Visual FoxPro o matrice se memoreaz n ordinea liniilor i dac notm cu n numrul de linii ale matricei, cu m numrul de coloane, iar cu i i j cei doi indici ai unui element, atunci numrul de ordine al unui element va fi m(i-1)+j. b. Atribuirea de valori elementelor se poate face n dou moduri: Se atribuie aceeai valoare tuturor elementelor cu ajutorul comenzii store care are sintaxa: store <exp> to <nume_tablou> Se atribuie cte o valoare fiecrui element folosind operaia de atribuire: <element_tablou>= <exp> sau comanda store care are sintaxa: store <exp> to <element_tablou>
167
Numele funciilor folosite pentru operaii cu tablouri de memorie ncep cu litera a (array).
168 Informatic
Poziia unui element din tablou, identificat prin numrul liniei i numrul coloanei se obine cu ajutorul funciei aelement() care are sintaxa: aelement(<nume_tablou>,<expN1>[,<expN2>] , unde <expN1> i <expN2> sunt indicii elementului (numrul liniei i numrul coloanei). Funcia furnizeaz un rezultat numeric care reprezint numrul de ordine al elementului n cadrul structurii.
?
Ce valoare va furniza funcia aelement() dac argumentul <expN1> este mai mare dect numrul de linii, iar argumentul <expN2> este mai mare dect numrul de coloane ale unei matrice?
Numrul liniei sau al coloanei unui element din tablou (adic unul dintre indicii ele-mentului), identificat prin poziia sa n cadrul tabloului, se obine cu ajutorul funciei asubscript() care are sintaxa: asubscript(<nume_tablou>,<expN1>,<expN2>), unde prin <expN1> se precizeaz poziia elementului i prin expresia <expN2>, ceea ce dorii s aflai. Funcia furnizeaz un rezultat numeric care reprezint ? pentru vectori numrul de ordine al elementului, iar pentru matrice 1. Ce valoare va furniza funcia asubscript() dac pentru un vector se furnizeaz numrul liniei (primul indice) dac argumentul <expN2>? <expN2> are valoarea 1 sau numrul 2. Ce valoare va furniza funcia asubscript() coloanei (al doilea indice) dac dac pentru o matrice argumentul <expN2> are valoarea 2. Cutarea unui element din tablou mai mare dect 2? care are o valoare precizat se face cu funcia ascan(): ascan(<nume_tablou>,<exp>[,<expN1>[,<expN2>]]), unde <exp> este expresia prin care se specific valoarea cutat. Ea poate fi de orice tip (numeric, ir de caractere, logic, dat calendaristic). Funcia furnizeaz un rezultat numeric care reprezint numrul de ordine al elementului care are valoarea precizat. Dac nici un element nu are aceast valoare, rezultatul furnizat va fi 0. Implicit cutarea se face prin toate elementele tabloului. Explicit se caut numai printre elementele care ncep din poziia precizat cu argumentul <expN1> i pn la elementul din poziia precizat cu argumentul <expN2>.
<expN2> are valoarea 0 sau o valoare
169
b. tergerea unui element (pentru vectori) sau a unei linii/coloane (pentru matrice) se face folosindu-se funcia adel(): adel(<nume_tablou>,<expN>[,2]) , unde argumentele i rezultatul furnizat au aceeai semnificaie ca i la funcia ains(). Funcia nu modific dimensiunea tabloului. Elementele care urmeaz poziiei, respectiv liniei sau coloanei terse vor fi deplasate spre nceputul tabloului, iar ultimul element, respectiv ultima linie sau coloan va fi inializat cu valoarea .F..
170 Informatic
redimensionat corespunztor. Matricea va avea un numr de linii egal cu numrul de fiiere i directoare (dosare=foldere) nregistrate n director i 5 coloane, corespunztoare celor 5 caracteristici ale unui fiier sau director: nume fiier (tip ir de caractere), dimensiune fiier (tip numeric), data ultimei actualizri (tip dat calendaristic), timpul ultimei actualizri (tip ir de caractere) i atribute (tip ir de caractere). Atributele fiierelor sau directoarelor pot fi: A - arhivat, H - ascuns, R - protejat la scriere, S - sistem, D - director. Implicit pot fi salvate informaii despre toate fiierele i dosarele nregistrate. Explicit vor fi salvate informaii numai despre fiierele care pot fi identificate prin ablonul descris cu argumentul <expC1> sau fiierele care au atributele precizate prin argumentul <expC2>: 'D' - numai directoare, 'H' - numai fiierele ascunse, 'S' - numai fiierele sistem, 'V' - n primul element al tabloului va fi nregistrat eticheta volumului de disc pe care se gsete directorul curent. Funcia furnizeaz un rezultat numeric care reprezint numrul de fiiere i dosare inventariate. b. Structura tabelului baz de date activ poate fi salvat ntr-un tablou de memorie de tip matrice folosind funcia afields(): afields(<nume_tablou>) . Salvarea se face n tabloul precizat prin argumentul <nume_tablou>. Aceast matrice are o structur bine definit i dac nu a fost creat anterior, va fi creat de funcie, iar dac exist va fi redimensionat corespunztor. Matricea va avea un numr de linii egal cu numrul de cmpuri din tabel i 11 coloane, corespunztoare caracteristicilor ale unui cmp: nume cmp (tip ir de caractere), tip cmp (tip ir de caractere), lungime cmp (tip numeric), numr poziii zecimale (tip numeric), regula de validare (tip ir de caractere), .... . Funcia furnizeaz un rezultat numeric care reprezint numrul de cmpuri.
8.3. Transferul datelor ntre variabile de memorie sau tablouri de memorie i un tabel al bazei de date
Se pot transfera date n ambele sensuri ntre memoria intern (variabile de memorie sau tablouri de memorie) i memoria extern (fiiere cu tabelele bazei de date). Astfel: variabile de memorie tabel din baza de date : a. variabil de memorie cmp memo din tabel Save to memo memoria intern
(variabil de memorie)
memoria extern
(cmp memo din tabel)
171
memoria extern
(cmpuri dintr-o nregistrare din tabel)
Scatter
memoria extern
(tabel din baza de date)
Scatter Copy to array Observaie: Comanda Copy to array cere ca tabloul s fie creat anterior spre deosebire de comanda Scatter care i creeaz singur tabloul de memorie. Sintaxa comenzilor: a. Comanda save to: salveaz variabilele de memorie i tablourile descrise prin <sablon> ntr-un fiier pentru variabile de memorie (extensia .mem) specificat prin <nume_fisier> sau ntr-un cmp memo al tabelului activ specificat prin clauza to memo i identificat prin nume <nume_cmp>: save to <nume_fisier>| to memo <nume_cmp> [all like | except <sablon>] b. Comanda restore from: restaureaz variabilele de memorie i tablourile dintr-un fiier pentru variabile de memorie specificat prin <nume_fisier> sau ntr-un cmp memo al tabelului activ specificat prin clauza to memo i identificat prin nume <nume_cmp>: restore from <nume_fisier>| to memo <nume_cmp> [additive] c. Comanda scatter copiaz datele din cmpurile nregistrrii curente ale ta? belului activ ntr-un tablou de memorie 1. n ce ordine se copiaz datele din identificat prin <nume_tablou> sau ntrcmpurile tabelului n tabloul de memorie? un set de variabile de memorie, caz 2. Ce se ntmpl dac numrul de cmpuri specificat prin clauza memvar. care trebuie copiate este mai mare dect Variabilele de memorie vor avea numrul de elemente din tabel? acelai nume ca i cmpurile care se copiaz. Implicit se copiaz toate cmpurile, mai puin cmpurile memo. Explicit se pot
172 Informatic
copia numai cmpurile din lista de cmpuri a clauzei fields i se pot copia i cmpurile memo dac se precizeaz clauza memo. Clauza blank semnific faptul c se creeaz tabloul de memorie, respectiv setul de variabile de memorie de acelai tip i lungime ca i cmpurile, dar n loc s se transfere n ele datele din cmpuri, acestea vor fi vide. scatter [fields <list_cmpuri>] [memo] to <nume_tablou> | to <nume_tablou> blank | memvar | memvar blank d. Comanda gather copiaz n cmpurile nregistrrii curente a tabelului activ, datele dintrun tablou de memorie identificat prin <nume_tablou> sau dintr-un set de variabile de memorie, caz specificat prin clauza memvar. Variabilele de memorie trebuie s aib acelai nume ca i cmpurile. Ele pot fi create cu comanda scatter memvar blank, dup care li se pot atribui valori. Dac pentru un cmp nu exist o variabil de memorie cu acelai nume, cmpul rmne neschimbat. Copierea dintr-un tablou de memorie se face secvenial, n fiecare cmp copiindu-se un element al tabloului, pn cnd se termin elementele din tablou sau pn cnd se termin cmpurile din nregistrare. Implicit transferul se face n toate cmpurile, mai puin cmpurile memo. Explicit transferul se poate face numai n cmpurile precizate n lista de cmpuri a clauzei fields i se pot copia i cmpurile memo dac se precizeaz clauza memo. gather from <nume_tablou> | memvar [fields <list_cmpuri>] [memo] e. Comanda copy to array ncarc ntr-un tablou de memorie creat anterior, identificat prin <nume_tablou>, datele din cmpurile tabelului activ. Dac tabloul este de tip vector, se copiaz numai cmpurile din nregistrarea curent, iar dac tabloul este de tip matrice, se ncarc n fiecare linie a matricei cmpurile dintr-o nregistrare. Dac exist mai multe elemente dect cmpuri, restul elementelor rmne neschimbat, iar dac exist mai multe cmpuri dect elemente, cmpurile care nu mai ncap nu se copiaz. Dac exist mai multe linii dect nregistrri, restul de linii rmne neschimbat, iar dac exist mai multe nregistrri dect linii, nregistrrile care nu mai ncap nu se copiaz. Implicit se transfer toate cmpurile dintr-o nregistrare. Explicit se transfer numai n cmpurile precizate n lista de cmpuri a clauzei fields. Implicit se transfer toate nregistrrile din tabelul activ. Explicit se transfer numai nregistrrile precizate prin <domeniu> sau clauzele for sau while. copy to array <nume_tablou> [fields <list_cmpuri>] [<domeniu>] [for <expL1>][while < expL2>][<nooptimize>] f. Comanda append from array adaug la sfritul tablelului activ nregistrri cu date preluate dintr-un tablou de memorie identificat prin <nume_tablou>. Dac tabloul de memorie este de tip vector, se adaug o singur nregistrare astfel: dac exist mai multe elemente dect cmpuri, restul elementelor din tablou sunt ignorate, iar dac sunt mai multe cmpuri dect elemente, restul cmpurilor se inializeaz cu elementul neutru pentru acel tip de dat. Dac tabloul este de tip matrice, se copiaz n cte o nregistrare cte o linie a matricei. Linia matricei este tratat la fel ca un tablou de tip vector. Implicit se transfer date n toate cmpurile nregistrrii. Explicit se transfer numai n cmpurile precizate n lista de cmpuri a clauzei fields. Implicit se transfer toate liniile din tablou. Explicit se transfer numai liniile precizate prin clauza for. Dac tipul elementului din tablou nu corespunde cu tipul cmpului n care se transfer, se ncearc transformarea acelui tip de dat, care poate s reueasc sau nu. De exemplu, o dat de tip numeric, logic sau dat calendaristic poate fi transformat ntr-o dat de tip ir de caractere, iar o
173
dat de tip dat calendaristic poate fi transformat ntr-o dat de tip numeric. O dat de tip ir de caractere nu poate fi transformat ntr-o dat de tip numeric, iar o dat de tip numeric nu poate fi transformat ntr-o dat de tip dat calendaristic. append from array <nume_tablou> [fields <list_cmpuri>] [for <expL>]
Creai tablouri de memorie 1. Creai dou structuri de date - a de tip vector i b de tip matrice, ambele cu 10 elemente:
declare a(10), b(2,5)
2. Afiai valoarea tuturor elementelor din tablouri folosind comanda display memory.
display memory like a display memory like b
b(1,3)=date() b(1,4)=.T. b(1,5)=datetime() b(2,1)=10 b(2,2)=20 b(2,3)=30 b(2,5)=50 display memory like b store 0 to a display memory like a
5. Redimensionai tablourile:
declare a(8) display memory like a dimension a(2,4) display memory like a dimension a(2,5) display memory like a elementele a(2,4) i a(2,5) au valoarea .F. dimension a(10) dimension b(2,8) display memory like b ultimele 6 elemente au valoarea .F. (ca i cum b ar fi un vector)
Observai c informaia este afiat sub forma unui tabel - pe fiecare linie se afieaz informaii despre un element, iar pe fiecare coloan cte un tip de informaie: valoarea indicelui sau valorile indicilor, tipul datei din element, valoarea datei i, pentru datele numerice, i reprezentarea intern a valorii. Iniial toate elementele tablourilor create au valoarea logic .F.. 3. Afiai valoarea unor elemente din tablouri:
? a(5) .F. ? b(2,4) .F.
4. Atribuii valori elementelor din tablourile create i verificai modul n care s-au executat operaiile de atribuire:
b(2,4)=40 ? b(2,4) 40 ? b(9) 40 b(1,1)='azi' b(1,2)='maine'
174 Informatic
3 ? aelement(b, asubscript(b,11,1), asubscript(b,11,2)) 11 ? ascan(b,40) 9 ? asubscript(b, ascan(b,40),1) 2 ? asubscript(b, ascan(b,40),2) 1 ? ascan(b,'azi') 1 ? ascan(b,'zi') 0 ? ascan(b,date()) 3 ? ascan(b,.T.) 4 b(2,1)=10 b(2,2)=20 b(2,3)=30 b(2,4)=40 b(2,5)=50 ? adel(b,3,2) 1 display memory like b a fost tears coloana 3 i elementele din ultima coloan b(1,5) i b(2,5) - au valoarea .F. ? ains(b,3,2) 1 display memory like b a fost inserat coloana 2 i elementele din aceast coloan -b(1,3) i b(2,3)- au valoarea .F. b(1,3)=date() b(2,3)=30
175
i dup coloana n care se gsete acest element - coloana 3; elementele matricei a sunt: 25 20 15 10 5 0 300 400 100 50 40 30
176 Informatic
declare w(5,3) copy to array w fields c1, c2, c3 display memory like w ? asort(w,2) 1 display memory like w zap append from array w for c2>400 list
12. Transferai date ntre tabele ale bazei de date i tablouri de memorie. Pentru aceasta deschidei tabelul Sedinte din baza de date Compania. Copiai cmpurile nr_s, id_cont, id_ang, cost_s ntr-un tabel de memorie i sortai aceste
177
12. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane. Afiai coninutul matricei. 13. Comparai numrul de linii ale matricei a cu variabila de memorie ak1. Comparai numrul de coloane ale matricei a cu variabila de memorie ak2. Comparai numrul de elemente ale matricei a cu variabila de memorie al. 14. Afiai valoarea elementului 9 din matricea a. Afiai valoarea elementului 10 din matricea a. 15. Transformai matricea a ntr-un vector cu 10 elemente. 16. Refacei datele din matricea iniial a. 17. Sortai descresctor vectorul a. Afiai coninutul vectorului sortat. 18. Transformai vectorul a ntr-o matrice cu 2 linii i 4 coloane. Afiai coninutul matricei. 19. Sortai creasctor matricea a dup coloana 3 ncepnd cu prima linie. Afiai coninutul acestei matrice. 20. Transformai matricea a ntr-un vector cu 10 elemente. Afiai coninutul acestui vector. 21. Sortai cresctor vectorul a. Afiai coninutul acestui vector. 22. Creai printr-o singur comand structura vectorului c cu 5 elemente i a vectorului d cu 2 elemente. 23. Folosind datele din matricea a, atribuii elementelor din vectorul c valorile 6, 7, ..., 10, iar elementelor din vectorul d valorile 3 i 8. Afiai coninutul celor doi vectori. 24. Transformai vectorul a ntr-o matrice cu 3 linii i 5 coloane. Afiai coninutul matricei. 25. tergei linia 2 a matricei a. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane. Afiai coninutul acestei matrice. 26. Transformai matricea a ntr-o matrice cu 2 linii i 6 coloane. Afiai coninutul acestei matrice. Inserai o coloan vid n coloana 3. Afiai coninutul acestei matrice. 27. Transformai matricea a ntr-o matrice cu 2 linii i 5 coloane. Refacei matricea iniial a. Afiai coninutul matricei. Inserai o coloan vid n coloana 3. Afiai coninutul matricei. 28. tergei coloana 3 din matricea a. Afiai coninutul matricei a. 29. Cutai valoarea 6 n matricea a. Cutai valoarea 8 n vectorul c. 30. Refacei matricea iniial a. Cutai valoarea 6 n matricea a. 31. Creai structura a doi vectori cu 5 elemente: a1 i a2. 32. Copiai n vectorul a1 prima linie din matricea a. 33. Copiai n vectorul a2 a doua linie din matricea a. 34. Afisai printr-o singur comand coninutul vectorilor a1 i a2 i al matricei a. 35. Salvai vectorii a1 i a2 i matricea a n fiierul fa. 36. tergei din memoria intern vectorii a1 i a2 i matricea a. 37. Afiai coninutul vectorilor a1 i a2 i al matricei a. 38. Refacei n memoria intern vectorii a1 i a2 i matricea a prin preluare din fiierul fa. 39. Afiai coninutul vectorilor a1 i a2 i al matricei a. 40. tergei coninutul memoriei interne. 41. Deschidei tabelul Incasari din baza de date Compania. Pstrai n variabila x numrul de nregistrri din tabel. 42. Copiai din acest tabel, ntr-un tablou de memorie cu trei coloane, cmpurile nr_i, id_cont, valoare. Vizualizai datele din tabloul de memorie. 43. Sortai acest tabel dup valoarea cmpului valoare. Vizualizai datele sortate. 44. Adugai aceste date la sfritul tabelului. Vizualizai datele adugate. 45. tergei datele adugate. nchidei tabelul i baza de date. Eliberai memoria intern.
178 Informatic
ncercai:
Adevrat/Fals: 1. n Visual FoxPro tablourile de memorie sunt omogene. 2. Un element al unei matrice Visual FoxPro poate fi identificat dup numrul su de ordine. 3. Dac transformai un vector ntr-o matrice, datele se pierd. 4. n Visual FoxPro se pot defini tablouri de memorie cu trei dimensiuni. 5. nregistrarea n memoria intern a elementelor unei matrice se face linie dup linie. Completai: 1. Structura tabelului activ se poate salva ntr-o matrice folosind funcia ................ 2. Funcia alen(a,2) furnizeaz ............................... ale matricei a. 3. Prin comanda de definire a structurii unui tablou de memorie elementele sunt iniializate cu valoarea .......... 4. Pentru a terge a doua coloan dintr-o matrice a folosii funcia .................... Alegei rspunsul corect: 1. Pentru copierea elementelor unui tablou de memorie ntr-un alt tablou de memorie folosii: a) funcia acopy() b) comanda copy to array c) comanda append from array c) coloanele
3. Elementul inserat ntr-un vector va avea valoarea: a) .T. b) .F. c) NULL pentru acel tip de dat 4. Pentru a cuta un element al tabloului de memorie care are o valoare precizat, folosii funcia: a) afind() b) afilds() c) ascan() 5. Putei ncrca ntr-un vector cmpurile din nregistrarea curent a tabelului activ cu ajutorul comenzii: a) restore from b) copy to array c) scatter 6. Putei ncrca n cmpurile din nregistrarea curent a tabelului activ datele din elementele unui vector folosind comanda: a) save to b) gather c) append from array Rspundei: 1. Caracterizai structura de date de tip tablou de memorie din Visual FoxPro. 2. Ce operaii se pot executa cu tablourile de memorie? 3. Ce operaii de transfer se pot executa ntre datele din memoria intern i datele din memoria extern.
R spunsuri:
Adevrat/Fals: 1-F; 2-A; 3-F; 4-F; 5-A. Completai: 1-afields(); 2-numrul de coloane; 3-.F.; 4- adel(a,2,2). Alegei rspunsul corect: 1) a; 2) b; 3) b;4) c;5) b,c; 6) b.
Capitolul
Pentru exploatarea unei baze de date, utilizatorul nu interacioneaz direct cu baza de date sau cu sistemul de gestiune al bazei de date, ci cu un software de aplicaie. Rolul acestuia este de a folosind elementele programrii clasice. prezenta informaiile din baza de date ntr-o form 4. Ce metode putei folosi pentru i n termeni accesibili utilizatorului. Utilizatorul construirea interfeei unei aplicaii. interacioneaz cu aplicaia prin intermediul inter5. Cum putei construi interfaa unei feei. Aadar, partea vizibil a oricrei aplicaii aplicaii folosind programarea cu care interacioneaz utilizatorul este interorientat pe obiecte. faa. Din punctul de vedere al utilizatorului, apli6. Cum putei construi interfaa aplicaiei cu ajutorul obiectelor vizuale. caia nseamn de fapt interfaa ei. Pentru el nu conteaz instruciunile care se gsesc n spatele ei i nici efortul consumat de programator pentru a scrie i a optimiza codul programului. Pentru utilizator conteaz modul n care exploateaz aplicaia, adic interfaa i informaiile pe care le obine prin intermediul acestei interfee.
FoxPro.
1. Cum putei crea o aplicaie Visual 2. Cum putei modulariza aplicaia. 3. Cum putei dezvolta o aplicaie
Pentru crearea unei aplicaii, sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziia programatorului dou metode de programare: 9 Programarea clasic n care rezolvarea unei probleme se face cu ajutorul algoritmilor descrii prin cele trei structuri de control: structura secvenial, structura alternativ i structura repetitiv. Ea este orientat pe prelucrarea datelor. Folosind aceast metod, programatorul trebuie s construiasc un program care este format din ansamblul de date i algoritmul folosit pentru descrierea problemei. Algoritmul este implementat n calculator cu ajutorul instruciunilor puse la dispoziie de limbajul de programare.
180 Informatic
9 Programarea orientat pe obiecte n care rezolvarea problemei se face cu ajutorul obiectelor. Ea este orientat pe definirea obiectelor. Folosind aceast metod, programatorul trebuie s construiasc obiecte care sunt formate din date i procedurile care prelucreaz aceste date.
Aceeai problem poate fi rezolvat cu oricare dintre cele dou metode. Metoda programrii pe obiecte are ns urmtoarele avantaje: permite un control mai bun al programelor (n special al programelor de dimensiuni mari) i permite o mai uoar dezvoltare a programelor. n schimb, programarea clasic asigur compatibilitatea cu programele scrise ca aplicaii pentru versiunile anterioare ale sistemului de gestiune a bazelor de date FoxPro. Pe lng cele dou metode de programare Visual FoxPro pune la dispoziia utilizatorului instrumente vizuale pe care le poate folosi pentru a realiza interfaa aplicaiei. Aplicaia Visual FoxPro cuprinde, pe lng fiierele surs sau cu module obiect ale programelor i ale bibliotecilor de subprograme, i alte fiiere care concur la realizarea interfeei i la obinearea informaiilor, cum sunt de exemplu fiierele cu formularele folosite pentru introducerea datelor, fiierele pentru formatul rapoartelor, fiierele pentru interogri etc. Toate aceste elemente necesare la realizarea unei aplicaii pot fi organizate ntr-un proiect care s permit o mai bun gestionarea a lor din punct de vedere al programatorului. Pentru a proteja aceste elemente mpotriva unor modificri neautorizate, proiectul poate genera un fiier executabil independent de mediul Visual FoxPro.
181
{atribuie variabilei de memorie c valorea obinut prin nsumarea valorilor din cmpul numeric camp1 al tabelului activ} {atribuie variabilei de memorie d valorea obinut prin numrarea nregistrrilor din tabelul activ}
Pe parcursul unui program, acelai identificator de dat poate s defineasc tipuri diferite de date. De exemplu, n acelai program se pot ntlni comenzile: store 0 to a {se creeaz variabila de memorie a de tip numeric prin atribuirea ........................... unei valori numerice} a=date() {se creeaz variabila de memorie a de tip dat calendaristic prin ........................... atribuirea valorii unei funcii de tip dat calendaristic} accept 'a=' to a {se creeaz variabila de memorie a de tip ir de caractere prin atribuirea irului de caractere introdus de la tastatur} n general, pentru marea majoritate a comenzilor nu este necesar ca variabilele de memorie s fie definite anterior comenzii (de exemplu comenzile de atribuire sau comenzile care permit redirectarea unor valori de pe ecran ntr-o variabil de memorie folosind clauza to: accept, input, sum, count etc. creeaz ele nsele variabila de memorie).
182 Informatic
Din aceast cauz, n fereastra de editare fiecare comand se va scrie pe cte un rnd: <verb1> <list_adverbe_1> enter <verb2> <list_adverbe_2> enter instruciune ....................................................... Dac dorii s scriei o comand pe mai multe rnduri, pentru a arta c ea continu pe rndul urmtor, la sfritul liniei, nainte de a aciona tasta enter scriei caracterul punct i virgul ( ; ), astfel: <verb> < adverb_1> ; enter < adverb_2> ; enter < adverb_3> enter sfrit de comand Atenie: urmtoarele linii ale comenzii nu se scriu din prima coloan.
cu numr cunoscut de pai structura repetitiv cu numr necunoscut de pai, condiionat anterior pentru parcurgerea nregistrrilor dintr-un tabel Observaii:
1. Spre deosebire de limbajele clasice de programare, n limbajul gazd FoxPro este implementat o structur repetitiv specific acestui gen de aplicaie (scan ... endscan), care faciliteaz scrierea unui program ce exploateaz secvenial un tabel al bazei de date.
183
2. Nu este implementat structura repetitiv cu numr necunoscut de pai condiionat posterior (de tip repeat ... until).
note Programul este un exemplu pentru modul in care pot fi; folosite comentariile set talk off clear && Se sterge ecranul store 0 to x,y && Nu este obligatoriu sa se initializeze; aceste variabile de memorie ? 'Programul va furnizeaza un numar aleator intre x si y' ? 'Numerele x si y pot lua orice valoare ntre 0 si 999' * Se introduc de la tastatura valorile pentru x si y input 'x= ' to x input 'y= ' to y note Se initializeaza generatorul de numere aleatoare =rand(-1) && Comanda = evalueaza una sau mai multe expresii preci-; zate printr-o lista scrisa n dreapta caracterului =; n exemplu se evalueaza functia rand(-1)) z=x+(y-x)*rand() && se calculeaza valoarea z (numar aleator) ? 'Numarul este: '+str(z,8,4) wait 'Actionati orice tasta pentru continuare' clear return
184 Informatic
1.2.2. Structura alternativ
Prin aceast structur se execut condiionat o anumit secven de instruciuni, n funcie de valoarea unei condiii logice. Limbajul gazd FoxPro permite folosirea a dou tipuri de structuri alternative: a. Structura alternativ simpl Structura alternativ simpl permite executarea unei aciuni (descris printr-o secven de instruciuni: <secven-instruciuni-1> sau <secven-instruciuni-2>) din dou aciuni posibile, n funcie de valoarea unei condiii exprimate printr-o expresie logic (<expL>): if <expL> <secven-instruciuni-1> else <secven-instruciuni-2> endif Observaii: 1. Cuvintele cheie if i endif delimiteaz structura, iar cuvntul else marcheaz nceputul secvenei de instruciuni care descrie activitatea ce se execut dac expresia logic are valoarea fals. 2. Cuvntul cheie if mpreun cu condiia i cuvintele cheie else i endif se scriu fiecare pe cte un rnd. 3. Sunt permise structuri if ... endif imbricate. Dac sunt mai multe structuri alternative simple imbricate, else se refer la primul if care l precede. 4. Se pot construi i structuri alternative simple cu o ramur vid. Exemplu S se scrie un program pentru rezolvarea ecuaiei de gradul I cu coeficieni numere reale. Coeficienii a i b se introduc de la tastatur. Metoda 1
set talk off clear store 0 to a,b ? 'Programul va furnizeaza; solutia ecuatiei de gradul I' ? 'de forma a*x+b=0' input 'a= ' to a input 'b= ' to b if a=0 if b=0 ? 'Ecuatia are o infinitate; de solutii'
else ? 'Ecuatia este imposibila' endif else x=-b/a ? 'x= ',x endif wait 'Actionati orice tasta; pentru continuare' clear return
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor input 'a= ' to a input 'b= ' to b if a=0 and b=0 ? 'Ecuatia are o infinitate; de solutii' else if a=0 and b<>0 ? 'Ecuatia este imposibila' else
Metoda 3 (care folosete funcia iif())
185
x=-b/a ? 'x= ',x endif endif wait 'Actionati orice tasta; pentru continuare' clear return
set talk off clear store 0 to a,b ? 'Programul va furnizeaza solu-; tia ecuatiei de gradul I' ? 'de forma a*x+b=0' input 'a= ' to a input 'b= ' to b
b. Structura alternativ generalizat
? iif(a<>0, -b/a,iif(b<>0, 'Ecuatia este imposibila',; 'Ecuatia are o infinitate de; solutii')) wait 'Actionati orice tasta; pentru continuare' clear return
Structura alternativ generalizat permite executarea unei singure aciuni din mai multe aciuni posibile (descrise prin secvenele de instruciuni: <secven-instruciuni-1>, <secven-instruciuni-2>, ..., <secven-instruciuni-n+1>). Stabilirea aciunii care urmeaz s se execute se face n urma evalurii unei condiii care poate lua mai multe valori exprimate prin expresiile logice (<expL1>, <expL2>, ..., <expLN>): do case case <expL1> <secven-instruciuni-1> case <expL2> <secven-instruciuni-2> .............................................. case <expLi> <secven-instruciuni-i> ............................................. case <expLn> <secven-instruciuni-n> [otherwise <secven-instruciuni-n+1>] endcase Observaii: 1. Cuvintele cheie do case i endcase delimiteaz structura, iar cuvintele cheie case marcheaz nceputul unui caz care urmeaz s fie tratat (condiia logic ce trebuie evaluat i secvena de instruciuni care descrie activitatea ce se va executa atunci cnd condiia logic are valoarea adevrat). Cuvntul cheie otherwise mpreun cu secvena de instruciuni <secven-instruciuni-n+1> sunt opionale i reprezint aciunea care se va
186 Informatic
executa atunci cnd nici una dintre expresiile logice din cazurile prezentate nu au avut valoarea adevrat. 2. Cuvntul cheie case mpreun cu condiia i cuvintele cheie do case, otherwise i endcase se scriu fiecare pe cte un rnd. 3. Se accept ntr-o structur do case ... endcase structuri alternative sau structuri repetitive cu condiia ca aceste structuri s fie incluse complet n interiorul unui case sau otherwise. 4. Structura alternativ generalizat do case ... endcase poate fi echivalat cu mai multe structuri alternative simple if ... endif imbricate: if <expL1> <secvena-instruciuni-1> else if <expL2> <secvena-instruciuni-2> else if <expLn> <secvena-instruciuni-1> else ...................................... if <expLn> <secvena-instruciuni-n> else <secvena-instruciuni-n> endif ...................................... endif endif endif Mod de executare a instruciunii: 1. Se evalueaz pe rnd expresiile logice <expL1>, <expL2>, <expL3>, ... i <expLn>. Cnd se ntlnete prima expresie care are valoarea adevrat, se execut secvena de instruciuni cuprins ntre condiia logic i apariia unuia dintre cuvintele cheie case, otherwise sau endcase. 2. Dup ce s-a ntlnit un caz adevrat i s-au executat instruciunile corespunztoare cazului, celelalte cazuri nu vor mai fi tratate i se va trece la executarea primei instruciuni aflate dup cuvntul cheie endcase. 3. Dac nici una dintre expresiile logice evaluate nu a avut valoarea adevrat, se execut secvena de instruciuni delimitat de cuvintele cheie otherwise i endcase, dac exist sau, n caz contrar, prima instruciune aflat dup cuvntul cheie endcase. Recomandare: Se recomand folosirea instruciunii do case ... endcase n locul instruciunii if ... endif n urmtoarele cazuri: 1. Din mai multe cazuri unul singur poate fi adevrat. 2. Din mai multe condiii numai prima gsit adevrat trebuie executat. 3. Exist un numr mic de excepii la o anumit condiie. n acest caz excepiile vor fi puse n eviden prin case <expL>, iar situaia obinuit prin otherwise.
187
S se scrie un program pentru rezolvarea ecuaiei de gradul I folosind structura repetitiv generalizat pornind de la metoda folosirii structurilor alternative simple imbricate: set talk off case a=0 and b<>0 clear ? 'Ecuatia este imposibila' ? 'Programul va furnizeaza; otherwise solutia ecuatiei de gradul I' x=-b/a ? 'de forma a*x+b=0' ? 'x= ',x input 'a= ' to a endcase input 'b= ' to b wait 'Actionati orice tasta; do case pentru continuare' case a=0 and b=0 clear ? 'Ecuatia are o infinitate; return de solutii'
Loop - foreaz reevaluarea condiiei de terminare a structurii repetitive printr-un salt la nceputul structurii (n cazul unei structuri repetitive cu numr cunoscut de pai, nainte de evaluarea condiiei produce i incrementarea contorului). Exit - foreaz abandonarea structurii repetitive indiferent de rezultatul evalurii condiiei de terminare printr-un salt la prima instruciune care urmeaz dup terminarea structurii repetitive.
endfor
Instruciunile loop i exit se vor folosi ntr-o structur alternativ din interiorul structurii repetitive. n limbajul FoxPro sunt implementate urmtoarele tipuri de structuri repetitive: a. Structura repetitiv cu numr cunoscut de pai
Permite executarea repetat a unei secvene de instruciuni de un numr specificat de ori. Pentru a numra de cte ori s-a executat secvena de instruc-iuni se folosete variabila de memorie <contor> care va avea valoarea iniial precizat prin <expN1> la nceperea executrii repetate a secvenei de instruciuni. Aceast variabil va trebui s aib valoarea precizat prin <expN2> pentru a se termina executarea repetat a secvenei de instruciuni. Dup fiecare executare a secvenei de instruciuni, variabila contor este incrementat implicit cu valoarea 1 sau, dac se precizeaz clauza step, cu valoarea <expN3>. Sintaxa instruciunii este:
188 Informatic
for <contor>=<expN1> to <expN2> [step <expN3>] <secven-instruciuni> endfor | next Observaie: 1. Cuvntul cheie for marcheaz nceputul structurii, iar cuvntul cheie endfor (sau cuvntul cheie next) marcheaz sfritul structurii. Cuvintele cheie for i to delimiteaz operaia de atribuire prin care se face iniializarea contorului, cuvntul to precede valoarea final a contorului, iar cuvntul step precede valorea cu care se incrementeaz contorul. 2. Cuvntul cheie for mpreun cu expresiile i cuvintele cheie to i step se scriu pe acelai rnd. Cuvntul cheie endfor, respectiv next se scrie pe un singur rnd. 3. Variabila de memorie <contor> trebuie definit naintea structurii for ... endfor ca variabil de tip numeric ntreg printr-o operaie de atribuire. Exemplu: S se calculeze suma a n numere introduse de la tastatur. set talk off clear store 0 to suma,i ? 'Programul calculeaza suma a n; numere introduse de la tastatura' input 'n= ' to n for i=1 to n input 'a= ' to a de la tastatur. Valoarea lui n se introduce
suma=suma+a endfor ? 'Suma = ', suma wait 'Actionati orice pentru continuare' clear return
tasta;
b. Structura repetitiv cu numr necunoscut de pai condiionat anterior Permite executarea repetat a unei secvene de instruciuni att timp ct o condiie exprimat printr-o expresie logic <expL> are valoarea adevrat. Sintaxa instruciunii este: do while <expL> <secven-instruciuni> enddo Observaii: 1. Cuvntul cheie while marcheaz nceputul structurii iar cuvntul cheie enddo sfritul ei. 2. Cuvntul cheie while mpreun cu expresia logic i cuvntul cheie enddo se scriu fiecare pe cte un rnd. Exemplu: S se calculeze media aritmetic a unor numere introduse de la tastatur. Utilizatorul programului este ntrebat de fiecare dat dac mai dorete s introduc un numr. Operaia se termin atunci cnd acesta rspunde c nu mai dorete continuarea operaiei de introducerea numerelor.
<expL> iniializare
do while .F.
189
set talk off clear store 0 to suma,i ? 'Programul calculeaza media aritmetica a numerelor ' ? 'introduse de la tastatura' accept 'Doriti sa introduceti primul numar? (d/n) ' to rasp do while .T. do case case rasp$'Dd' input 'a= ' to a suma=suma+a i=i+1 accept 'Mai doriti sa introduceti un numar? (d/n) ' to rasp case rasp$'Nn' exit otherwise ? 'Ati raspuns gresit' accept 'Mai doriti sa introduceti un numar? (d/n) ' to rasp endcase enddo if i<>0 media=suma/i ? 'Media = ', media else ? 'Nu ati introdus nici un numar si nu se poate calcula media' endif wait 'Actionati orice tasta pentru continuare' clear return
Exemplu: n tabelul Sedinte din baza de date Compania s se numere edinele care au avut o valoare mai mare dect o valoare precizat, care se va introduce de la tastatur. S se afieze numrul acestor edine i ce procent reprezint ele din totalul edinelor. set talk off endif clear k=k+1 store 0 to k skip ? 'Programul evalueaza valoarea; enddo sedintelor' ? str(k,3)+' sedinte ' au o va-; input 'Introduceti valoarea de; loare mai mare de '+str(val,8) referinta: ' to val ? 'si reprezinta '+; open database compania str(((k/reccount())*100),5,2); use sedinte +'% din total sedinte' do while .T. wait 'Actionati orice tasta; if eof() pentru continuare' exit clear endif use if cost_s<val close databases skip return loop
190 Informatic
c. Structura repetitiv pentru parcurgerea nregistrrilor dintr-un tabel Permite parcurgerea secvenial a nregistrrilor dintr-un tabel, excutnd o secven de instruciuni. Secvena de instruciuni acioneaz implicit asupra tuturor nregistrrilor din tabel. Explicit, ea se poate executa condiionat numai asupra nregistrrilor care aparin unui domeniu precizat prin clauza <domeniu> sau numai asupra nregistrrilor care ndeplinesc condiia precizat prin expresia logic <expL1> respectiv <expL2> din clauza for respectiv while. Sintaxa instruciunii este: scan [<domeniu>] [for <expL1>] [while <expL2>] <secven-instruciuni> endscan Observaie: 1. Cuvntul cheie scan marcheaz nceputul structurii, iar cuvntul cheie endscan sfritul structurii. 2. Cuvntul cheie scan (mpreun cu adverbele care use <tabel> precizeaz nregistrrile ce vor fi prelucrate) i cuvntul cheie endscan se scriu fiecare pe cte un rnd. 3. Forma implicit a instruciunii scan ... endscan este do while echivalent cu urmtoarea instruciune do while ... .F. enddo: not eof() goto top do while not eof() enddo <secven-instruciuni> .T. skip <secven-instruciuni> enddo 4. Forma implicit a instruciunii scan ... endscan este skip echivalent cu urmtoarea instruciune for ... endfor: goto top for i=1 to reccount() <secven-instruciuni> skip endfor Exemplu: S se afieze informaii despre edinele inute de un angajat al firmei de consultan. Identificatorul angaja-tului se introduce de la tastatur.
set talk off clear store 0 to tot_cost, tot_timp,k ? 'Programul furnizeaza informatii despre sedintele de ; consultanta ale unui angajat' input 'Introduceti identificatorul angajatului: ' to cod open database compania use sedinte ? 'Lista sedintelor angajatului '+str(cod,4) scan for id_ang=cod ? id_cont, data_s, timp_s, cost_s tot_cost=tot_cost+cost_s
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor tot_timp=tot_timp+timp_s k=k+1 endscan ? 'Total sedinte = '+str(k,3) ? 'Total valoare sedinte = '+str(tot_cost,9) ? 'Total timp sedinte = '+str(tot_timp,9) wait 'Actionati orice tasta pentru continuare' clear use close databases
191
192 Informatic
poate fi ncrcat n fereastra standard a editorului. Explicit aceast fereastr poate prelua caracteristicile ferestrei precizate prin clauza window <nume_fereastr_1>. Fereastra de editare este deschis implicit pe ecran i explicit ntr-o fereastr printe precizat prin clauza in [window] <nume_fereastr_2>.
Controlul compilrii
Putei controla compilarea folosind urmtoarele comenzi i funcii: 9 Putei salva mesajele de eroare obinute n urma compilrii ntr-un fiier de texte cu acelai nume ca i fiierul surs i cu extensia .err. Aceast facilitate este controlat de parametrul logerrors care trebuie s aib valoarea on. Valoarea parametrului poate fi stabilit cu comanda set logerrors care are sintaxa: set logerrors on | off 9 Putei construi capcane pentru erori. O capcan pentru erori oprete execuia programului atunci cnd apare o eroare i d controlul unei subrutine (subprogram sau program). Activarea i dezactivarea subrutinei se face cu comanda on errorr care are sintaxa: on error <comand> pentru activarea rutinei i on error pentru dezactivarea ei. Adverbul <comand> este o comand de apel a unui subprogram: do <nume_program>. Subprogramul poate fi scris n fiierul surs al programului (ca procedur) sau ntr-un fiier separat. Dup executarea subrutinei, programul va fi reluat cu instruciunea imediat urmtoare dup cea n care a aprut eroarea. n cadrul subrutinei de eroare pot fi obinute informaii despre eroare utiliznd ca parametri funciile: error(), message(), lineno() i program(): error() - furnizeaz numrul erorii detectate de capcana on error (rezultat numeric). message() - furnizeaz mesajul de eroare (fr parametru) sau coninutul liniei care a cauzat eroarea (dac se folosete parametrul 1). Rezultatul este de tip ir de caractere. lineno() - furnizeaz numrul relativ al liniei programului n curs de execuie (rezultat numeric). Se numr toate liniile, inclusiv liniile de comentarii i liniile vide.
193
Funcia poate fi utilizat pentru a crea puncte de ntrerupre (breakpoints), adic instruciuni la care s se opreasc execuia programului pentru a fi depanat. Ea permite oprirea programului la o linie specificat prin numrul su <expN>: lineno()=<expN>. program() - furnizeaz numele programului n execuie sau al programului care se executa cnd a aprut eroarea. Rezultatul este de tip ir de caractere. Informaiile furnizate de aceste funcii sunt utile pentru depanarea programului n fereastra debug.
9 o comand Return - care red controlul unui alt modul. 9 o comand Cancel - care abandoneaz execuia programului i red controlul ferestrei de comenzi (comanda elibereaz toate variabilele de memorie); 9 o comand Quit - care ntrerupe execuia programului i red controlul sistemului de operare. 9 o comand Do - care red controlul modului apelat. 9 sfritul fiierului care conine programul (eof()=.T.)
194 Informatic b. O anumit operaie este necesar n mai multe programe, cum sunt de exemplu
diferite operaii matematice (extragerea radicalului, extragerea prii ntregi sau a prii fracionare dintr-un numr real etc.), diferite operaii cu iruri de caractere (extragerea unui subir dintr-un ir, tergerea unui subir dintr-un ir, inserarea unui subir ntr-un ir etc.), diferite operaii cu fiiere (deschiderea unui fiier, nchiderea unui fiier, testarea sfritului de fiier etc.).
c. Pentru simplificare, orice problem poate fi descompus n subprobleme folosind tehnica top-down de proiectare a algoritmilor. Descompunerae poate continua pn cnd se obin subprobleme cu rezolvare imediat i care sunt independente unele de altele, astfel nct programele cu care vor fi descrise s fie uor de conceput i depanat, iar ulterior, cnd se schimb unele cerine, s fie uor de dezvoltat. n anii precedeni de studiu ai aflat c subproblemele obinute pot fi descrise prin uniti de programe care se mai numesc i module. Ai mai nvat c modulele se clasific astfel: Modul apelant Transfer Modul apelat 9 Modul apelant. Este modulul care pentru rezolvarea propriei probleme apeleaz la alte module, fiecare dintre ele rezolvnd o anumit subproblem. La apelare, el transfer controlul modului apelat. control
9 Modul apelat. Este un modul la care apeleaz un alt modul pentru a-i rezolva o subproblem. Dup ce i termin execuia, el red controlul modulului apelant.
Revenire control
n Visual FoxPro, la fel ca i n versiunile anterioare de FoxPro exist dou metode de a descompune o problem n subprobleme (module): 9 Construii modulele sub form de programe independente. Fiecare program va fi scris ntr-un fiier separat. Aceste programe se pot apela unele pe altele folosind comanda do. Se obin astfel comenzi do imbricate. Comanda do accept 128 de niveluri de imbricare (32 de niveluri n variantele anterioare de FoxPro). 9 Construii modulele sub form de subprograme, la fel ca i n limbajele clasice de programare. Aceste subprograme pot fi grupate n biblioteci de subprograme.
195
9 Comanda Suspend - care suspend (ntrerupe) execuia unui program. n timpul suspendrii execuiei se pot executa alte comenzi, se pot vizualiza variabile de memorie etc. Variabilele de memorie create n timpul suspendrii sunt variabile private (locale). Comanda este util n depanarea programelor. Execuia programului poate fi reluat din punctul n care a fost ntrerupt cu comanda resume. 9 Comand Resume - care reia execuia unui program suspendat ncepnd cu linia care a fost ntrerupt (comenzile resume i suspend lucreaz mpreun). 9 Comand Retry - care reexecut comanda anterioar. Ea red controlul modulului apelant i este util n rutinele de tratare a erorilor sau n cazul n care se dorete executarea reptat a unei comenzi pn cnd este ndeplinit o condiie.
Pentru depanarea programelor (detectarea i eliminarea erorilor) putei urmri procesul de execuie folosind ferestrele: 9 Trace. Permite urmrirea procesului de execuie a unui program sau a unui formular. Execuia poate fi urmrit i pas cu pas. ! 9 Debug. Permite testarea funciilor, vizualizarea Folosind facilitatea de autodocumenvariabilelor de memorie n timpul execuiei unui tare aflai informaii despre modul n care modul, verificarea expresiilor etc. Fereastra are putei lucra cu ferestrele trace i debug dou panouri: panoul din dreapta poate fi folosit pentru a v depana programele. pentru a edita numele variabilelor de memorie i expresiile pe care le testai n timpul execuiei programului, iar panoul din partea dreapt pentru vizualizarea valorii lor. La primele versiuni de Visual FoxPro ferestrele se deschid cu opiunea Trace Window, respectiv Debug Window din meniul Tools. Deschidei aceste ferestre naintea comenzii do cu care lansai n execuie programul pe care vrei s-l testai. n versiunile mai mari de 4, n fereastra Debugger a aplicaiei (care poate fi deschis cu opiunea Debugger din meniul Tools) pot fi deschise mai multe ferestre document care v ajut s urmrii modul n care se execut programul: Trace - n care se afieaz instruciunile programului, Watch - n care sunt afiate valorile variabilelor de memorie folosite de program, Locals - n care sunt afiate valorile variabilelor de memorie locale folosite de subprogramul care se execut, Call Stack - stiva programelor n execuie (util n cazul unei aplicaii modularizate deoarece permite vizualizarea modului n care se apeleaz modulele). Indiferent de versiunea de Visual FoxPro folosit, depanatorul de programe v ofer urmtoarele faciliti: 9 Rularea pas cu pas (step over). Execuia programului este suspendat dup execuia fiecrei instruciuni permind programatorului s observe modul n care s-a executat instruciunea. Execuia urmtoarei instruciuni se face numai la cererea programatorului. 9 Rularea cu vitez ncetinit (throttle). Execuia programului se face n mod continuu, dar dup execuia fiecrei instruciuni este introdus un timp de ateptare (a crui valoare este precizat de programator). Acest mod de rulare a programului permite programatorului s vizualizeze valorile unor variabile mai rapid dect n cazul rulrii pas cu pas. 9 Rularea continu pn la intlnirea unui punct de ntrerupere (breackpoint). Execuia programului se face n mod continuu pn la ntlnirea unui punct de ntrerupere, dup care execuia poate fi reluat (resume) sau anulat (cancel). Punctele de ntrerupere sunt create de ctre programator n interiorul programului prin precizarea urm-
196 Informatic
toarelor situaii: execuia unei anumite linii din program (care creeaz puncte de ntrerupere permanente), schimbarea valorii unei expresii, evaluarea unei expresii la o anumit valoare, terminarea execuiei unui anumit modul (step out) sau producerea unui anumit eveniment n timpul execuiei programului.
n continuare, se va folosi numai termenul variabile de memorie i se va subnelege c acele operaii se refer i la tablouri de memorie.
197
pentru un grup de variabile i tablouri de memorie care nu poate fi descris cu ajutorul unui ablon i private all [like <ablon> | except <ablon>] pentru un grup de variabile i tablouri de memorie care poate fi descris cu un ablon. Regionale. Sunt vizibile ntr-o anumit regiune a modulului. Se recomand folosi-rea lor atunci cnd dorii s memorai n regiuni diferite ale modulului valori diferite folosind acelai identificator. Pentru aceasta trebuie create mai nti regiunile modulului folosind directiva de compilare #Region astfel: #region <numr_regiune> Se pot crea maxim 32 de regiuni numerotate de la 0 la 31. Dup declararea regiunii se pot declara i variabilele din acea regiune cu instruciunea Regional care are sintaxa: regional <list_variabile_memorie> Observaii: 1. Instruciunile public, local i regional creeaz variabile de memorie. O variabil de memorie trebuie declarat global, local respectiv regional nainte de a i se atribui valori i de a fi folosit n cadrul modulului. 2. Comanda private nu creeaz variabile de memorie; ea schimb numai statutul variabilelor de memorie precizate. 3. Variabilele i tablourile de memorie create n fereastra de comenzi sunt publice.
parameters | lparameters <list_parametri_formali> La activarea modulului apelat parametrilor de comunicare li se atribuie valori concrete cu care se va executa modulul la acel apel, adic se comunic lista de parametri actuali. Lista se comunic prin clauza with <list_ parametri_actuali> a comenzii do.
198 Informatic
Atribuirea valorilor se face respectnd regula de coresponden. De aceea n cele dou liste de parametri trebuie s se respecte aceeai succesiune a parametrilor i acelai tip de date pentru fiecare pereche de parametri. Se accept ns ca lista de parametri actuali s conin mai puini parametri dect lista de parametri formali (dar nu mai muli parametri). n acest caz, parametrii formali crora nu li s-a atribuit o valoare folosind regula de corespondn vor fi iniializai cu valoarea logic .F.. Putei afla numrul de parametri transmii unui modul folosind funcia parameters() .
9 Transmiterea prin referin . Valoarea transmis este afectat de eventualele modificri aduse n modulul apelat. La sfritul executrii modulului apelat, coninutul variabilelor de memorie folosite ca parametri este trecut n variabilele de memorie din modulul apelant. 9 Transmiterea prin valoare . Valoarea transmis nu este afectat de eventualele modificri aduse n modulul apelat. La sfritul executrii modulului apelat, coninutul variabilelor de memorie din modulul apelant, folosite ca parametri, nu este actualizat cu coninutul variabilelor de memorie din modulul apelat.
n cazul modulelor de tip program, transmiterea se face implicit prin referin. Pentru a schimba modul de transmitere, numele parametrului trebuie scris ntre paranteze rotunde: (<nume_parametru>).
1.4.5. Subprogramele
tii deja c din punct de vedere al valorilor returnate modulului apelant, subprogramele se clasific n proceduri (care returneaz un rezultat, nici un rezultat sau mai multe rezultate prin intermediul listei de parametri) i funcii (care returneaz un singur rezultat prin numele su). Tipul subprogramului determin i modul n care este activat (lansat n execuie): procedura printr-o instruciune de apel i funcia n cadrul unei expresii unde este folosit ca operand. Din punct de vedere al constructorului, subprogramele se clasific n subprograme de sistem i subprograme utilizator. Limbajul gazd Visual FoxPro permite lucrul cu: Proceduri Funcii
Construirea unei proceduri sau a unei funcii utilizator se face astfel: procedure | function <nume_procedur>|<nume_funcie> <corp-procedur> | <corp_funcie> [return [<expresie>]] Prin comanda procedure , respectiv function se definete antetul subprogramului (tipul i numele). Dac la sfritul subprogramului nu se scrie instruciunea return (care
199
semnific terminarea subprogramului) acesta se consider terminat atunci cnd se ntlnete un alt antet de subprogram sau sfritul fiierului. Adverbul <expresie> din comanda return reprezint valoarea ntoars de funcie sau procedur prin numele su. Dac nu se precizeaz valoarea returnat aceasta va fi .T.. Activarea unei proceduri se face cu instruciunea: do <nume_procedur> with <list_parametri> iar a unei funcii se face fie prin instruciunea do, fie ca operand ntr-o expresie, fie folosind comanda =. Dac o procedur furnizeaz un singur rezultat, returnat printr-o variabil de memorie creia i se atribuie valoarea expresiei din comanda return, ea poate fi activat la fel ca o funcie, ca operand ntr-o expresie. Subprogramele pot fi scrise: ! 9 n acelai fiier cu programul principal. Folosind facilitatea de autodocumentare aflai Subprogramele se vor scrie dup inordinea n care comanda do alege subprograstruciunile programului principal. mul pe care l lanseaz n execuie n funcie de 9 ntr-o bibliotec de programe. Bibliotefiierul n care este memorat. ca de programe din Visual FoxPro se numete fiier de proceduri. Pentru a putea folosi un subprogram din bibliotec, nainte a-l activa trebuie deschis biblioteca, iar dup ce s-a terminat lucrul cu subprogramele din bibliotec, ea trebuie nchis. Starea unei biblioteci poate fi controlat cu parametrul de sistem procedure a crui valoare se stabilete cu comanda: set procedure to [<nume_fiier_proceduri>] unde <nume_fiier_proceduri> este numele bibliotecii care se deschide. Comanda: set procedure to fr parametru nchide biblioteca deschis. Transmiterea parametrilor se va face implicit prin referin dac activai subprogramul cu comanda do i prin valoare, dac activai subprogramul ca un operand. Putei s controlai modul de transmitere al parametrilor cu parametrul sistemului udfparms care are valoarea reference pentru transmiterea prin referin i valoarea value pentru transmiterea prin valoare. Valoarea parametrului se stabilete cu comanda set: set udfparms to reference | value Observaie: Se mai poate stabili modul de transfer pentru fiecare parametru astfel: dac numele este scris ntre paranteze, transferul se face prin valoare, iar dac este precedat de caracterul @ transferul se face prin referin.
Creai un fiier care conine un program surs i-l lansai n execuie 1. Creai fiierul surs, l compilai i-l lansai n execuie folosind meniul aplicaiei:
200 Informatic
Deschidei o fereastr a editorului de texte ncorporat astfel: alegei opiunea New... File; se deschide caseta de dialog New n care alegei din grupul de butoane radio File Type opiunea Program i apoi acionai declanatorul New File. Se deschide fereastra de editare. Folosind operaia Save As atribuii fiierului numele test1.prg. Scriei n fereastra de editare textul programului din exemplul prezentat la structura liniar. Compilai fiierul surs cu opiunea de meniu Compile Program. Salvai i nchidei fereastra de editare fie cu opiunea de meniu, fie folosind butonul de nchidere al ferestrei, fie apsnd tastele ctrl+w. Lansai n execuie programul cu opiunea de meniu Do... Program.
2. Creai fiierul surs, l compilai i-l lansai n execuie folosind limbajul de comand: Deschidei o fereastr a editorului de texte ncorporat cu comanda: modify command test2 Se deschide fereastra de editare care are titlul test2.prg. Scriei n aceast fereastr textul programului din exemplul prezentat la structura alternativ simpl. Salvai i nchidei fereastra de editare. Compilai fiierul surs cu comanda: compile test2 Lansai n execuie programul cu comanda: do test2 Deschidei fereastra editorului de texte ncorporat cu comanda: modify command test2 Salvai coninutul acestui fiier sub numele test3.prg. nchidei fereastra de editare. Compilai fiierul surs cu comanda: compile test2 encrypt Deschidei dou ferestre de editare n care ncrcai cele dou fiiere obiect obinute n urma compilrii: test2.fxp i test3.fxp. Ele s-au obinut n urma compilrii aceluiai program surs, dar folosind metode diferite de compilare. Comparai cele dou fiiere obiect obinute. 3. Creai fiierele surs, le compilai i le lansai n execuie pentru toate exemplele prezentate la seciunea Structuri de control. Creai o capcan pentru erori S se construiasc o capcan pentru erori. n fiierul surs exemplu.prg se vor scrie instruciunile programului (modulul apelant), iar n fiierul surs eroare.prg instruciunile subrutinei de eroare (modulul apelat). 1. Creai fiierul surs exemplu.prg i l compilai:
if set('talk')='on' set talk off endif if set('bell')='off' set bell on endif * prin urmatoarea instructiune * se activeaza un subprogram * care a fost scris ntr-un * fisier separat:eroare.prg
on error do eroare with; error(),message(),message(1),; program(), lineno() open database compania use sedinte apend && In aceasta; linie va fi detectata o eroare ? program() wait '' goto top
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor browse on error on error do eroare with:'; on error error(),message(),message(1),; uses program(), lineno() close data go to top && In aceasta; linie va fi detectata o eroare
201
2. Creai fiierul surs eroare.prg i l compilai: parameter nrer, mesaj1,; ?? mesaj2 mesaj2, numeprog, nrlinie ? 'Programul cu eroarea: ' clear ?? numeprog ? 'Eroare cu numarul: ' ? 'Linia cu numarul: ' ?? ?? nrlinie str(nrer,4)+replicate(chr(7),3) wait '' ? 'Mesaj de eroare: ' clear ?? mesaj1 return ? 'Comanda eronata: ' 3. Lansai n execuie programul exemplu. Observai modul n care suntei informai despre erorile de compilare. Testai modul n care pot fi folosite variabilele de memorie ascunse Scriei urmtorul program surs n fiierul ex1.prg i-l lansai n execuie: set talk off a1 = 100 a1 = 10 a2 = 200 a2 = 20 ? 'Afiseaza variabilele din; do ascunde procedura' ? 'Afiseaza variabilele din; ? 'a1= ' program dupa revenire din; ?? a1 && Afiseaza 100 procedura' ? 'a2= ' ? a1, a2 && Afiseaza 10, 200 ?? a2 && Afiseaza 200 procedure ascunde return private a1 Testai modul n care pot fi folosite variabilele de memorie publice Scriei urmtorul program surs n fiierul ex2.prg i-l lansai n execuie. Observai valorile afiate. Observai comportamentul variabilelor publice. Comparai acest exemplu de program (n care variabilele de memorie a1 i a2 au fost declarate publice) cu exemplul anterior n care nu au fost declarate publice. Ce concluzie tragei? Observai c prin comanda release all nu sunt eliberate variabilele publice, iar prin comanda release a1,a2 sunt eliberate variabilele de memorie specificate n list, chiar dac sunt publice.
set talk off public a1,a2 a1 = 10 a2 = 20 do ascunde ? 'Afiseaza variabilele din; program dupa revenire din; procedura' ? a1, a2 && Afiseaza 10, 200
release all display memory like a? release a1,a2 display memory like a? procedure ascunde private a1 a1 = 100 a2 = 200 ? 'Afiseaza variabilele din; procedura'
202 Informatic
? 'a1 = ' ?? a1 ? 'a2 = ' ?? a2 return && Afiseaza 200
Testai modul n care pot fi folosite variabilele de memorie regionale Scriei urmtorul program surs n fiierul ex3.prg i-l lansai n execuie:
* Se creeaza doua regiuni * In prima regiune se creeaza variabilele a1,a2,a3,a4 * In a doua regiune se creeaza variabilele a2,a3,a4,a5 * Variabilele a2,a3,a4 sunt comune celor doua regiuni #region 1 regional a1,a2,a3,a4 store 10 to a1,a2,a3,a4 #region 2 regional a2,a3,a4,a5 store 20 to a2,a3,a4,a5 ? 'Observati modul in care sunt afisate variabilele' ? 'regionale care folosesc acelasi identificator' display memory like a* #region 1 ? a2, a3, a4 #region 2 ? a2, a3, a4 return
Rezolvai problemele cu ajutorul subprogramelor Notm combinri de n luate cte m cu C(n,m). Calcularea lor se face folosind urmtoarea formul: C(n,m)=n!/(m!*(n-m)!)). Observai c n formul se repet de trei ori calculul factorialului. Pentru acest calcul se va folosi un subprogram. Scriei urmtorul program surs n fiierul ex4.prg i-l lansai n execuie. Subprogramul folosit este de tip procedur i va fi scris dup instruciunile din programul apelant. clear c=f1/(f2*f3) set talk off ? 'Combinari = ', c public n,m,f1,f2,f3 return ? 'Programul calculeaza; procedure fact combinari de n luate cate m' parameters j,p input 'n= ' to n store 1 to i,p input 'm= ' to m for i=1 to j do fact with n,f1 p=p*i do fact with m,f2 endfor do fact with n-m,f3 return Scriei urmtorul program surs n fiierul ex5.prg i-l lansai n execuie. Subprogramul folosit este de tip funcie. Observai modul n care a fost rezolvat aceeai problem folosind cele dou tipuri de subprograme. clear input 'n= ' to n set talk off input 'm= ' to m public n,m c=fact(n)/(fact(m)*fact(n-m)) ? 'Programul calculeaza; ? 'Combinari = ',c combinari de n luate cate m' return
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor function fact parameters j fact=1 for i=1 to j fact=fact*i endfor return fact
203
Testai modul n care putei folosi informaiile furnizate de funcia parameters() Scriei urmtorul program surs n fiierul ex6.prg i-l lansai n execuie. set talk off a1 = 10 a2 = 20 a3 = 30 a4 = 40 med = media(a1, a2, a3, a4) ? 'Media aritmetica = ' ?? med function media * functia permite transferul datelor prin cel mult 9 parametri. parameters b1,b2,b3,b4,b5,b6,b7,b8,b9 * se foloseste functia parameters() pentru a afla numarul; de valori transferate functiei if parameters()=0 && Daca nu s-a transferat nici un parametru; return 0 && media aritmetica este 0 else suma = 0 for i=1 to parameters() nume_p = 'b' +(str(i,1)) && Pentru numele parametrului se suma = suma + &nume p && foloseste adresarea indirecta endfor m = suma/(i-1) return m endif return Testai modul n care se face transferul parametrilor ntre module Scriei urmtorul program surs n fiierul ex7.prg i-l lansai n execuie.
clear if set('talk')='on' set talk off endif set udfparms to value n=10 ?test(n),n && Afiseaza 70, 10 set udfparms to reference
Testai modul n care putei activa o procedur la fel ca i o funcie Procedura data furnizeaz un format romnesc de afiare a datei prin chiar numele su. Scriei urmtorul program surs n fiierul ex8.prg i-l lansai n execuie.
204 Informatic
? data(ctod(dt)) procedure data parameter d do case case month(d)=1 luna='ianuarie' case month(d)=2 luna='februarie' case month(d)=3 luna='martie' case month(d)=4 luna='aprilie' case month(d)=5 luna='mai' case month(d)=6 luna='iunie' case month(d)=7 luna='iulie' case month(d)=8 luna='august' case month(d)=9 luna='septembrie' case month(d)=10 luna='octombrie' case month(d)=11
Construii i testai o bibliotec Construii n fiierul vectori.prg o bibliotec cu operaii pentru vectori care s conin: proceduri pentru citirea unui vector, pentru afiarea unui vector, pentru concatenarea doi vectori, pentru interclasare a doi vectori, pentru divizarea unui vector, o funcie pentru cutarea unui element cu o valoare precizat ntr-un vector (funcia va furniza un rezultat numeric: prima poziie n care a fost gsit elementul n vector sau -1 dac nu a fost gsit) i o procedur de cutare care va comunica toate poziiile n care a fost gsit un element cu o valoare precizat (se va folosi dac exist mai multe elemente cu aceei valoare n vector). Dup ce ai scris fiierul surs, l vei compila ca s fii siguri c nu avei erori de sintax. procedure creare ? parameters a,n i=1 local i do while i<=n-1 ? 'Creati un vector cu n elemente' for j=1 to 10 input 'n= ' to n ?? str(a(i),6)+', ' dimension a(n) i=i+1 for i=1 to n if i=n input 'a('+str(i,2)+')= ' to; exit a(i) endif endfor endfor return if i<=n-1 procedure afisare ? parameters a,n endif local i,j enddo ? 'Se afiseaza un vector cu ', ?? str(a(n),6) str(n,2)+' elemente' return
luna='noiembrie' case month(d)=12 luna='decembrie' endcase do case case lower(cdow(d))='monday' ziua='luni' case lower(cdow(d))='tuesday' ziua='marti' case lower(cdow(d))='wednesday' ziua='miercuri' case lower(cdow(d))='thursday' ziua='joi' case lower(cdow(d))='friday' ziua='vineri' case lower(cdow(d))='saturday' ziua='sambata' case lower(cdow(d))='sunday' ziua='duminica' endcase dat=ziua+', '+str(day(d),2)+; ' '+luna+' '+str(year(d),4) return dat
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor procedure concatenare parameters a,b,c,n,m dimension c(n+m) ?acopy(a,c,1,n,1) ?acopy(b,c,1,m,n+1) procedure divizare parameters a,b,c,n,m dimension b(m) dimension c(n-m) ?acopy(a,b,1,m,1) ?acopy(a,c,m+1,n-m,1) return procedure interclasare parameters a,b,c,n,m dimension c(n+m) ?acopy(a,c,1,n,1) ?acopy(b,c,1,m,n+1) ?asort(c) return function caut parameters a,n,x local i k=-1 for i=1 to n if a(i)=x k=i exit endif endfor return k procedure cautv parameters a,n,x,t,k local i,j k=-1 j=0 for i=1 to n if a(i)=x j=j+1 dimension t(j) t(j)=i k=j endif endfor return
205
Testai apoi biblioteca folosind urmtoarele programe: test1.prg pentru testarea operaiei de cutare, test2.prg pentru testarea operaiei de concatenare, test3.prg pentru testarea operaiei de interclasare i test4.prg pentru testarea operaiei de divizare. test1.prg
set talk off ? 'Cu acest program lucrati cu; vectori cu elemente numerice' public m,p,x,v(1),u(1) clear note Se deschide biblioteca set procedure to vectori do creare with v,m do afisare with v,m ? 'Puteti cauta o valoare; numerica x in vector' input 'x= ' to x ?? 'Veti afla prima pozitie in; care a fost gasita' if caut(v,m,x)=-1 ? 'Nu exista elementul cautat'
test2.prg set talk off public p,q,x(1),y(1),z(1) clear set procedure to vectori ? 'Programul concateneaza doi;
else ? 'Prima pozitie in care se; gaseste valoarea este '; +str(caut(v,m,x),2) do cautv with v,m,x,u,p if p>1 ? 'Valoarea apare in mai; multe pozitii' ? 'Pozitiile gasite sunt:' do afisare with u,p endif endif note Se nchide biblioteca set procedure to return
vectori numerici' ? 'Comunicati primul vector' do creare with x,p ? 'Comunicati al doilea vector' do creare with y,q
206 Informatic
do concatenare with x,y,z,p,q set procedure to do afisare with z,p+q return test3.prg La fel ca la test2.prg numai c n loc de do concatenare with x,y,z,p,q scriei do interclasare with x,y,z,p,q
test4.prg set talk off public p,q,x(1),y(1),z(1) clear set procedure to vectori ? 'Programul divizeaza un; vector numeric in doi vectori' ? 'Comunicati vectorul care se; divizeaza' do creare with x,p
input 'Numarul de elemente; preluate de primul vector = '; to q do divizare with x,y,z,p,q ?'Primul vector obtinut' do afisare with y,q ?'Al doilea vector obtinut' do afisare with z,p-q set procedure to return
207
a2) cuvintele sunt separate prin dou sau mai multe spaii. b) S se numere caracterele din text i s se precizeze: b1) cte consoane sunt; b2) cte vocale sunt; b3) cte cifre sunt; b4) cte semne speciale sunt. c) S se nlocuiasc n text un ir de caractere cu un alt ir de caractere. Cele dou iruri de caractere se introduc de la tastatur. Se vor nlocui toate apariiile irului de caractere precizat n urmtoarele cazuri: c1) nu conteaz diferena dintre literele mari i mici; c2) conteaz diferena dintre literele mari i mici; c3) nu conteaz dac irul de caractere este un cuvnt+cerina c2; c4) irul de caractere este un cuvnt+ cerina c2. d) S se afieze n ordine alfabetic cuvintele din text. e) S se numere cuvintele care au m caractere. Valoarea lui m se introduce de la tastatur. f) S se afieze pentru fiecare liter, cte litere sunt n text (frecvena de apariie a literelor). Afiarea se va face pe ecran sub forma: Literea a sau A ............ 20 Literea b sau B ............ 5 ........................................ Lista se va afia sortat n dou moduri: n ordinea alfabetic a literelor i n ordinea descresctoare a frecvenei de apariie. g) S se afieze litera care are cea mai mare frecven de apariie n text. h) S se afieze media apariiilor i abaterea medie ptratic. Ce informaii obinei comparnd cele dou valori obinute. 6. S se realizeze un tabel baz de date n care s se memoreze evoluia cursului leu-euro din luna precedent. Pentru fiecare zi din lun se vor memora urmtoarele informaii: data, valoarea cursului, indicele cu baz fix (raportul dintre cursul zilei i cursul din ziua de nceput a perioadei de analiz), indicele cu baz n lan (raportul dintre cursul zilei i cursul din ziua precedent), sporul cu baz fix (diferena dintre cursul zilei i cursul din ziua de nceput a perioadei de analiz), sporul cu baz n lan (diferena dintre cursul zilei i cursul din ziua precedent). Crearea structurii tabelului i ncrcarea cmpurilor pentru dat i curs se va face la nivel de limbaj de comand. Pentru calcularea celorlalte cmpuri se va folosi un program. S se afieze urmtoarele informaii folosind datele din tabel: ziua cu cel mai mare curs, ziua cu cel mai mic curs, media aritmetic a cursului i abaterea medie ptratic a cursului. Aceste informaii se vor furniza n dou moduri: cu ajutorul limbajului de comand i cu ajutorul unui program. S se realizeze un tabel baz de date n care s se memoreze situaia notelor i a mediilor la disciplina Informatic a elevilor dintr-o clas. Tabelul va conine urmtoarele informaii: numele i prenumele elevului, poziia lui din catalog, cinci note pentru primul semestru, cinci note pentru cel de al doilea semestru, dou note pentru tezele de pe cele dou semestre, mediile de pe cele dou semestre i media anual. Crearea structurii tabelului i ncrcarea cmpurilor pentru numele i prenumele elevului, pentru poziia lui din catalog, pentru cele maxim 10 note din cele dou semestre i pentru cele dou note de la tezele semestriale se va face la nivel de limbaj de comand. Pentru calcularea mediilor se va folosi un program. La calcularea mediilor trebuie s inei cont de urmtoarele:
7.
208 Informatic
a) valorile mediilor semestriale sunt de tip ntreg, iar valoarea mediei generale este de tip real; b) este posibil ca un elev s primeasc mai puin de cinci note; c) teza are ponderea de 25% din media semestrial. Scriei un program care s afieze urmtoarele informaii: a) corigenii de pe fiecare semestru i corigenii anuali; b) o list ordonat alfabetic dup numele i prenumele elevilor care s conin numele, prenumele, mediile semestriale i media anual; c) o list ordonat descresctor dup media anual care s conin numele, prenumele, mediile semestriale i media anual; d) numele elevului cu cea mai mare medie pe semestrul 1, pe semestrul 2 i respectiv pe an; e) media general a clasei i abaterea medie ptratic a mediilor pe fiecare semestru i pe an (ce concluzie tragei prin compararea acestor medii?). 8. Completai biblioteca vectori cu urmtaorele subprograme pentru operaii cu vectori: proceduri pentru adunarea i produsul vectorial a doi vectori i funcii pentru produsul scalar a doi vectori i pentru suma i produsul elementelor unui vector. Testai noile subprograme adugate la bibliotec. 9. Construii o bibliotec pentru operaii cu mulimi care s permit executarea urmtoarelor operaii: citirea i afiarea unei mulimi, reuniunea, intersecia, diferena, diferena simetric, produsul cartezian a dou mulimi, cardinalul unei mulimi (numrul de elemente), apartenena unui element (a crui valoare o vei comunica de la tastatur) la o mulime. Pentru mulimi vei folosi tipul de date vector. Spre deosebire de un vector oarecare, ntr-un vector care pstreaz elementele unei mulimi nu pot exista dou elemente cu aceeai valoare. 10. Construii o bibliotec cu operaii cu iruri de caractere n care s pstrai subprograme pentru rezolvarea cerinelor de la problema 5. Construii programe pentru testarea acestei biblioteci. 11. Folosind editorul de texte Notepad vizualizai coninutul fiierelor clieni.dbf i clieni.fpt. Observai c orice persoan care vrea s citeasc datele din tabelele bazei de date poate face acest lucru cu un simplu editor de texte. Cu puin efort poate identifica ce reprezint fiecare dat i poate obine anumite informaii care pot fi secrete. Pentru a evita acest lucru putei codifica datele de tip alfanumeric (cmpurile de tip ir de caractere aflate n fiierul cu extensia .dbf i cmpurile memo aflate n fiierul cu extensia .fpt). Vei crea un cod simplu: translatai cu o valoare stabilit (de exemplu 15) codurile ASCII ale caracterelor. Construii dou subprograme: unul pentru codificare (pe care l folosii nainte de nchiderea bazei de date) i unul pentru decodificare (pe care l folosii la deschiderea bazei de date). irurile de caractere pot conine numai cifre, litere i anumite semne speciale. Pentru a evita afiarea n irurile de caractere codificate a altor caractere, putei complica codul folosind pentru acelai tip de caractere (cifre, litere sau semne speciale) o translatare circular. De exemplu, pentru literele mici considerai c dup litera z urmeaz litera a; n acest mod, pentru o translatare cu 15, n locul literei a (cod ASCII: 97) se va folosi litera p (cod ASCII 97+15=112), iar n locul literei z (cod ASCII: 122) se va folosi litera o (cod ASCII 97-1+15=111).
209
ncercai:
Adevrat/Fals: 1. O procedur utilizator din Visual FoxPro poate fi activat ca o funcie. 2. n limbajul Visual FoxPro este implementat structura repetitiv de tip repeat ... until. 3. Comenzile care permit redirectarea unei valori de pe ecran ntr-o variabil de memorie folosind clauza to creeaz variabila de memorie. 4. Variabilele de memorie pot fi definite oriunde n interiorul programului. 5. Printr-o comand modify command putei deschide mai multe ferestre de editare. 6. Instruciunea exit red controlul sistemului de operare. 7. Instruciunea public creeaz variabile de memorie. 8. Printr-o comand compile putei compila un singur program. Completai: 1. n instruciunea alternativ generalizat do case ... endcase cuvntul cheie ............ precede instruciunile care se vor executa dac nici unul dintre cazuri nu a fost adevrat. 2. Comentariul inserat ntr-o linie a programului trebuie precedat de ................. 3. Instruciunea prin care putei fora reevaluarea condiiei de terminare a unei structuri repetitive este ..................... 4. Pentru crearea unei capcane pentru erori folosii comanda ........................ 5. Coninutul liniei care a cauzat o eroare de compilare este furnizat de funcia ............... 6. Putei s urmrii execuia pas cu pas a unui program n fereastra .................... 7. Parametrii formali se declar cu instruciunea ................. 8. Aflai numrul de parametri actuali transmii unui subprogram cu funcia ................... 9. Deschidei o bibliotec de subprograme cu comanda .......................... Alegei rspunsurile corecte: 1. n funcie de context, ntr-un program Visual FoxPro caracterul = poate fi: a) operator relaional b) operator de atribuire c) comand 2. Dac din mai multe aciuni posibile trebuie s se execute una singur vei folosi: d) instruciuni if ... endif imbricate e) instruciunea do case ... endcase f) instruciunea scan ... endscan 3. Fraza citete nregistrrile fiierului pn cnd ajungi la marcajul de sfrit de fiier poate fi descris cu instruciunea: a) for i=1 to reccount() ... endfor b) do while not eof() ... enddo c) scan ... endscan 4. O variabil de memorie declarat privat cu instruciunea private este: a) o variabil de memorie local, vizibil numai n modulul n care a fost creat; b) o variabil vizibil numai n regiunea de program n care a fost creat; c) o variabil de memorie ascuns de modulele superioare. 5. Comanda return to master red controlul: a) modulului apelant b) modulului principal c) sistemului de operare
210 Informatic
6. Linia de comentarii ncepe cu: a) note b) * c) && 7. Dac scriei numele unui parametru ntre paranteze rotunde, transferul se va face prin: a) referin b) valoare c) adresare indirect Rspundei: 1. Realizai o comparaie ntre un limbaj de programare structurat studiat i limbajul gazd Visual FoxPro. Punei n eviden asemnrile i deosebirile referitoare la: declararea datelor, structurile de control care pot fi folosite, comentarii, modularizarea unei aplicaii (i tot ce presupune acest prooces - transferul datelor, domeniul de vizibilitate al identificatorilor etc.), bibliotecile de subprograme etc. 2. Ce tipuri de structuri de control sunt implementate n limbajul gazd Visual FoxPro? 3. Cum poate fi modularizat o aplicaie n Visual FoxPro? Cte metode exist? 4. Cte tipuri de variabile de memorie sunt n funcie de domeniul de vizibilitate? spunsuri: R Adevrat/Fals: 1-A; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F.
Completai: 1-otherwise; 2-&&; 3-loop; 4-on error; 5-message(1); 6-Trace; 7- parameters; 8-parameters(); 9-set procedure to<nume_biblioteca>. Alegei rspunsurile corecte: 1-a,b,c; 2- a,b; 3- a,b,c; 4-c; 5-b; 6-a,b; 7-b.
2 . P r o g r a m a r e a o r i e n t a t p e o bi e c t e
2 . 1 . P r i n c i p i i l e p r o gr a m r i i o r i e n t a t e p e o b i e c t e
Programele de calculator prelucreaz informaii din lumea care ne nconjoar. Lumea real este format din obiecte, iar omul interacioneaz cu ea prin intermediul acestor obiecte. O fotografie prezint i ea un ansamblu de obiecte care sunt caracterizate ns numai de proprieti (form, dimensiuni, culoare etc.), nu i de aciuni. Ea este o reprezentare static a lumii reale. Dar lumea care ne nconjoar este o lume dinamic n care fiecare obiect este determinat de proprieti, metode i evenimente. Putem s ne gndim la proprieti ca la atributele obiectului, la metode ca la aciuni ale obiectului, iar la evenimente ca la rspunsuri ale obiectului la aciunile omului asupra lui. Pentru a nelege mai bine ce nseamn proprietile, metodele i evenimentele s considerm un obiect din viaa de zi cu zi: balonul unui copil. Balonului i se pot asocia proprieti, metode i evenimente. Proprietile balonului includ att atributele vizibile cum sunt nlimea, diametrul, culoarea, cele care descriu starea lui (umflat sau dezumflat), ct i atribute invizibile cum este vrsta. Prin definiie, toate baloanele au aceste proprieti. Valorile acestor proprieti difer de la un balon la altul. Balonului i se pot asocia de asemenea i aciuni pe care le poate executa, adic metode: metoda de umflare a balonului (aciunea prin care se umfl balonul cu aer), metoda de dezumflare a balonului (aciunea prin care se scoate aerul din balon), metoda de nlare a balonului (aciunea prin care se ridic balonul). Toate baloanele sunt capabile s execute aceste aciuni, deci au asociate aceste metode. Baloanele au i rspunsuri predefinite la anumite evenimente externe: la evenimentul neptur, rspunsul este dezumflarea automat, iar la evenimentul eliberarea balonului rspunsul este nlarea lui n aer.
211
Aadar, baloanele difer ntre ele numai prin valorile proprietilor i au acelai comportament (reacioneaz la aceleai evenimente prin aceleai metode). Putem spune c balonul este un tip de obiect din lumea real, iar mulimea baloanelor formeaz o clas de obiecte. Aa cum o fotografie descrie starea unui obiect la un moment dat, i o structur de date folosit pentru descrierea obiectului nu poate s caracterizeze dect starea acelui obiect la un moment dat, deci este o descriere static a obiectului. Tendina limbajelor moderne de programare este de a pune n coresponden obiectele reale cu obiectele virtuale pentru a putea evidenia transformrile pe care acestea le sufer n mod continuu. Obiectul va ncapsula att datele care descriu proprietile, dar i subprogramele care prelucreaz aceste date i care vor defini metodele obiectului. Domeniul n care programarea orientat pe obiecte a ajuns indispensabil este realizarea interfeei. Aa cum obiectele cu care venim n contact reprezint interfaa ntre noi i lumea real i interfaa grafic dintre utilizator i programul de aplicaie este construit cu diferite obiecte virtuale afiate pe ecran care pot fi acionate cu mouse-ul i tastatura. Putem spune c n urma acionrii, obiectul declaneaz un anumit eveniment. Deoarece, utilizatorul poate veni n contact cu mai multe aplicaii, s-a cutat o standardizare a acestor obiecte att din punct de vedere al proprietilor, ct i din punct de vedere al evenimentului declanat. De exemplu, dac un utilizator vede pe ecranul calculatorului un buton pe care scrie OK, tie c dac l va aciona se va nchide caseta de dialog i se va continua execuia aplicaiei.
Ai studiat deja principiile programrii orientate pe obiecte. Dintre conceptele studiate, s ne reamintim urmtoarele:
Proprietatea (property) reprezint un atribut al unui obiect care definete una dintre
caracteristicile sau unul dintre aspectele sale. De exemplu, un obiect vizual poate avea proprietatea visible care determin dac obiectul este vizibil la un moment dat.
Evenimentul (event) reprezint o aciune recunoscut de obiect pentru care se poate scrie un
program ca rspuns. Evenimentele pot fi externe, adic generate de aciuni ale utilizatorului (un clic cu mouse-ul, micarea mouse-ului, apsarea unei taste) sau interne, adic generate printr-un cod de program sau de sistem.
Clasa (class) reprezint definiia unui anumit tip de obiect. Definiia cuprinde descrierea
proprietilor i a metodelor obiectului. Folosirea claselor permite gestionarea mai multor obiecte de acelai tip. Clasa este ns doar un termen abstract, un ablon care definete caracteristicile unui obiect (cum arat i cum se comport).
212 Informatic
Instana (instance) reprezint un obiect creat pornind de la definiia unei clase. Spre deosebire de
clas care este doar o definiie, o instan exist ca un obiect care poate fi folosit pentru a executa anumite aciuni. De exemplu, o caset de text dintr-un formular este o instan a clasei TextBox care descrie acest tip de obiecte vizuale.
Instane multiple (multiple instances) reprezint mai multe obiecte create de aceeai clas.
Obiectele au propriile proprieti i date private, dar folosesc mpreun codul de program.
ncapsularea (encapsulation) reprezint un mecanism prin care folosind o singur definiie sunt
incluse n obiect datele i metodele. Datele membre ale unui obiect nu pot fi modificate dect prin intermediul metodelor proprii obiectului respectiv. ncapsularea izoleaz complexitatea intern a unui obiect de restul aplicaiei.
Motenirea (inheritance) este o facilitate oferit de programarea pe obiecte prin care o clas
nou numit clas copil (child class) se poate construi pornind de la o clas existent numit clas printe (parent class) prin preluarea caracteristicilor clasei printe. Clasa copil se mai numete i clas derivat (subclass), iar clasa printe clas de baz (base class). Folosind aceast facilitate se poate crea o ierarhie de clase i se poate dezvolta uor un software existent. Clasa copil motenete accesul la datele i metodele strmoilor. La acestea, programatorul poate aduga proprieti i metode noi, definite explicit n noua clas. Orice modificare ntrun strmo se reflect i la urmai. De exemplu, dac o clas Text are proprietatea ca textul s fie scris ngroat, orice urma al acestei clase va avea aceast proprietate.
Aceeai problem poate fi rezolvat att n varianta clasic a programrii structurate, ct i folosind programarea orientat pe obiecte. Principalele avantaje ale folosirii programrii orientate pe obiecte sunt: 9 Reutilizarea unui software deja scris. Acest avantaj crete eficiena programatorilor. n programarea clasic se realiza prin crearea bibliotecilor de subprograme. 9 Dezvoltarea mai uoar a aplicaiilor. n programarea orientat pe obiecte crete gradul de modularizare al unei aplicaii fa de programarea clasic. Adugarea sau modificarea unor module de aplicaie se va face mai uor datorit organizrii obiectelor n clase de obiecte i a facilitii de motenire. 9 Controlul mai bun al programelor de dimensiuni mari. Aplicaia este mai bine structurat dect n cazul programrii clasice i mult mai abstractizat, permind o mai uoar citire i urmrire a codului. 9 Dezvoltarea programrii vizuale ca aplicaie a programrii orientate pe obiecte. n varianta clasic, descrierea unui obiect grafic de pe ecran se fcea preciznd printr-un set de instruciuni caracteristicile obiectului (coordonatele obiectului, dimensiunile, culoarea, textul afiat etc.), iar prin subprograme modul n care putea fi manipulat obiectul. n programarea vizual exist deja obiecte vizuale predefinite care pot fi folosite pentru construirea unei intrefee. Obiectul vizual conine proprietile obiectului grafic (cu valori implicite, care ns pot fi modificate) i metodele i evenimentele la care poate reaciona obiectul vizual, fr s mai necesite scrierea codului de ctre programator.
2 . 2 . L u c r u l c u c l a s e i o b i e c t e n V i s u a l F o x P r o
2.2.1. Clasele
Visual FoxPro are implementate mai multe clase predefinite care permit crearea unor obiecte cu care poate fi construit interfaa unei aplicaii, cum sunt de exemplu casetele
213
de text, comutatoarele, butoanele radio, listele, formularele etc. Folosind facilitatea de motenire, programatorul poate defini dou categorii de clase: 9 Clase vizuale care permit crearea obiectelor vizuale ce pot fi folosite la realizarea interfeei. Definiia acestor clase se bazeaz pe una dintre clasele predefinite vizuale. Altfel spus, clasele vor avea ca strmo una dintre clasele predefinite. De exemplu, pornind de la clasa predefinit form, care descrie obiecte vizuale de tip formular, se poate crea o nou clas, care s descrie tot un obiect de tip formular, dar cu proprieti modificate i eventual cu metode noi fa de formularul predefinit. 9 Clase nevizuale care permit crearea unor obiecte nevizuale. Definiia acestor clase se bazeaz pe clasa custom sau pe clasele predefinite nevizuale (de exemplu clasele timer sau cursor). Clasele derivate din clasa custom se mai numesc i clase definite de utilizator - User Defined Class (UDC). De exemplu, pornind de la clasa custom se poate crea o nou clas, care s descrie comportamentul unui numr complex. Clasa container este format dintr-un grup de clase similare (clase predefinite sau derivate din acestea) care pot fi tratate ca o unitate. De exemplu, clasa predefinit form (a formularelor) este un grup de clase de controale predefinite tratate ca o unitate, iar clasa form set (a setului de formulare) este i ea o clas container care conine unul sau mai multe formulare legate ntre ele. Instana unei clase container este un obiect container. Obiectul container este un obiect care conine pe lng proprieti, metode i evenimente i alte obiecte. El permite accesul la obiectele pe care le conine. Obiectul container este foarte util la construirea interfeelor. De exemplu, un formular de tip caset de dialog este un obiect container care poate conine alte obiecte cu care se poate asigura un dialog interactiv cu utilizatorul: liste, comutatoare, butoane radio, casete de text etc. Clasele (predefinite i custom) au implementate implicit urmtoarele evenimente: Init (se produce la crearea obiectului), Destroy (se produce la eliberarea obiectului), Error (se produce la apariia unei erori n timpul execuiei unei metode) i metode: AddObject (adaug un obiect la un container n timpul execuiei), CloneObject (creeaz o copie a obiectului), RemoveObject (nltur un obiect dintr-un container n timpul execuiei), SaveAsClass (salveaz o instan a unui obiect ca o definiie de clas ntr-o bibliotec de clase), Fiecare clas se identific printr-un nume. O clas se poate crea cu instruciunea bloc define class care are sintaxa: define class <nume_cls1> as <nume_cls2> [[protected <nume_pr1>, <nume_pr2>,... ] <nume_pr>=<exp> ...] [add object [protected] <nume_ob> as <nume_cls3> [noinit] [with <lista_pr>]... [[protected] function | procedure <nume> <secven-instruciuni> endfunc | endproc ] ... enddefine Prin aceast instruciune se definete clasa identificat prin <nume_cls1>. Definiia noii clase se bazeaz pe clasa printe precizat prin <nume_cls2> din clauza as de la care motenete proprietile, metodele i evenimentele. Clasa printe poate fi o clas predefinit, o clas vizual (care se bazeaz pe o clas predefinit) sau o clas nevizual (definit de utilizator). La noua clas pot fi adugate:
214 Informatic
9 Proprieti noi. Ele vor fi precizate printr-o list de operaii de atribuire <nume_pr>=
<exp>, unde <nume_pr> este numele proprietii, iar <exp> este valoarea cu care se iniializeaz proprietatea. Proprietile pot fi protejate, adic se poate mpiedica accesul la proprietate i se poate mpiedica modificarea ei din afara definiiei clasei. Protejarea unor proprieti se precizeaz cu clauza protected nsoit de lista de proprieti care vor fi protejate: <nume_pr1>, <nume_pr2>,... . 9 Obiecte noi. Fiecare obiect nou care va fi adugat la definiia clasei este precizat printr-o clauz add object. Obiectul va fi identificat prin <nume_ob> i va fi adugat dintr-o clas precizat prin <nume_cls3> din clauza as. Obiectul adugat poate fi protejat, adic se poate mpiedica accesul i modificarea lui din afara clasei, dac se precizeaz clauza protected. Metodele i evenimentele clasei vor avea ns acces la proprietate. Implicit se execut metoda de inializare a obiectului la adugarea obiectului. Explicit nu se face iniializarea dac este precizat clauza noinit. Explicit se poate preciza cu clauza with lista proprietilor i valorile proprietilor care se adaug obiectului adugat la clas. 9 Metode i evenimente noi. Ele sunt create ca un set de subprograme (proceduri i funcii). Fiecare funcie i procedur este delimitat de cuvintele cheie function i endfunc i respectiv procedure i endproc. ntre cuvintele cheie se scrie secvena de instruciuni care formeaz corpul subprogramului. Se pot folosi parametri de comunicaie ntre subprogram i obiect sau ntre subprogramele aceleiai clase. Parametrii se declar la nceputul fiecrui subprogram cu instruciunea paramaters sau lparameters. Metodele pot fi protejate (este mpiedicat accesul la ele din afara obiectului) dac se precizeaz clauza protected nainte de a scrie subprogramul asociat. Metoda va fi un subprogram care va aciona asupra obiectului creat pe baza clasei i care poate fi apelat indiferent de ndeplinirea unor condiii, iar evenimentul va fi un subprogram care se va executa numai atunci cnd se produce o aciune (de exemplu un clic cu mouse-ul) recunoscut de obiectul creat pe baza clasei. Observaii: 1. Define class este instruciune deoarece nu poate fi folosit n modul interactiv, ci numai n programe. Instruciunea are o sintax de bloc, deoarece este format dintr-un ansamblu de instruciuni. Blocul de instruciuni ncepe cu comanda define class i se termin cu cuvntul cheie enddefine. Instruciunile componente sunt scrise n sintaxa blocului fiecare pe cte un rnd i trebuie scrise pe un singur rnd i n cadrul unui program (la fel ca orice instruciune independent). 2. Clauza as precede numele clasei printe pe care se bazeaz definiia noii clase sau a unui obiect adugat la o clas container. Exemplu: Se creeaz o clas cu numele formular pe baza clasei vizuale form (clasa formularelor). Obiectele din aceast clas vor fi obiecte container, deoarece obiectul formular conine alte trei obiecte: dou care se bazeaz pe clasa CommandButton (adic vor fi butoane de comand), iar unul care se bazeaz pe clasa ListBox (adic va fi o list). Clasa formular va conine pe lng proprietile, metodele i evenimentele clasei form proprietile nume i versiune i metoda click.
define class formular as form * Se definesc proprietatile nume si versiune. Ele sunt * initializate cu 20 de spatii, respectiv cu un sir de caractere.
215
* Proprietatea versiune va fi protejata. protected versiune nume=space(20) versiune='1.0' * Se precizeaza obiectele care vor fi adaugate. * Pentru obiectele cb1 si cb2 se vor modifica valorile proprieta* tilor caption (legenda) si backcolor (culoarea fundalului). add object cb1 as CommandButton; with Caption='Da', BackColor = 2 add object cb2 as CommandButton; with Caption='Nu', BackColor = 2 add object lista as ListBox * Se scrie metoda Click cu ajutorul unei proceduri. procedure Click = messagebox('Ati executat un clic n formular') endproc enddefine
Observaie: Clasele pot fi definite i modificate interactiv prin intermediul constructorului de clase Class Designer pe care l activai cu comanda create class.
2.2.2. Obiectele
Obiectele se creeaz pe baza claselor definite. Obiectul este instana unei clase. Pentru crearea unui obiect se folosete funcia createobject() care are sintaxa: createobject('<nume_cls>' [,<p1>, <p2>, ...] Rezultatul furnizat de funcie este de tip obiect (adic referin ctre un obiect). Obiectul se creeaz pe baza clasei identificate prin <nume_cls>, iar pentru crearea sa se poate face transfer prin parametrii din lista <p1>, <p2>, ... . Numele clasei va fi scris nu ca un identificator, ci ca un ir de caractere. Pentru a putea folosi obiectul, trebuie s se atribuie referina ctre obiect unei variabile de memorie. n acest mod, numele variabilei de memorie va putea fi folosit pentru a referi obiectul. Exemplu: Se creeaz un obiect pe baza clasei definite anterior. Variabilei de memorie obiect i se obiect = createobject('clasa') atribuie referina ctre acest obiect: n lucrul cu clase i obiecte se folosesc urmtorii operatori specifici: 9 Operatorul . (punct). Se folosete pentru a separa numele obiectului de numele printelui sau pentru a separa numele unui membru al obiectului (proprietate, metod sau eveniment) de numele obiectului. 9 Operatorul :: (delimitarea domeniului). Se folosete atunci cnd dorii s apelai dintr-o clas o metod din clasa printe. Astfel, sintaxa general pentru a avea acces la unul din membrii unui obiect este: <nume_obiect>.<nume_membru> unde <nume_membru> este numele unei proprieti, al unei metode sau al unui eveniment al obiectului.
216 Informatic
n cadrul definiiei unei clase se pot folosi urmtoarele referiri relative la membrii unui obiect sau la alte clase: 9 Parent - obiectul container al obiectului curent. 9 This - obiectul curent. 9 ThisForm - formularul care conine obiectul curent (formularul curent). 9 ThisFormSet - setul de formulare curent care conine formularul curent. Aceste cuvinte cheie se folosesc pentru a se face referiri la obiecte care nu au fost create nc (ele au fost definite n cadrul clasei) i implicit nu li s-au atribuit nume pentru a fi referite. n timpul execuiei unui program putei s adugai sau s nlturai obiecte dintr-un obiect container folosind metodele obiectului container: AddObject() pentru adugarea i RemoveObject() pentru nlturarea unui obiect. Aceste metode sunt implementate implicit n marea majoritate a claselor predefinite i n clasa custom. Sintaxa lor este: <nume_ob1>.addobject('<nume_ob2>' , '<nume_cls>') unde <nume_ob1> este numele obiectului container la care se adaug obiectul cu numele <nume_ob2> ce se creeaz pe baza clasei <nume_cls> i <nume_ob1>.removeobject('<nume_ob2>') unde <nume_ob1> este numele obiectului container din care se nltur obiectul cu numele <nume_ob2>. Obiectul nlturat nu va mai fi afiat pe ecran. Observaii: n sintaxa celor dou funcii numele obiectului container a fost separat prin operatorul punct de numele metodei membru al obiectului container. Exemplu: n acest exemplu putei observa cum este folosit operatorul :: pentru a apela o metod din clasa printe (n clasa F2 este apelat metoda click definit n clasa F1 care este clasa printe a clasei F2) i referina This pentru a preciza c este vorba de obiectul curent, adic obiectul creat pe baza clasei F2 (This.Backcolor se refer la proprietatea Backcolor a obiectului curent - culoarea fundalului): * Se creeaza clasa F1 care are ca parinte clasa Form define class F1 as Form procedure click wait window 'S-a executat clic in formular' endproc enddefine * Se creeaza clasa F2 care are ca parinte clasa F1 define class F2 as F1 procedure click F1::click This.BackColor=This.BackColor+1 endproc enddefine Exemplu: n acest exemplu putei observa cum pot fi folosite metodele proprii ale obiectului, cum pot fi modificate proprietile unui obiect, cum se fac referirile la proprietile i metodele unui obiect i cum este folosit operatorul punct n aceste referiri:
217
F1=createobject('form') && se creeaza un obiect formular * Se modifica valoarea proprietatilor caption (legenda) si * closable (daca formularul poate fi nchis folosind meniul de * control - .T. sau nu - .F.) F1.caption='Exemplu' && Numele obiectului este separat de numeF1.closable=.F. && le proprietatii prin operatorul punct. * Se adauga la formular o linie si doua butoane de comanda * folosind metoda proprie a obiectului F1.addobject('L1','Line') F1.addobject('B1','CommandButton') F1.addobject('B2','CommandButton') * Se modifica unele proprietati ale obiectelor adaugate F1.B1.caption='Da' && Operatorul punct a fost folosit pentru a F1.B2.caption='Nu' && separa proprietatea de obiect si F1.B1.visible=.T. && obiectul de obiectul container. F1.B2.visible=.T. F1.L1.visible=.T. F1.show && Se apeleaza metoda obiectului prin care; este afisat obiectul
Dac adugai un obiect la un obiect container el nu va fi vizibil. Pentru a-l face vizibil trebuie s i se atribuie proprietii visible valoarea .T. Observaie: Putei specifica proprietile multiple pentru un obiect cu instruciunea with ... endwith . Instruciunea nu poate fi folosit n instruciunea bloc pentru definirea clasei. Ea are sintaxa: with <nume_ob> <secven_instruciuni> endwith Astfel, n exemplul precedent putei modifica proprietile obiectelor adugate astfel: with F1 with B2 with B1 caption='Nu' caption='Da' visible=.T. visible=.T. endwith endwith L1.visible=.T. endwith Mecanismele programrii orientate pe obiecte sunt implementate n Visual FoxPro astfel: ncapsularea. Prin folosirea comenzii define class sunt incluse n aceeai clas definiiile pentru proprietile, metodele i evenimentele unui obiect. Motenirea. O clas poate fi definit pe baza definiiei altei clase folosind clauza as <nume_clas_printe>. Proprietile clasei printe nu vor mai fi definite n clasa derivat, n care vor fi definite numai proprietile i metodele noi.
218 Informatic
9 Datele unui obiect pot fi prelucrate prin metodele proprii obiectului. n timpul acestor pre-
lucrri pot s fie necesare diferite variabile temporare. Acestea trebuie definite ca proprieti ale obiectului pentru a putea fi folosite n interiorul obiectului, dar trebuie izolate de exteriorul lui, deoarece modificarea lor din exterior ar putea afecta prelucrrile din interior. 9 Unele dintre subprograme sunt folosite intern de metodele obiectului i nu trebuie s fie folosite i din exterior. Din aceste dou cazuri se observ c este necesar s fie controlat accesul la membrii unui obiect. De aceea, membrii unui obiect pot fi: 9 Publici. Accesul la aceti membri este posibil din interiorul clasei, dar i din exteriorul ei. 9 Protejai. Accesul la aceti membri este posibil din interiorul clasei i din interiorul unei clase derivate din ea. Aceti membri vor fi declarai protejai prin intermediul clauzei protected din definiia clasei. Exemplu define class ang as Custom protected data_n nume=space(20) pren=space(20) adresa=space(30) data_n={ / / } procedure data_ns return this.data_n endproc enddefine Proprietatea data_n este protejat i nu poate fi modificat din exteriorul clasei, n schimb metoda data_ns nu este protejat i poate furniza valoarea proprietii data_n.
219
Afiarea listei obiectelor active (numele lor, propietile, metodele i evenimentele asociate) se face cu comanda: display object [ like <sablon>]
clear set talk off z=CreateObject('Complex') input 're (partea reala a numarului)= ' to z.re input 'im (partea imaginara a numarului)= ' to z.im z.m ?z.modul define class complex as custom re=0 im=0 modul=0 procedure m this.modul=sqrt(this.re**2 +this.im**2) endproc enddefine
220 Informatic
Exemplul 2 Pentru construirea metodei modul se va folosi un subprogram de tip funcie. Prin instruciunea ?z.m() afiai valoarea furnizat de metoda m. Observai c pentru metodele care returnez valori folosite n expresii trebuie s scriei ntre paranteze lista parametrilor actuali (n acest caz lista este vid; nu exist parametri pentru transferul datelor).
clear set talk off z=CreateObject('Complex') input 're (partea reala a numarului)= ' to z.re input 'im (partea imaginara a numarului)= ' to z.im ?z.modul() define class complex as custom re=0 im=0 m=0 function modul this.m=sqrt(this.re**2+this.im**2) return this.m endfunc enddefine
Exemplul 3 Pe baza clasei complex se definete o clas nou complex1 care va conine n plus o metod pentru afiarea numrului complex. Pentru definirea acestei metode se va folosi o metod intern a clasei nrc (metod protejat) pentru calcularea cifrelor unui numr i proprietatea nc care are ca valoare numrul de cifre al prii ntregi sau imaginare a numrului complex. Aceast proprietate este folosit numai intern i de aceea este protejat. Ea este necesar pentru a stabili numrul de poziii afiabile ale unui numr pentru funcia str(). Prin instruciunea z.afiare se apeleaz metoda afisare pentru afiarea unui numr complex. Clasa complex1 a motenit toate proprietile i metodele clasei complex.
clear set talk off z=CreateObject('Complex1') input 're (partea reala a numarului)= ' to z.re input 'im (partea imaginara a numarului)= ' to z.im ?z.modul() z.afisare define class complex as custom re=0 im=0 m=0 function modul this.m=sqrt(this.re**2+this.im**2) return this.m endfunc enddefine define class complex1 as complex protected nr nr=0
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor procedure afisare ? 'Numarul complex este: '+str(this.re,this.nrc(this.re)) do case case this.im>0 ?? ' + i*'+str(this.im,this.nrc(this.im)) case this.im<0 ?? ' - i*'+str(abs(this.im),this.nrc(this.im)) endcase endproc protected function nrc parameter v this.nr=1 do while v<>0 v=int(v/10) this.nr=this.nr+1 enddo return this.nr endfunc enddefine
2 . 3 . P r i n c i p i i l e p r o g r a m r i i c o n d u s e d e ev e n i m e n t e
221
Programarea orientat pe obiecte a dus la dezvoltarea programrii conduse de evenimente. Dac n cazul programrii clasice aplicaia era o colecie de instruciuni care se executau n ordinea n care au fost scrise, n cazul programrii conduse de evenimente aplicaia este un ansamblu de subprograme care nu se execut ntr-o ordine prestabilit, ci n funcie de producerea unor evenimente (deplasarea mouse-ului, executarea unui clic cu mouse-ul, glisarea unui obiect, apsarea unei taste sau a unei combinaii de taste etc). Apariia evenimentului este aleatorie i de aceea programul trebuie s tie cum s rspund la un anumit eveniment. Acest lucru se realizeaz prin asocierea la fiecare eveniment a unei secvene de cod prin care se descriu operaiile care trebuie executate. Programarea condus de evenimente se bazeaz pe bucla evenimentului (event loop), adic un mediu interactiv n execuie care poate fi: activat cu comanda read events care pornete procesorul de evenimente care va sesiza apariia unui eveniment i dezactivat cu comanda clear events care l oprete. Dup oprirea procesorului de evenimente programul va continua cu prima instruciune care urmeaz dup comanda read event.
2 . 4 . F o l o s i r e a p r o g r a m r i i o r i e n t a t e p e o b i e c t e n r e a l i z a r e a i n t e r f e e i u n e i a p l i c a i i
Interfaa grafic cu o aplicaie afieaz mai multe ecrane cu obiecte prin intermediul crora utilizatorul interacioneaz cu aplicaia pentru a controla evoluia ei sau pentru a cere s execute diferite procese prin care se prelucreaz datele n vederea obinerii de informaii (de exemplu, procesul de cutare ntr-o baz de date a unor date care corespund unui anumit criteriu).
222 Informatic
Orice interfa grafic este realizat din obiecte care au asociate proprieti, metode i evenimente. Obiectul virtual este o sum de proprieti, metode i evenimente. Asupra obiectelor virtuale se pot folosi n general urmtoarele aciuni: clic, dublu clic, glisare i apsarea unei taste. Prin asociere cu balonul s identificm care sunt proprietile, metodele i evenimentele asociate unui obiect, cum ar fi butonul declanator dintr-o caset de dialog. Proprietile sale sunt numele su, poziia n care este afiat fa de marginile ca-setei de dialog, culoarea butonului i a textului etc. Aciunile care se pot executa asupra butonului sunt: indicare cu mouse-ul i clic sau apsarea unei anumite taste. Evenimentul reprezint efectul acionrii butonului prin intermediul mouse-ului sau al tastaturii, adic rspunsul sistemului n urma acionrii butonului. De exemplu, evenimentul asociat butonului Open este deschiderea obiectului selectat n caseta de dialog (fiier sau dosar). Programarea orientat pe obiecte poate fi folosit pentru realizarea unei interfee deoarece sistemul de gestiune a bazelor de date Visual FoxPro pune la dispoziia utilizatorului mai multe clase vizuale predefinite: Numele clasei CheckBox Column Clasa predefinit Semnificaia obiectului vizual Comutator Coloan ntr-o gril Control care indic dac o opiune este activ (on) sau nu (off). Container care conine antetul de coloan i alte obiecte care pot s apar ntr-o coloan a unei grile; nu poate fi folosit independent, ci numai ntr-un container de tip gril. Control similar unei combinaii dintre o caset de text (TextBox) i o list (ListBox) n care putei introduce o valoare sau o putei alege dintr-o list. Control asociat unei comenzi: dac la un moment dat executai clic pe un buton, se execut comanda asociat butonului.
ComboBox
List combinat
Grup de butoane Container care poate conine numai un grup de de comand butoane de comand care pot fi tratate ca o unitate. Obiect container Obiect container Container care conine alte obiecte neprotejate (este permis accesul la obiectele coninute). Container care poate include i obiecte ale utilizatorului, obiectele incluse fiind protejate (nu este permis accesul la obiectele coninute). Control care furnizeaz o zon pentru introducerea sau vizualizarea unui text ntr-un formular (permite afiarea pe mai multe linii). Container care poate conine o colecie de mai multe pagini (care se pot comporta ca o caset de dialog sau ca o fereastr standard), controale i containere pentru afiarea i editarea datelor i controale utilizator (custom).
EditBox
Form
223
Clasa predefinit Semnificaia obiectului vizual Set de formulare Gril Container care poate conine unul sau mai multe formulare legate ntre ele sau bare cu instrumente. Container care creeaz o gril pentru prezentarea datelor pe rnduri i coloane, sub form de tabel; poate conine numai controale de tip coloan ntr-o gril.
Header
Antet de coloan Obiect care conine antetul coloanei i care nu poate fi folosit independent, ci numai ntr-un container de tip coloan ntr-o gril. Imagine Control care permite introducerea unei imagini ntr-un formular; imaginea este memorat ntr-un fiier bitmap (.bmp). Control care conine un text ce descrie o zon de formular sau un control. Control care deseneaz ntr-un formular o linie pe vertical, pe orizontal sau pe diagonal. Control care furnizeaz o list de articole din care utilizatorul poate alege unul dintre ele. Container cu controale OLE (fiiere .ocx; au propriul set de evenimente) i obiecte OLE inserabile (obiecte OLE create cu o alt aplicaie - Word, Excel etc.; ele nu au propriul set de evenimente).
Image
Control container Controale folosite n formulare sau rapoarte care de tip OLE permit afiarea coninutului unui obiect OLE ntr-un cmp General al unui tabel. Buton de opiuni (radio) Grup cu butoane de opiuni (radio) Pagin Obiect care nu poate fi folosit independent, ci ntr-un container de tip grup de butoane de opiuni pentru a reprezenta o opiune. Container folosit pentru a grupa numai controale de tip butoane de opiuni; putei folosi un buton pentru a alege o opiune dintr-un set de opiuni. Container folosit pentru crearea casetelor de dialog cu mai multe seciuni (tabs); nu poate fi folosit independent, ci ntr-un container de tip set de pagini i poate conine orice controale i containere. Container care conine una sau mai multe pagini.
PageFrame Separator
Set de pagini
Separator pe bara Obiect care nu poate fi folosit independent, ci ntr-un de utiliti container de tip bar cu instrumente; este folosit pentru a introduce spaii ntre controale cu scopul de a crea grupuri de butoane. Form Control care creeaz o form care poate fi afiat ca o combinaie de dreptunghiuri, cercuri i elipse.
Shape
224 Informatic
Numele clasei Spinner Clasa predefinit Semnificaia obiectului vizual Caset de text cu Control care permite incrementarea sau decremenderulor mentarea unei valori fie prin scrierea valorii noi, fie executnd clic pe sgeata de incrementare sau pe sgeata de decrementare. Caset de text Control care furnizeaz o zon pentru introducerea sau vizualizarea unui text ntr-un formular; permite afiarea pe o singur linie.
TextBox
Timer
Obiect de tip ceas Control invizibil folosit pentru a executa secvene de cod la intervale de timp egale (controleaz evenimentele recurente din aplicaie). Bar cu instrumente Container care poate conine orice controale; este format dintr-un set de butoane pe care putei executa clic ca s cerei excutarea unei anumite sarcini.
ToolBar
Ai observat c obiectele vizuale pe care le putei crea pot fi simple sau containere. n general, obiectele container nu pot conine orice obiecte. De exemplu: Container grup de butoane de comand grup cu butoane de opiuni set de pagini pagin set de formulare formular gril coloan ntr-o gril Coninut butoane de comand butoane de opiuni pagini controale, containere, obiecte utilizator formulare, bare de instrumente set de pagini, controale, containere, obiecte utilizator coloane ntr-o gril antet de coloan i orice obiect cu excepia formularelor, a seturilor de formulare, a coloanelor ntr-o gril i a barelor cu instrumente controale, seturi de pagin, containere
bar de instrumente
Ai mai observat c unele obiecte nu pot fi definite independent, ci numai n interiorul unui container. De exemplu: Obiect antet de coloan buton pentru opiune coloan ntr-o gril pagin separator Container coloan ntr-o gril grup de butoane pentru opiuni gril set de pagini bar de instrumente
Pe lng aceste obiecte predefinite care creeaz obiecte vizuale ntr-o aplicaie, mai putei folosi urmtoarele obiecte predefinite:
225
Numele clasei Clasa predefinit Semnificaia obiectului vizual Cursor Cursor Obiect creat atunci cnd se adaug un tabel sau o vizualizare la mediul de date dintr-un tabel, dintr-un formular sau dintr-un set de formulare; permite specificarea proprietilor tabelului sau ale vizualizrii atunci cnd este lansat n execuie formularul sau raportul. Obiect creat atunci cnd se stabilete o relaie ntre dou tabele ntr-un raport, formular sau set de formulare; permite determinarea modului n care sunt legate cele dou tabele. Obiect container pentru obiectele cursor i relaie asociate unui formular, raport sau set de formulare; se creeaz o dat cu raportul, formularul sau setul de formulare.
Relation
Relaie
Mediu de date
Folosind clasele vizuale predefinite s-au creat trei formulare: primul formular conine o etichet i dou butoane de comand, care dac vor fi acionate vor deschide fiecare cte un alt formular u o etichet i un buton de comand. Fiecare buton reacioneaz diferit la evenimentul clic cu mouse-ul, i de aceea a fost scris cte o procedur pentru fiecare eveniment: b1.click, b2.click, b3.click i b4.click. Metoda release se folosete pentru a terge din memorie obiectul de tip formular.
forma1=createobject('Form1') forma2=createobject('Form2') forma3=createobject('Form3') * Afiseaza primul formular: forma1.show read events define class form1 as Form
226 Informatic
* Se adauga obiecte la * formular add object text as Label add object b1 as CommandButton add object b2 as CommandButton * Se definesc proprietatile * obiectului text: text.caption='Ati rezolvat; testul din capitolul; precedent?' text.height=16 text.left=45 text.top=34 text.width=376 text.visible=.T. * Se definesc proprietatile * obiectului b1: b1.caption='Da' b1.height=33 b1.left=40 b1.top=96 b1.width=114 b1.visible=.T. * se definesc proprietatile * obiectului b2: b2.caption='Nu' b2.height=33 b2.left=222 b2.top=96 b2.width=114 b2.visible=.T. * Se defineste codul evenimen* tului click pe obiectul b1: procedure b1.click thisform.release * Afiseaza al doilea formular: forma2.show endproc * Se defineste codul evenimen* tului click pe obiectul b2: procedure b2.click thisform.release * Afiseaza al treilea formular: forma3.show endproc enddefine define class form2 as Form caption='Raspuns' closable=.F. height=143 width=346 add object text1 as Label add object b3 as CommandButton text1.caption='Felicitari; !!!!!!!!!!!!' text1.height=16 text1.left=110 text1.top=34 text1.width=376 text1.visible=.T. b3.caption='Terminare' b3.height=33 b3.left=110 b3.top=86 b3.width=114 b3.visible=.T. procedure b3.click * Elibereaza formularul si * dezactiveaza procsorul de * evenimente: thisform.release clear events endproc enddefine define class form3 as form caption='Raspuns' closable=.F. height=143 width=346 add object text2 as Label add object b4 as CommandButton text2.caption='????????????; !!!!' text2.height=16 text2.left=110 text2.top=34 text2.width=376 text2.visible=.T. b4.caption='Terminare' b4.visible=.T. b4.height=33 b4.left=110 b4.top=86 b4.width=114 procedure b4.click * Elibereaza formularul si * dezactiveaza procesorul de * evenimente: thisform.release clear events endproc enddefine
227
2 . 5 . B i b l i o t e c i l e d e c la s e
Biblioteca de clase (class library) este folosit pentru a pstra o colecie de clase vizuale. Se memoreaz ntr-un fiier cu extensia .vcx. Asupra unei biblioteci de clase se pot executa urmtoarele operaii: crearea bibliotecii
create classlib
adugarea unei clase Opreaii de ntreinere
add class
nlturarea unei clase
remove class
Biblioteca deschidere bibliotec
set classlib to
Opreaii de exploatare biblioteca precizat
release classlib
nchidere bibliotec toate bibliotecile
set classlib to
Comanda create classlib are sintaxa: create classlib <nume_bib> i creeaz o bibliotec de clase cu numele <nume_bib> (implicit i numele fiierului). Biblioteca va fi vid. Comanda add class are sintaxa: add class <nume_cls> [of <nume_bib1>] to <nume_bib1> [overwrite] La biblioteca precizat prin <nume_bib1> se adaug clasa identificat prin <nume_cls>. Implicit aceast clas poate fi n orice bibliotec deschis. Explicit ea este preluat din biblioteca precizat prin clauza of i identificat prin <nume_bib2>. Biblioteca nu poate fi adugat dintr-un program, dintr-o aplicaie sau dintr-un fiier de proceduri. Comanda remove class are sintaxa: remove class <nume_cls> of <nume_bib>] i nltur definiia clasei cu numele <nume_cls> din biblioteca precizat prin <nume_bib>. Comanda set classlib to are sintaxa: set classlib to <nume_bib> [additive]
228 Informatic
cnd deschide biblioteca precizat prin <nume_bib> sau sintaxa: set classlib to cnd nchide toate bibliotecile deschise. Comanda release classlib are sintaxa: release classlib <nume_bib> i nchide biblioteca precizat prin <nume_bib>. Observaie:
?
Ce se ntmpl dac nlturai dintr-o Dac ai deschis o bibliotec, toate definiiile bibliotec de clase o clas printe claselor vor fi pstrate n memoria intern. Dac pentru alte clase din bibliotec? vrei s le tergei, putei folosi comanda clear: clear <nume_bib> Trebuie s avei grij ca atunci cnd executai aceast operaie de tergere s nu existe o instan a nici unei clase din bibliotec.
Creai un fiier care conine un program surs i-l lansai n execuie 1. Creai un obiec care s conin proprietile nume, prenume, adresa, data_n (data naterii), vrsta i metoda pentru calcularea vrstei. Metoda poate fi descris fie folosind o procedur, fie folosind o funcie. Testai programul. Metoda descris cu procedur: ang = createobject('angajati') ? ang.varsta with ang define class angajati AS custom .nume = 'Popa' nume = space(20) .pren = 'Ion' pren = space (20) .adresa = 'str. Zorilor nr. 34' adresa = space (30) .data_n = {02/07/83} data_n = { \ \ } endwith varsta = 0 clear procedure v ? ang.nume + ' ' + ang.pren this.varsta=int((date()-; ? ang.adresa this.data_n)/365) ? ang.data_n endproc ang.v enddefine Metoda descris cu funcie (observai informaiile afiate despre obiect): *Scrieti secventa corespunzapren = space (20) *toare de instructiuni adresa = space (30) clear data_n = { \ \ } display object like ang varsta = 0 ? ang.nume + ' '+ ang.pren function v ? ang.adresa this.varsta=int((date()-; ? ang.data_n this.data_n)/365) ? ang.v() return this.varsta ??' ani' endfunc define class angajati as custom enddefine nume = space(20)
229
2. Testai funcia aclass() cu ajutorul urmtorului program: clear obiect = createobject("forma11") for ncount = 1 to aclass(a, obiect) && se creeaza vectorul ? a(ncount) && se afiseaza numele claselor endfor release obiect define class forma1 as form enddefine define class forma11 as forma1 enddefine 3. Testai funcia ainstance() cu ajutorul urmtorului program: clear all obiect1 = createobject('form') obiect2 = createobject('form') obiect3 = createobject('form') clear ? ainstance(a,'form') && furnizeaza rezultatul 3 (trei instante) display memory like a && afiseaza referintele 4. Testai funcia amembers() cu ajutorul urmtorului program: clear forma=createobject"form") && creeaza un formular = amembers(a1, forma) = amembers(a2, forma1, 1) = amembers(a3, forma1, 2) display memory like a? 5. Testai lucrul cu biblioteci: create classlib bib create class f1 of bib as 'Form' set classlib to bib additive release classlib bib
clear set talk off punct=CreateObject("puncte") punct.generare ?'Distanta fata de origine: ' ??punct.distanta() ?'Unghiul fata de sistemul de; axe: ' ??punct.argument() define class puncte as custom x=0 y=0 d=0
a=0 procedure generare ? 'Coordonatele punctului:' input 'x= ' to this.x input 'y= ' to this.y endproc function distanta this.d=sqrt(this.x**2+; this.y**2) return this.d endfunc function argument if this.x=0
230 Informatic
if this.y=0 this.a=-this.a+pi() this.a=0 endif else else this.a=pi()/2 if this.y<0 endif this.a=-a+2*pi() else endif this.a=atan(abs(this.x/; endif this.y)) endif if this.x<0 this.a=this.a*180/pi() if this.y<=0 return this.a this.a=this.a+pi() endfunc else enddefine a. Identificai clasele i obiectele, proprietile i metodele obiectului. b. Explicai ce realizeaz programul. c. Pe baza acestui program definii obiectul dreapt cu metodele generare i calculul lungimii i obiectul dreptunghi cu metodele generare i calculul ariei i al perimetrului.
2. Identificai i corectai erorile din urmtorul program:
clear set talk off z=CreateObject("Complex") z.citire ?z.modul() define class complex as custom dimension c(2) m=0 procedure citire
input 'x= ' to z.c(1) input 'y= ' to z.c(2) endproc function modul this.m=sqrt(this.c(1)**2+; this.c(2)**2) return this.m endfunc enddefine
3. Comparai urmtoarea variant de program cu cea prezentat ca exemplu n studiul de caz. Verificai dac aceast variant este corect. Ce concluzie tragei din compararea celor dou versiuni?
clear set talk off z=CreateObject("Complex") input 're= ' to z.re input 'im= ' to z.im ?z.m(z.re,z.im) define class complex as custom re=0
im=0 m=0 function modul parameter re,im this.modul=sqrt(re**2+im**2) return this.m endfunc enddefine
procedure citire input 're= ' to this.re input 'im= ' to this.im endproc
Modificai corespunztor programul astfel nct citirea numrului complex s se fac prin intermediul acestei metode.
231
5. Adugai obiectului complex o metod pentru calculul conjugatului numrului complex i pentru calculul argumentului numrului complex. Scriei un program n care folosii aceste metode. 6. Definii o clas de obiecte pentru adunarea i nmulirea a dou numere complexe. Scriei un program n care folosii obiecte din aceast clas. 7. Definii o clas de obiecte prin care administrai o list de numere. Clasa trebuie s conin o metod pentru adugarea unui element la list, tergerea ultimului element din list, afiarea elementelor listei, cutarea unui element n list i afiarea elementului cu valoarea maxim. Scriei un program n care folosii obiecte din aceast clas. 8. Definii o clas de obiecte prin care administrai fraciile. Clasa trebuie s conin metode pentru citirea numitorului i a numrtorului fraciei, pentru simplificarea fraciei, pentru afiarea fraciei simplificate, pentru calculul fraciei ca numr zecimal, pentru afiarea fraciei ca numr zecimal. Scriei un program n care folosii obiecte din aceast clas. 9. Definii o clas de obiecte prin care administrai mulimi de numere. Clasa trebuie s conin metode pentru citirea i afiarea mulimii, pentru reuniunea, intersecia i diferena a dou mulimi i pentru determinarea apartenenei unui element la mulime. Mulimile vor fi descrise prin vectori cu elemente cu valori distincte. Scriei un program n care folosii obiecte din aceast clas. 10. Definii o clas de obiecte prin care administrai polinoame. Clasa trebuie s conin metode pentru citirea i afiarea polinoamelor, pentru adunarea i nmulirea a dou polinoame i pentru calcularea valorii unui polinom pentru un x precizat. Polinoamele vor fi descrise prin vectori n care n prima poziie se va scrie gradul polinomului, iar n urmtoarele n+1 poziii, coeficienii polinomului. Scriei un program n care folosii obiecte din aceast clas.
ncercai:
Adevrat/Fals: 1. n definiia unei clase de obiecte metodele se scriu naintea proprietilor. 2. ntr-un program definiia clasei de obiecte se face naintea de a crea obiectul. 3. ntr-o metod nu se poate defini o clas de obiecte. 4. Parametrii metodelor pot avea acelai nume ca i proprietile obiectului. 5. Instruciunea with ... endwith poate fi folosit n instruciunea pentru definirea unei clase. 6. Clasele pot fi adugate la biblioteci din fiiere de programe. 7. O clas printe motenete proprietile i metodele de la urmai. 8. n definiia unei clase trebuie precizat obligatoriu clasa printe. 9. Aciunea metodelor i rspunsul la evenimente se definete cu ajutorul subprogramelor. Completai: 1. Instruciunea pentru definirea clasei este o instruciune ........... delimitat de cuvintele cheie ............................... i .............................. 2. Aciunea metodelor se definete prin intermediul .........................
232 Informatic
Alegei rspunsurile corecte: 1. Putei aduga un obiect la un obiect container cu: a) instruciunea Add Object b) metoda AddObject c) instruciunea Add Class 2. Aflai ci strmoi are o clas folosind funcia: a) aclass() b) ainstance() c) amembers() 3. Aflai cte obiecte au fost realizate pe baza aceleiai clase folosind funcia: a) aclass() b) ainstance() c) amembers() 4. Form este: a) o clas vizual de tip container predefinit b) o clas vizual simpl predefinit c) un obiect vizual din clasa predefinit PageFrame. 5. Header este: a) un obiect independent predefinit b) un obiect predefinit dependent de clasa Column c) un obiect predefinit dependent de clasa Grid. Rspundei: 1. Realizai o comparaie ntre modurile n care este implementat programarea pe obiecte n limbajul de programare structurat studiat i limbajul gazd Visual FoxPro. 2. Ce tehnici caracteristice programrii pe obiecte sunt implementate n Visual FoxPro?
R spunsuri:
Adevrat/Fals: 1-F; 2-F; 3-A; 4-A; 5-F; 6-F; 7-F; 8-A; 9-A;. Completai: 1-bloc, define class, enddefine; 2-subprogramelor; Alegei rspunsurile corecte: 1-b; 2- a; 3- b; 4-a; 5-b.
3 . P r o g r a m a r e a v i z u a l
3 . 1 . R e a l i z a r e a i n t e r f e e i
Controalele sunt obiecte care sunt create n general n formulare i sunt folosite pentru a asigura interaciunea utilizatorului cu aplicaia: prin intermediul lor utilizatorul comunic aplicaiei datele de intrare i procesele pe care trebuie s le execute, iar aplicaia comunic utilizatorului datele de ieire i mesaje de informare sau de atenionare.
233
Fiecare tip de control are propriul su set de proprieti, metode i evenimente care l fac potrivit unui anumit scop. Unele dintre cotroalele pe care le putei folosi n aplicaii sunt cele mai potrivite pentru introducerea i afiarea datelor. Altele v permit s cerei executarea unui proces n cadrul aplicaiei sau v permit accesul la alte aplicaii ca s putei prelucra unele date ca i cum ar face parte din propria aplicaie. ntr-o interfa pot fi folosite urmtoarele tipuri de controale: 9 controalele pentru executarea aciunilor: butonul de comand, opiunea de meniu; 9 controalele pentru introducerea i afiarea datelor: eticheta, caseta de text, zona de editare, caseta de text cu derulor, grila; 9 controalele care i permit utilizatorului s aleag: comutatorul, lista, lista combinat, grupul cu butoane de opiuni; 9 controalele grafice: linia, chenarul, imaginea, forma; 9 controalele care i permit afiarea obiectelor inserabile create cu alte aplicaii.
Formularul este un obiect container care grupeaz alte obiecte. Are proprieti specifice i metode care determin comportamenul su n diferite situaii.
Suprafaa de afiare a formularelor este mprit n dou zone: 9 bara de titlu (title bar) mpreun cu butoanele de manipulare ale formularului i 9 spaiul de lucru (workspace) n care pot fi afiate diferite controale cu care poate interaciona utilizatorul. Formularele pot fi de tip: 9 Fereastr (window). Utilizatorul interacioneaz cu fereastra atunci cnd lanseaz n execuie aplicaia. Ferestrele pot fi redimensionate i pot fi deplasate pe ecran. n fereastra de aplicaie pot fi deschise alte formulare de tip fereastr numite ferestre document n care utilizatorul poate prelucra diferite colecii de date ale aplicaiei (n aplicaia Visual FoxPro, fereastra care se deschide atunci cnd prelucrai un fiier surs este o fereastr document). Ferestrele asociate unei aplicaii pot avea sub bara de titlu o bar de meniu cu titlurile meniurilor pe care aplicaia le pune la dispoziia utili-zatorului. Ferestrele document nu au bar de meniuri. 9 Caset de dialog (dialog box). Se deschide n urma unei comenzi prin care se cere declanarea unui proces. Prin intermediul ei utilizatorul poate s furnizeze datele necesare executrii unui proces pe care l-a activat fie prin acionarea unui buton de comand, fie prin alegerea unei opiuni de meniu. Mai poate fi folosit pentru ca aplicaia s afieze pentru utilizator informaii despre desfurarea unui proces. Spre deosebire de formularul fereastr, caseta de dialog nu are buton de minimizare sau de maximizare, poate fi deplasat pe ecran, dar nu poate fi redimensionat. Cele mai folosite controale ntr-o caset de dialog sunt casetele de text, etichetele i butoanele de comand. Casetele de dialog pot fi simple sau cu seciuni. O caset de dialog cu seciuni (tabs) poate afia n aceeai zon a formularului mai multe seturi de obiecte. Fiecare set de obiecte formeaz o seciune. La un moment dat este afiat o singur seciune. Se recomand acest tip de caset atunci cnd ntr-o caset trebuie create foarte multe controale i ele nu ncap n spaiul formularului. Controalele se vor grupa dup anumite criterii i fiecare grup va fi afiat ntr-o seciune a casetei. Un exemplu de caset de dialog cu seciuni este caseta Option a interfeei Visual FoxPro.
234 Informatic
9 Bare cu instrumente (toolbar). Este o caset de dialog mai special care conine numai butoane de comand reprezentate n general prin pictograme. Ea poate fi mobil (float), adic poate fi afiat oriunde n interiorul ferestrei de aplicaie sau fix (dock), adic poate fi lipit de una dintre marginile ferestrei de aplicaie. Bara de titlu este afiat numai n barele cu instrumente flotante.
Pentru implementarea acestor obiecte pentru interfa, Visual FoxPro pune la dispoziia programatorului urmtoarele obiecte vizuale predefinite: 9 Pentru formulare: FormSet, Form, Page, ! PageFrame i ToolBar. Asociai obiectele vizuale predefinite 9 Pentru controale: EditBox, TextBox, Label, prezentate n capitolul anterior, cu tipuSpinner, Grid, OptionButtonGroup, ListBox, rile de controale definite n acest capitol. ComboBox, CheckBox, CommandButton. Crearea obiectelor de interfa se poate face n dou moduri: 9 Prin crearea unui program n care obiectele sunt descrise prin intermediul instruciunilor de program. La crearea obiectelor se pot folosi clasele predefinite de obiecte specifice programrii orientate pe obiecte. Dup crearea programului surs, pentru a realiza interfaa, trebuie lansat n execuie programul cu comanda do <nume_fiier>. 9 Folosind programarea vizual. n acest caz, caracteristicile formularelor sunt nregistrate sub forma unui tabel ntr-un fiier de date care are extensia .scx. Aceste date sunt interpretate de un modul al sistemului. Lansarea n execuie a acestui modul, mpreun cu fiierul care conine tabelul (<nume_formular>) se face cu comanda: do form <nume_formular> with <lista_parametri_actuali> Comanda de lansare n execuie va crea formularul. Ea poate fi scris ntr-un modul de program (modulul apelant al formularului). Adverbul <lista_parametri_actuali> reprezint o list de variabile i/sau constante de tipuri diferite care se transmit formularului la lansarea n execuie.
tivitatea cu utilizatorul? Elementele de interfa ale unei aplicaii sunt dependente de funciile pe care trebuie s le ndeplineasc aplicaia. n plus, atunci cnd se proiecteaz interfaa unei aplicaii, trebuie proiectate i urmtoarele elemente:
235
Formularul de nceput (startup form). Este primul formular care se afieaz i reprezint ce va vedea prima dat utilizatorul cnd va porni aplicaia. Unele interfee nu au un formular specific de nceput. Acest caz apare atunci cnd aplicaia ncepe cu ncrcarea unui fiier de date i testarea unor date, iar primul formular care va fi afiat va depinde de rezultatul testului. Formularul de nceput poate fi o caset prin care se cere introducerea unei parole prin care utilizatorul i ctig dreptul de a folosi aplicaia. Asupra parolei se pot pune restricii. De exemplu, dac utilizatorul nu a introdus parola corect din trei ncercri, se va afia un mesaj de eroare i se va termina execuia programului. Ecranul introductiv (splash screen). Dac dureaz foarte mult ncrcarea i lansarea n execuie a unei aplicaii, este bine ca n acest timp s fie afiat un ecran introductiv n care se poate afia un mesaj sau emblema firmei. Formularul de sfrit (ending form). Este ultimul formular care se afieaz la terminarea aplicaiei. Este bine ca acest formular s conin un buton de nchidere a aplicaiei care s fie acionat de utilizator, operaie care s ofere sigurana nchiderii tuturor fiierelor i descrcrii tuturor formularelor interfeei aplicaiei. Unele interfee rezolv nchiderea aplicaiei prin opiunea de meniu ExitFile, care termin execuia aplicaiei, nchide toate fiierele i descarc toate formularele deschise. nainte de a se proiecta interfaa trebuie s se cunoasc scopul aplicaiei. Unele aplicaii sunt folosite n mod constant, iar altele ocazional pe o perioad scurt de timp. De asemenea, o aplicaie care are ca scop principal afiarea informaiilor are cerine diferite fa de una care este folosit pentru a colecta date. Interfaa este influenat i de categoria de utilizatori care o va folosi. Dac sunt utilizatori nceptori, interfaa trebuie s fie ct mai simpl, iar dac utilizatorii sunt experimentai ea poate s fie mai complex. n plus, dac aplicaia va cunoate o distribuie internaional, trebuie s in cont de limba i cultura viitorilor utilizatori. Orice interfa trebuie s ndeplineasc urmtoarele cerine ale utilizatorului: 9 Interfaa trebuie s-i permit utilizatorului s controleze evoluia programului. 9 Sistemul de meniuri trebuie s fie concis, eficient, logic i bine structurat. 9 Ecranul nu trebuie aglomerat cu obiecte. Dac o fereastr conine prea multe butoane, ele ar trebui nlocuite cu opiuni de meniu. Se vor afia sub form de butoane numai controalele care sunt folosite foarte des. 9 Interfaa trebuie s-i ofere utilizatorului o reprezentare vizual complex a opiunilor de lucru ale aplicaiei la momentul respectiv. Folosirea porprietilor de disponibilitate sau de vizibilitate ale unui obiect vizual este foarte important deoarece mpiedic accesul uitilizatorului la obiectele care nu pot fi acionate n acel moment. 9 Utilizatorul trebuie s fie informat continuu de starea programului. Dac un proces dureaz prea mult timp, interfaa nu trebuie s nghee, deoarece utilizatorul nu mai tie dac procesul continu sau s-a blocat. n acest caz, utilizatorul va fi informat c procesul continu fie prin transformarea formei cursorului, fie prin afiarea unui contor care numr paii parcuri de proces, fie prin afiarea unui indicator de evoluie, fie prin imagini grafice animate. 9 Interfaa trebuie s permit anularea unor operaii pentru ca utilizatorul s-i poat corecta uor unele greeli, fie de introducere a datelor, fie de prelucrare a lor. Pentru operaiile de tergere este bine s cerei confirmarea operaiei. Pentru operaiile de introducere a datelor trebuie s prevedei ct mai multe operaii de verificare a
236 Informatic
corectitudinii datelor introduse (prin compararea lor cu limitele permise, prin introducerea acelorai date de dou ori i compararea celor dou valori introduse etc.). 9 Aplicaia trebuie s prevad ct mai multe cazuri de eroare astfel nct s poat funciona n ct mai multe condiii ale datelor de intrare. Orice eroare detectabil trebuie s declaneze un proces de informare a utilizatorului (prin mesaje care s precizeze cauzele erorii i eventual prin sunete pentru atenionare) i de recuperare a datelor.
moment dat deschiderea unui singur document (de exemplu aplicaia Notepad). Dac vrei s deschidei un nou document, trebuie nchis cel precedent (dac alegei opiunea NewFile pentru a deschide un nou document, documentul curent va fi nchis).
Interfa cu mai multe documente (multiple-document interface - MDI) care permite
deschiderea mai multor documente (de exemplu aplicaia Word). La un moment dat pot fi deschise mai multe documente, fiecare document n fereastra sa (dac este deschis un document i alegei opiunea NewFile, aplicaia va crea un nou formular n care va fi deschis noul document). Acest stil de interfa poate fi recunoscut prin existena n bara de meniuri a titlului meniului Window ale crui opiuni sunt folosite la manipularea ferestrelor cu documente. Unul singur dintre documente este activ, adic documentul care primete datele introduse de la tastatur de ctre utilizator. Formularul documentului activ este obiectul focalizat din interfaa aplicaiei.
Interfa de explorare (explorer-style interface) care conine o singur fereastr
mprit n dou regiuni numite panouri (panel). De obicei, panoul din stnga conine un arbore sau o structur ierarhic, iar panoul din dreapta o zon de afiare a unei liste (de exemplu aplicaia Windows Explorer). Un astfel de tip de interfa se folosete atunci cnd trebuie s se caute ntr-o list mare cu articole (fiiere, documente, imagini etc.) prin operaia de rsfoire (browse). Stilul interfeei se alege n funcie de tipul aplicaiei. Stilul MDI se folosete la aplicaiile care necesit frecvent vizualizarea simultan a mai multor documente pentru a le compara sau pentru a face transfer de date ntre ele cum este de exemplu procesorul de texte (Word). n cazul altor tipuri de aplicaii (cum sunt aplicaiile de tip calendar sau calculator) este suficient s se deschid un singur document i de aceea se folosete o interfa SDI. n general, stilul SDI este cel mai rspndit deoarece este un stil de interfa pe care proiectantul produsului o creeaz mai uor i care este mai simpl i pentru utilizator. Stilul MDI permite crearea unei interfee care administreaz mai multe formulare ntr-un singur formular container. Formularul container se mai numete i fereastr printe (parent window), iar formularele din interiorul su se numesc ferestre copil (child windows). O aplicaie MDI poate avea un singur formular printe i mai multe formulare copil. Formularul printe nu poate fi un formular modal. Ferestrele copil pot fi de acelai tip sau de tipuri diferite. Fereastra printe furnizeaz un spaiu de lucru (workspace) pentru toate ferestrele copil ale aplicaiei. Spaiul de lucru este delimitat de bordura formularului printe i este situat sub bara de meniu.
237
Formularele interfeei MDI au urmtoarele caracteristici: 9 Formularele copil pot fi afiate numai n spaiul de lucru al formularului printe. Utilizatorul poate muta sau redimensiona formularele copil ca pe orice alt formular, cu deosebirea c operaiile sunt limitate de spaiul de lucru al formularului printe. 9 Cnd un formular copil este minimizat, pictograma sa apare n formularul printe i nu pe bara de aplicaii. Cnd un formular printe este minimizat, formularul printe i toate formularele copil care i aparin vor fi reprezentate printr-o singur pictogram. Cnd formularul printe este restaurat, sunt restaurate mpreun cu el i formularele copil care vor fi afiate n aceeai stare n care erau nainte de minimizare. 9 Cnd un formular copil este maximizat, legenda sa este combinat cu legenda formularului printe i afiat n bara de titlu a formularului printe. 9 Meniurile care pot fi folosite n formularul copil activ sunt afiate n bara de meniu a formularului printe i nu n formularul copil. Tipul formularului este controlat cu proprietatea MDIForms care este de tip logic (are valoarea .T. pentru un formular MDI i valoarea .F. pentru un formular SDI). Filiaia formularelor (dac un formular este formular copil sau formular printe) este controlat cu proprietatea ShowWindows care este de tip numeric: 0 - Screen - formularul este creat n fereastra principal Visual FoxPro (implicit). 1 - In Top Level Form - formularul este copilul formularului activ de cel mai nalt nivel i este afiat n acest formular. Atunci cnd este minimizat nu este afiat n bara de aplicaii Windows (TaskBar). Se recomand pentru ferestrele document ale unei ferestre de aplicaie. 2 - As Top Level Form - este un formular independent nemodal n care pot fi plasate formulare copil. Nu are printe i poate fi folosit fie ca fereastr ntr-o interfa SDI, fie ca fereastr printe ntr-o interfa MDI. Atunci cnd este minimizat este afiat n bara de aplicaii Windows. Se recomnad s o folosii pentru fereastra aplicaiei. Prin proprietatea de tip logic Desktops controlai locul n care va fi creat formularul: dac este .T. se creeaz oriunde pe ecran, iar dac este .F. se creeaz n fereastra aplicaiei Visual FoxPro (implicit). Variabila de memorie de sistem _Screens poate fi folosit pentru a referi fereastra implicit a aplicaiei Visual FoxPro, astfel nct putei manipula aceast fereastr ca pe un obiect: putei s-i modificai proprietile, putei s-i apelai metodele dar nu putei crea proceduri pentru evenimente.
238 Informatic
Proprietile standard (proprietile comune majoritii obiectelor) sunt: 9 Numele obiectului - Name . Se folosete pentru a referi obiectul n program. 9 Dimensiunile obiectului. Sunt de tip numeric i se exprim n pixeli. Sunt date de: Height - nlimea (dimensiunea pe vertical) i Width - limea (dimensiunea pe orizontal). 9 Coordonatele obiectului. Reprezint un sistem de dou coordonate [x,y] prin care se stabilete poziia obiectului fa de colul din stnga sus al reperului (ecranul sau formularul din care face parte). Pentru stabilirea coordonatelor se folosesc proprietile de tip numeric, exprimate n pixeli : Left - poziia pe orizontal, fa de marginea stng a reperului (x), Top - poziia pe vertical, fa de marginea de sus a reperului (y), 9 Legenda - Caption . Este un text prin care utilizatorul poate identifica rolul obiec! tului. n cazul formularelor, legenda este Proprietatea Name se folosete pentru afiat n bara de titlu. n cazul controaleidentificarea obiectului n interior (la nivel lor, este afiat n interiorul lui sau lng el. de program, de ctre programator), iar Au legend urmtoarele controale: butonul proprietatea Caption se folosete pentru identificarea lui n exterior (la nivel de de comand, comutatorul, butoanele de interfa, de ctre utilizator). opiuni, cadrele, eticheta, meniul. Proprietatea este de tip ir de caractere. 9 Caracteristicile caracterelor folosite n formular. Sunt trei proprieti prin care se caracterizeaz textele: FontName - numele fontului, de tip ir de caractere: Arial, Courier New, Times New Roman etc., FontSize - dimensiunea, de tip numeric, exprimat n pixeli. stilul caracterelor de tip logic: FontBold - ngroat, FontItalic - aplecat, FontUnderline - subliniat, FontCondense - condensat, FontExtend - extins, FontOutline - cu contur, FontStrikethrough - tiat i FontShadow - cu umbr. 9 Culoarea folosit la afiarea textului este specificat prin proprietile de tip nume-ric ce reprezint codul culorii astfel: BackColor - culoarea fundalului obiectului n care este afiat textul; ForeColor - culoarea primplanului, adic a textului sau a imaginii din obiect. 9 Chenarul (Border) este folosit la unele obiecte (formularul, eticheta, caseta de text, grila, imaginea, caseta de imagine, linia, forma) ca un delimitator. Chenarul poate fi fix sau dimensionabil, trasat cu linie simpl
Cod 0 1 2 3 4 5 6 0 1 2 Semnificaie cod chenar Controale Transparent (invizibil) Solid (implicit; linie continu) Dash (linie ntrerupt) Dot (linie punctat) Dash - Dot (linie format din grupuri de o linie urmat de un punct) Dash - Dot -Dot (linie format din grupuri de o linie urmat de dou puncte) Inside Solid (linie continu n interior) Formulare No border (fr chenar) Fixed Single (chenar simplu) Fixed Dialog (chenar de tip caset de dialog, care nu permite redimensionarea formularului) Sizable (implicit; chenar de tip fereastr, care permite redimensionarea formularului)
239
BorderWidth - grosimea liniei cu care este trasat chenarul este de tip numeric i este exprimat n puncte: 1 punct, 3 puncte etc.; LineSlant - modul de trasare este de tip caracter i exprim codul direciei de trasare a dreptunghiului care formeaz chenarul: \ - trasarea se face ncepnd de la colul din stnga sus spre colul din dreapta jos i / - trasarea se face ncepnd de la colul din dreapta jos spre colul din stnga sus; Curvature - curbura colurilor chenarului stabilete gradul de rotunjire al colurilor i este de tip numeric. Poate lua valori de la 0 la 99 determinnd aspectul chenarului. Astfel pentru valoarea 0 chenarul va fi un dreptunghi sau un ptrat, pentru valoarea 99 chenarul se va transforma ntr-un cerc, respectiv o elips, iar pentru o valoare cuprins ntre cele dou limite, de exemplu 30, se va transforma ntr-un dreptunghi, respectiv ntr-un ptrat cu colurile rotunjite. Pictograma de glisare - DragIcon . Este de tip ir de caractere i reprezint identificatorul fiierului (calea de director i numele) care conine pictograma ce va fi afiat n locul cursorului de mouse atunci cnd se execut operaia de glisare i plasare a obiectului. Cursorul de mouse - MousePointer . Este ! de tip numeric i reprezint codul asociat Folosind autodocumentarea aflai care formei cursorului de mouse afiat atunci sunt valorile asociate proprietii cnd este indicat o zon a obiectului. MousePointer. Disponibilitatea - Enabled . Este o proprietate de tip logic. Dac are valoarea .T. controlul este disponibil (enabled), adic utilizatorul l poate aciona, iar dac are valoarea .F. nu este disponibil (disabled), adic nu-l poate aciona. Un control nu este disponibil atunci cnd nu sunt ndeplinite condiiile necesare pentru a putea fi folosit. Reprezentarea grafic i legenda controalelor care nu sunt disponibile sunt afiate estompat. Vizibilitatea - Visible . Este o proprietate de tip logic. Dac are valoarea .T. obiectul este vizibil, iar cnd are valoarea .F. nu este vizibil.
Pentru precizarea codului unei culori se folosete schema de culori RGB prin care precizai prin trei numere cuprinse ntre 0 i 255 intensitatea pentru fiecare din cele trei culori de baz: rou, verde i albastru. Pentru a afla codul culorii folosii funcia RGB() care are sintaxa rgb(<r>, <g>,<b>), unde cei trei parametri reprezint intensitile celor trei culori:
Culoare Alb Negru Gri Gri nchis Rou Rou nchis Galben Galben nchis Parametri RGB() 255, 255, 255 0, 0, 0 192, 192, 192 128, 128, 128 255, 0, 0 128, 0, 0 255, 255, 0 128, 128, 0 Numr 16777215 0 12632256 8421504 255 128 65535 32896 Culoare Verde Verde nchis Cian Cian nchis Albastru Albastru nchis Magenta Magenta nchis Parametri RGB() 0, 255, 0 0, 128, 0 0, 255, 255 0, 128, 128 0, 0, 255 0, 0, 128 255, 0 ,255 128, 0, 128 Numr 65280 32768 16776960 8421376 16711680 8388608 16711935 8388736
240 Informatic
3.1.5. Evenimente recunoscute de obiectele vizuale
Att formularele, ct i marea majoritate a controalelor sunt capabile s primeasc din partea sistemului semnale prin care sunt informate de producerea unui eveniment. La proiectarea formularului programatorul poate specifica secvene de instruciuni prin care obiectul trebuie s rspund la diferite evenimente. De exemplu, evenimentele recunoscute de majoritatea obiectelor (formulare i controale) sunt: 9 Evenimente declanate de aciunile mouse-ului: MouseMove - deplasarea mouse-ului pe obiect; Clicks - clic cu mouse-ul pe obiect cu butonul din stnga (are ca efect focalizarea obiectului). RightClicks - clic cu mouse-ul pe obiect cu butonul din dreapta (are ca efect n general deschiderea unui meniu dependent de context, adic un meniu cu opiuni specifice obiectului pe care s-a executat clic); DblClick - dublu clic cu mouse-ul pe obiect; MouseDown - apsarea butonului de mouse; MouseUp - eliberarea butonului de mouse; DragOvers - glisarea obiectului cu mouse-ul; DragDrops - glisarea i plasarea obiectului cu mouse-ul. 9 Evenimentul declanat la acionarea unei taste (apsarea i eliberarea ei) KeyPress. Procedurii care se va executa la apariia acestui eveniment i se pot transmite ca parametri numrul asociat tastei apsate i un cod numeric prin care se definete combinaia de taste reci care nsoete tasta apsat. Fiecrei taste reci i corespunde un bit poziionat pe 1 din codul numeric. Astfel, pentru tasta Shift este bitul 0 (rezult codul=1), pentru tasta Ctrl bitul 1 Poziie 2 1 0 (rezult codul=2) i pentru tasta Alt bitul 2 22 21 20 (rezult codul=4). Se pot combina mai multe Apsai Alt Ctrl Shift Cod taste reci. Shift 0 0 1 1 Ctrl 0 1 0 2 9 Evenimente declanate de crearea i Ctrl +Shift 0 1 1 3 eliberarea obiectului: Init - iniializarea obiectului declanat de crearea lui; Destroys - eliberarea obiectului declanat de metoda de eliberare a zonei de memorie alocate obiectului.
Alt Alt+Shift Alt+Ctrl Alt+Ctrl+Shift 1 1 1 1 0 0 1 1 0 1 0 1 4 5 6 7
3.1.6. Focalizarea
Focalizarea (focus) este capacitatea aplicaiei de a primi datele de intrare ale utilizatorului prin intermediul tastaturii sau al mouse-ului. Ea se manifest n cadrul interfeei prin prezena selectorului. Cnd selectorul este poziionat pe un obiect, acesta va putea primi datele de intrare ale utilizatorului. Pe de o parte, sistemul de operare Windows permite lansarea n execuie a mai multor aplicaii la un moment dat, dar numai una dintre aplicaii are capacitatea de focalizare. Aceasta este
241
aplicaia activ, adic aplicaia care va primi datele de intrare furnizate de utilizator. Pe de alt parte, n cadrul unei aplicaii la un moment dat pot fi deschise mai multe formulare, ns un singur formular are capacitatea de focalizare i se numete formular activ, iar n cadrul formularului activ un singur control poate primi focalizarea i se numete control activ. nainte de a focaliza un obiect trebuie activat containerul, aciune sesizat prin evenimentul Activates . Containerul se activeaz: 9 Interactiv: utilizatorul execut clic pe obiectul container. 9 Din program: se apeleaz metoda Show (afiarea) a obiectului container. Evenimentul Activate se declaneaz n ordinea de incluziune a formularelor: mai nti pentru obiectul FormSet, apoi pentru obiectele Form coninute de acesta i n final pentru obiectele Page din obiectele Form. Dup activarea containerului, un obiect poate fi focalizat: 9 Interactiv: utilizatorul execut clic pe obiect sau apas repetat tasta Tab pn focalizeaz obiectul dorit. 9 Din program: se apeleaz metoda SetFocuss a controlului pe care vrei s-l focalizai. Un obiect i poate pierde focalizarea: 9 Interactiv: utilizatorul focalizeaz alt obiect executnd clic pe acel obiect. 9 Din program: se apeleaz metoda SetFocuss a controlului pe care-l dorii s preia focali-zarea. De aceea, formularele i cele mai multe dintre controale au asociate evenimente de primire a focalizrii i de pierdere a focalizrii. Aceste evenimente sunt: 9 Primirea focalizrii declaneaz evenimentul GotFocuss. 9 Pierderea focalizrii declaneaz evenimentul LostFocuss. Programatorul poate scrie proceduri pentru aceste evenimente, la nivelul fiecrui control. De exemplu, atunci cnd un control primete focalizarea (evenimentul GotFocus), prin intermediul procedurii asociate evenimentului pot fi afiate n casete instruciuni referitoare la control sau n bara de stare mesaje de informare despre control. Obiectul focalizat este evideniat prin diferite metode. De exemplu, un buton declanator focalizat este evideniat printr-o bordur care nconjoar butonul. Un obiect poate fi focalizat numai dac are proprietatea de a fi disponibil (de a rspunde la acionri de la tastatur sau mouse) i proprietatea de a fi vizibil pe ecran. Nu pot fi focalizate urmtoarele obiecte: eticheta, linia, forma, imaginea i caseta de imagine. Focalizarea este controlat prin dou proprieti de tip referin (adres), specifice formularelor, care sunt protejate la scriere - read-only - i nu pot fi modificate de programator: 9 ActiveForms - formularul activ. Este o proprietate prin care se face referirea la formularul activ dintr-un set de formulare sau de pe ecran. Poate fi folosit n obiectele container: Form, FormSet, _Screen. Folosind aceast referin putei modifica valoarea unei proprieti a formularului activ sau putei apela o metod a formularului activ: <nume_obiect_container>.ActiveForm.<proprietate>=<valoare> <nume_obiect_container>.ActiveForm.<metod>
242 Informatic
9 ActiveControl - controlul activ. Este o proprietate prin care se face referirea la controlul activ dintr-un obiect container. Poate fi folosit n obiectele container: Form, Page, ToolBar, _Screen. Folosind aceast referin putei modifica valoarea unei proprieti a controlului activ: <nume_obiect_container>.ActiveControl.<proprietate>=<valoare>
Dac obiectul container nu mai conine nici un obiect focalizat, nseamn c el este dezactivat, stare care va fi sesizat prin evenimentul Deactivates. Evenimentul este declanat: 9 Interactiv: se mut focalizarea din obiectul container ntr-un alt obiect container sau ntr-o alt aplicaie. 9 Din program: se creeaz un nou obiect care declaneaz evenimentul Activate pentru noul obiect i evenimentul Deactivate pentru vechiul obiect. Transferul controlului focalizrii de la un obiect (formular sau control) se poate face folosind metoda SetFocuss care poate fi apelat din diferite metode. Ordinea tabulrii este una dintre proprietile unui formular i reprezint ordinea n care utilizatorul se poate deplasa de la un control la altul pentru a-l focaliza, folosind tasta Tab. Pentru a stabili aceast ordine, fiecare control din formular are dou proprieti: 9 TabStops - controlul tabulrii. Are valoare logic i este folosit pentru a determina dac utilizatorul poate focaliza controlul folosind tasta Tab. Dac valoarea este .F., controlul nu va putea fi focalizat dect executnd clic pe el. 9 TabIndex - indexul tabulrii. Este numrul de ordine al controlului n cadrul formularului atunci cnd se folosete tasta Tab pentru a focaliza un control. Fomularele pot fi: 9 Modale (modal). Un astfel de formular cere utilizatorului s execute anumite aciuni prin care s nchid formularul activ pentru a putea continua execuia aplicaiei i pentru a putea focaliza un alt formular. Astfel, o caset de dialog modal trebuie nchis prin acionarea declanatoarelor OK sau Cancel ca s se poat continua lucrul cu restul aplicaiei (de exemplu, n Visual FoxPro casetele de dialog Open sau Save As sunt modale). Se recomand folosirea acestui tip de formular n cazul n care prin intermediul lui se solicit utilizatorului un rspuns sau anumite date necesare pentru continuarea unui proces de prelucrare. 9 Nemodale (modeless). Acest tip de formular nu trebuie nchis pentru a ceda focalizarea altui formular. De exemplu, ferestrele cu documente din aplicaia Visual FoxPro sunt ferestre nemodale. Caseta de dialog Find and replace care se deschide cu opiunea Find.../Replace...Edit atunci cnd scriei un program surs cu editorul ncorporat Visual FoxPro permite continuarea lucrului n aplicaia curent (continuarea operaiei de editare a programului surs) n timp ce caseta de dialog este afiat n continuare pe ecran. Barele cu instrumente sunt i ele formulare nemodale. Se recomand folosirea acestui tip de formular n cazul n care el conine date care trebuie vizualizate pentru a fi comparate cu date din alte formulare. Tipul formularului este controlat cu proprietatea WindowType care este de tip numeric. Ea poate lua valoarea 0 (nemodal) sau 1 (modal).
243
Chiar dac se uureaz munca programatorului atunci cnd construiete interfaa cu ajutorul obiectelor create pe baza claselor vizuale predefinite puse la dispoziie de programarea pe obiecte, din exemplele prezentate se poate vedea c i aceast metod este destul de laborioas. De aceea, pentru construirea interfeei se recomand metoda vizual. Aadar: Programarea vizual const n folosirea unor instrumente interactive care ajut programatorul s precizeze diferite opiuni i s contruiasc diferite elemente ale aplicaiei, pe baza crora sistemul genereaz apoi codul programului. Programarea vizual se bazeaz pe programarea orientat pe obiecte (codul de program este generat folosind programarea orientat pe obiecte). Metoda vizual crete productivitatea programatorului. Recomandare: Pentru construirea elementelor aplicaiei, se recomand folosirea metodei vizuale, iar acolo unde nu obinei efectul dorit folosind aceast metod, vei folosi metoda clasic a programrii structurate pentru a scrie programul. Programarea vizual pune la dispoziia programatorului dou instrumente interactive:
constructori i proceduri asistent.
Cu ajutorul acestor instrumente, programatorul poate construi marea majoritate a elementelor unei aplicaii: baza de date, formularele, meniurile, rapoartele, interogrile, vizualizrile etc. n cazul obictelor de interfa, n procesul de creare a formularului prin intermediul acestor instrumente vizuale, proiectantul trebuie s comunice proprietile formularului i ale obiectelor componente i procedurile asociate evenimentelor i metodelor care vor fi folosite de formulare i controale. Aceste caracteristici se memoreaz ntr-un fiier care are o structur de tabel i extensia .scx. Constructorii de formulare Principiul folosit de constructorii de formulare este urmtorul: constructorul pune la dispoziia proiectantului de interfa un formular care are proprieti, metode i evenimente implicite, iar obiectele care vor fi create n formular vor primi i ele valori implicite pentru proprieti (conform clasei de baz a obiectului respectiv). Rolul proiectantului const n modificarea interactiv a valorii unor proprieti ale obiectelor create i scrierea unor proceduri asociate metodelor i evenimentelor, n conformitate cu configuraia pe care vrea s o realizeze pentru interfa. Constructorii de formulare pe care putei s-i folosii sunt: 9 Form Builder - Constructorul rapid - care permite o proiectare rapid a formularelor simple. Prin intermediul unei casete de dialog cu mai multe seciuni, proiectantul furnizeaz constructorului valoarea unor proprieti. El nu are cunotin de numele acestor proprieti, ci numai de caracteristicile fomularului pe care le stabilesc. Nu poate stabili dect valoarea proprietilor asociate acestor caracteristici i nici nu poate scrie proceduri asociate evenimentelor i metodelor. Sunt implementai mai muli construc-
244 Informatic
tori rapizi, fiecare dintre ei specializat pentru un anumit obiect de interfa. Fiecare constructor rapid afieaz anumite seciuni, n funcie de obiect. Fiecare seciune grupeaz anumite caracteristici ale obiectului care corespund unei categorii de proprieti. Exist constructori rapizi pentru: Formulare: Form Builder. Controale: Combo Box Builder, Command Group Builder, Edit Box Builder, Text Box Builder, List Box Builder, Option Group Builder. 9 Form Designer - Constructorul normal - care permite construirea unor formulare complexe. Constructorul pune la dispoziia proiectantului diferite instrumente: bara cu obiectele care pot fi inserate n formular, bara cu instrumente ale aplicaiei constructor, fereastra pentru stabilirea proprietilor, fereastra pentru stabilirea procedurilor asociate evenimentelor i metodelor etc. Prin intermediul lor proiectantul atribuie valori proprietilor (identificate prin numele lor) i scrie procedurile asociate metodelor i evenimentelor. Pentru lansarea n execuie a constructorului folosii comanda: create form <nume_formular> unde <nume_formular> este numele fiierului n care se salveaz formularul. Pentru modificarea formularului cu ajutorul constructorului folosii comanda: modify form <nume_formular> unde <nume_formular> este numele fiierului n care se salveaz formularul. Procedura asistent pentru construirea formularelor Procedura asistent Form Wizard construiete ea nsi formularul pe baza unor informaii furnizate de proiectant prin intermediul unui dialog desfurat n mai muli pai. Proiectantul nu modific proprietile i nu scrie codurile procedurilor. Deoarece fiierul n care este memorat formularul are o structur de tabel el poate fi deschis cu comanda use i vizualizat apoi cu comanda browse. Caracteristicile unui obiect al formularului sunt memorate n cte o nregistrare fiecare, iar n fiecare coloan cte o caracteristic. De exemplu, coloana Properties conine cmpuri de tip memo n care sunt memorate proprietile care au valori diferite de cele implicite, iar coloana Methods conine cmpuri de tip memo n care sunt memorate procedurile asociate metodelor i evenimentelor obiectului. Pentru a afia formularul creat pe ecran i pentru a permite utilizatorului s interacioneze cu obiectele de interfa pe care le conine, formularul trebuie lansat n execuie prin comanda: do form <nume_formular> [with <lista_parametri >] [to < parametru_ieire>] Transferul parametrilor se face astfel:
245
Formularul <nume_formular>.scx Lansarea n execuie a formularului: procedure init parameters <lista_parametri> ............................................ endproc ............................................ procedure unload ............................................ return <parametru> endproc
Creai tabelul Agenda1 cu urmtoarea structur de cmpuri: nume (C,15), prenume (C,15) i telefon (C,10). Adugai trei nregistrri de date la tabel. Nu nchidei tabelul. Creai un formular procedura asistent folosind
Alegei opiunea Form Wizard8Tools. Se deschide caseta de dialog Wizard Selection. Din caseta de dialog alegei opiunea Form Wizard. Dac ai fi creat un formular cu cmpuri din dou tabele, ai fi ales opiunea One-to-Many Form Wizard. Acionai butonul OK. Se deschide caseta de dialog corespunztoare primului pas (Step1) n care alegei cmpurile din tabel pentru care se vor crea obiecte n formular. n acest exemplu vei alege toate cmpurile. Pentru aceste cmpuri, asistentul va crea controale de tip TextBox asociate cu controale Label. Vei circula de la un dialog la altul cu butoanele Next (dialogul urmtor) i Back (dialogul anterior). Terminai dialogul cu butonul Finish. Dup ce ai selectat toate cmpurile din tabel, trecei la urmtorul dialog Step2. n dialogul Step2 alegei stilul formularului. Din grupul de butoane radio Button Type activai butonul Text Button, iar din lista Style alegei stilul Chiseled. n acest pas sunt adugate controalele pentru editarea cmpurilor din tabel i suplimentar butoane pentru administrarea datelor din tabel. Controalele vor avea aspectul fizic stabilit prin stilul ales. Trecei la urmtorul dialog. n dialogul Step3 alegei criteriul de ordonare a datelor din tabel: ordinea de sortare i cmpul cheie pentru sortare care este format dintr-un cmp sau mai multe cmpuri din
246 Informatic
tabel. Alegei pentru criteriul de ordonare cmpurile nume i prenume. Trecei la dialogul urmtor.
n dialogul Step4 scriei legenda formularului n caseta de text Type a title for your form. Din grupul de butoane radio alegei opiunea Save and run form. Acionai apoi butonul Finish pentru terminare. Se deschide caseta de dialog Save As n care comunicai numele formularului Agenda1. Dup nchiderea casetei Save as este lansat n execuie formularul. Testai butoanele formularului executnd operaii de vizualizare a nregistrrilor, de adugare, de tergere i de cutare a unei nregistrri. nchidei formularul.
Deschidei tabelul asociat formularului cu comanda use Asgnda1.scx. Vizualizai cu comanda list stru structura de cmpuri a tabelului asociat formularului. Vizualizai coninutul tabelului cu comanda browse. Identificai proprietile i metodele asociate formularului i obictelor din formular. nchidei fereastra Browse. nchidei fiierul cu comanda use. Deschidei tabelul cu comanda use Agenda1.
Creai un formular folosind constructorul rapid pentru formulare
Butoanele adugate la formular Top Mut pointerul de nregistrare pe prima nregistrare. Prev Mut pointerul de nregistrare pe nregistrarea precedent. Next Mut pointerul de nregistrare pe nregistrarea urmtoare. Bottom Mut pointerul de nregistrare pe ultima nregistrare. Find Afiez caseta de dialog Search prin intermediul creia construii un criteriu de cutare a unei nregistrri. Print Tiprete un raport cu datele din tabel. Add Adaug o nregistrare la sfritul tabelului. Edit Permite modificarea valorilor din cmpurile nregistrrii curente. Delete terge nregistrarea curent. Exit nchide formularul form.
Se deschide fereastra aplicaiei Form Designer. n fereastr este deschis fereastra document Form1 n care se vor crea obiectele care aparin formularului. Suprafaa formularului este divizat printr-o gril care va ajuta utilizatorul la aranjarea obiectului
247
n cadrul formularului (alinierea obiectelor la liniile grilei). n bara de meniu a fost adugat un titlu de meniu (Form) cu opiuni specifice constructorului de formulare. n
Meniul Form care conine opiuni specifice constructorului de formulare
partea inferioar ferestrei sunt afiate dou liste ascunse: Form care este disponibil numai dac ai creat un set de formulare i v permite s alegei un formular din set i Page care este disponibil numai dac ai creat un set de pagini i v permite s alegei o pagin din set.
Alegei opiunea Quick Form...Form. Se deschide caseta de dialog Form Builder. Caseta de dialog conine dou seciuni: seciunea Field Section din care alegei cmpurile din baza de date pentru care dorii s creai obiecte n formular pentru editarea datelor. Alegei toate cmpurile din tabel: din lista Available Fields selectai cmpul i executai clic pe butonul 8 . Din seciunea Style alegei stilul formularului (alegei opiunea Embosed din lista Style). nchidei caseta de dialog executnd clic pe declanatorul OK.
248 Informatic
n proiectul de formular vor fi inserate automat casete de text pentru editarea cmpurilor din tabel i etichete asociate acestor cmpuri pentru identificarea lor. nchidei aplicaia (clic pe butonul de nchidere al ferestrei de aplicaie). Deschidei tabelul asociat formularului cu comanda use Agenda2.scx. Vizualizai coninutul tabelului cu comanda browse. Identificai obiectele create n formular (coloana cmpurilor Objectname) i proprietile asociate acestor obiecte (coloana cmpurilor Properties). nchidei fiierul cu comanda use.
249
3. Dac datele preluate de formular prin intermediul parametrilor actuali ai procedurii asociate evenimentului Init sunt necesare i n alte metode i evenimente, ei vor fi transmii ca variabile globale. 4. Procedura asociat evenimentului Unload se execut dup procedura asociat evenimentului Destroy i dup ce au fost eliberate toate obiectele coninute. De exemplu, dac un formular este creat ntr-un set de formulare i conine o caset de text i un buton de comand, la eliberarea unui formular evenimentele sunt tratate n urmtoarea ordine: Destroy pentru setul de formulare, Destroy pentru formular, Destroy pentru caseta de text i butonul de comand, Unload pentru formular i Unload pentru setul de formulare. Metodele pe care le pot executa formularele sunt: 9 Metoda de afiare Show - are ca efect afiarea pe ecran a formularului care a fost creat sau care a fost ascuns anterior. 9 Aciunea de ascundere Hide - are ca efect ndeprtarea formularului de pe ecran, fr ca informaiile referitoare la el s fie terse din memoria intern; se pot executa chiar diferite operaii cu formularul ascuns, ca de exemplu crearea n formular a unor noi controale care vor fi afiate atunci cnd formularul va fi reafiat. 9 Metoda de reactualizare Refresh - are ca efect remprosptarea formularului i a obiectelor din formular, astfel nct ele s afieze valorile actuale; n aceast metod vor fi scrise instruciunile prin care se pot actualiza valorile unor proprieti ale formularului sau ale obiectului, sau valorile unor variabile de memorie folosite pentru calcularea unor date. 9 Metoda de tergere a formularului din memorie Release - are ca efect eliberarea zonei de memorie alocate formularului.
250 Informatic
AutoOpen - Dac are valoarea .T. tabelele i vizualizrile din mediul de date sunt deschise automat o dat cu crearea formularului. AutoClose - Dac are valoarea .T. tabelele i vizualizrile din mediul de date sunt nchise automat o dat cu eliberarea formularului. 9 Evenimentele la care poate rspunde mediul datelor sunt: BeforeOpenTables - Evenimentul este declanat naintea deschiderii tabelelor i a vizualizrilor din mediul de date. Se declaneaz naintea evenimentului Load al formularului pentru c tabelele trebuie s fie deschise nainte de iniializarea formularului, deoarece n formular trebuie afiate date din aceste tabele i vizualizri. n procedura asociat acestui eveniment se pot stabili numele tabelelor i vizualizrilor care se vor deschide i locul n care sunt memorate pe disc. AfterCloseTables - Evenimentul este declanat dup nchiderea tabelelor i a vizualizrilor din mediul de date (este provocat de fiecare apel al metodei CloseTables). Se declaneaz dup descrcarea formularului (dup evenimentul Unload al formularului). 9 Metodele pe care le poate executa mediul de date sunt: OpenTables - dechiderea tabelelor i vizualizrilor din mediul de date; n aceast metod se scriu instruciunile pentru deschiderea tabelelor n diferite zone de lucru. CloseTables - nchiderea tabelelor i vizualizrilor din mediul de date; n aceast metod se scriu instruciunile pentru nchiderea tabelelor deschise n diferite zone de lucru. Sesiunea (session) este intervalul de timp n care o aplicaie primete date i le prelucreaz. Sesiunea de date (data session) este mediul de date asociat sesiunii (parametrii sistemului, variabile de memorie, fiiere de date). n Visual FoxPro un formular poate rula n: 9 sesiunea de date implicit care preia configurrile implicite ale mediului Visual FoxPro. 9 sesiunea de date privat (proprie formularului) n care toate configurrile mediului trebuie fcute la crearea formularului; acest tip de sesiune creeaz o mai mare independen a formularului fa de mediu. Operaiile pe care trebuie s le executai pentru a proiecta un formular sunt urmtoarele: 1. Deschidei constructorul pentru proiectarea formularului (Form Designer). 2. Definii proprietile formularului i scriei procedurile asociate metodelor i evenimentelor formularului. 3. Deschidei baza de date pentru a se crea obiectul DataEnvironment asociat formularului. 4. Creai controalele n formular. Definii proprietile lor i scriei procedurile asociate metodelor i evenimentelor fiecrui control. 5. Salvai formularul.
251
252 Informatic
ControlBox - controleaz dac formularul are buton de meniu de control sau nu. 9 Proprieti legate de comportament sunt specificate prin proprietile de tip logic: Closable - controleaz dac formularul poate fi nchis folosind meniul de control (opiunea Close a meniului sau dublu clic pe butonul meniului) sau nu; Movable - controleaz dac formularul poate fi mutat sau nu; 9 Afiarea casetelor cu informaii despre controalele din formular ShowTips este de tip logic: dac are valoarea .T. (implicit n ToolBar) se afieaz caseta cu informaii despre controlul indicat cu mouse-ul (ToolTip), iar dac are valoarea .F. (implicit n Form) nu se afieaz caseta. Evenimentele la care pot rspunde formularele sunt: 9 Redimensionarea formularului Resize - este declanat fie prin schimbarea interactiv a dimensiunii formularului, fie prin modificarea din program a dimensiunii sale (proprietile Height i Width). 9 Mutarea formularului Moved - este declanat fie prin mutarea interactiv a formularului, fie prin modificarea din program a poziiei sale (proprietile Top i Left). Metodele pe care le pot executa formularele sunt: 9 Metoda de mutare a formularului pe ecran Move . 9 Metoda de desenare a unei linii n formular Line ; prin intermediul parametrilor se vor preciza coordonatele primului punct (x1,y1) i coordonatele celui de al doilea punct (x2,y2). Parametrii se vor scrie ntre paranteze rotunde, dup numele metodei. Dup desenare, coordonatele poziiei de desenare vor fi (x2,y2). 9 Metoda de desenare a unui dreptunghi n formular Box ; prin intermediul parametrilor se vor preciza coordonatele colului din stnga sus (x1,y1) i coordonatele colului din dreapta jos (x2,y2). Dup desenare, coordonatele poziiei de desenare vor fi (x2,y2). 9 Metoda de desenare a unui cerc n formular Circle ; prin intermediul parametrilor se vor preciza raza cercului i coordonatele centrului cercului (x,y). Dup desenare, coordonatele poziiei de desenare vor fi (x,y). 9 Metoda de scrierea a unui text n formular Print ; prin intermediul parametrului se precizeaz irul de caractere care va fi scris. Dup scriere, coordonatele poziiei de desenare vor fi cele de la sfritul textului. 9 Metoda de tergere a textului i a desenelor din formular Cls . Dup tergere, coordo-natele poziiei de desenare vor fi (0,0).
Identificai instrumentele constructorului de formulare Vei realiza un formular pentru testarea metodelor folosite ntr-o fereastr.
Deschidei fereastra constructorului de aplicaii fie cu opiunea de meniu New...File (n caseta de dialog New File alegei butonul Form din grupul de butoane radio File Type i apoi executai clic pe butonul New File), fie cu comanda create form forma1.
253
Pentru crearea formularului i a obiectelor din formular Constructorul de formulare v pune la dispoziie urmtoarele instrumente: 9 Ferestre:
Fereastra aplicaiei. Are titlul Form designer urmat de numele fiierului n care se creeaz formularul. Fereastra conine spaiul formularului n care vei defini obiectele. Fereastra de proprieti. Are titlul Properties i conine mai multe seciuni . Fereastra pentru secvenele de cod asociate metodelor i evenimentelor. Are titlul <nume_obiect>.<nume_procedura>, unde <nume_obiect> este numele obiectului pentru care scriei procedura (l putei alege din lista ascuns Object), iar <nume_procedura> este numele metodei sau evenimentului pentru care scriei procedura (l putei alege din lista ascuns Procedure). Fereastra mediului de proprieti ale formularului. Are titlul Data Environment i poate fi folosit pentru precizarea tabelelor, a vizulizrilor i a relaiilor dintre ele. Tabelele vor fi deschise automat la definirea formularului.
9 Bare cu instrumente:
Bara pentru obiectele de interfa - Form Controls Toolbar. Afieaz controale cu ajutorul crora selectai obiectul pe care vrei s-l creai n cadrul formularului. Bara pentru manipularea obiectelor - Layout Toolbar. Afieaz controale cu ajutorul crora manipulai obiectele pe care le-ai creat n formular. Bara aplicaiei - Form Designer. Afieaz controale cu ajutorul crora stabilii instrumentele afiate de aplicaie. Bara pentru controlul culorilor - Color Palette. Afieaz controale cu ajutorul crora alegei culorile.
9 Opiuni de meniu:
Meniul Form este vizibil numai dac este deschis fereastra constructorului de formulare i conine opiuni specifice acestei aplicaii. Prin intermediul opiunilor sale putei administra clasele definite de utilizator (crearea i modificarea unor proprieti i metode, includerea unui fiier de constante), putei administra seturi de formulare (crearea setului de formulare, adugarea sau nlturarea formularelor din set etc.), putei administra formularul pe care l creai (deschiderea constructorului rapid pentru crearea lui, lansarea lui n execuie, modificarea lui). n meniul View devin vizibile opiuni prin care putei s stabilii instrumentele Constructorului de formulare care vrei s fie afiate. n meniul Format devin vizibile opiuni prin care putei s stabilii caracteristicile grilei folosite pentru alinierea obiectelor n formular. Opiunile de meniu:
Opiunea Data Environment Properties Code Semnificaia Meniul View Opiune de tip comutator. Controleaz afiarea ferestrei mediului de date. Opiune de tip comutator. Controleaz afiarea ferestrei de proprieti. Opiune de tip comutator. Controleaz afiarea ferestrei pentru secvenele de cod.
254 Informatic
Opiunea Semnificaia Form Controls Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru Toolbar crearea obiectelor n formular. Layout Toolbar Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru administrarea obiectelor n formular. Color Palette Opiune de tip comutator. Controleaz afiarea barei cu instrumente pentru Toolbar stabilirea culorilor. Tab Order Grid Lines Show Position Permite modificarea ordinii de focalizare cu tasta Tab a obiectelor din formular. Ordinea implicit este cea n care au fost proiectate (adugate la formular). Opiune de tip comutator. Afieaz/ascunde grila pentru alinierea obiectelor. Opiune de tip comutator. Controleaz afiarea n bara de stare a poziiei i dimensiunii obiectului selectat. Meniul Format Opiune de tip comutator. Controleaz alinierea automat a obiectelor nou create la liniile grilei. Permite modificarea distanelor (n pixeli) dintre liniile grilei.
Meniul Form New Property... Creeaz o proprietate nou pentru o clas definit de utilizator. Se deschide caseta de dialog New Property prin intermediul creia stabilii numele i descrierea proprietii. New Method... Edit Property/ Method... Include File... Creeaz o metod nou pentru o clas definit de utilizator. Se deschide caseta de dialog New Method prin intermediul creia stabilii numele i descrierea metodei. Permite modificarea sau tergerea unei proprieti sau metode definite de utilizator. Se deschide caseta de dialog Modify Property/Method prin intermediul creia administrai proprietile i metodele definite.
Permite specificarea numelui fiierului cu constante predefinite ale clasei definite de utilizator. Create Form Creeaz un set de formulare care va conine formularul curent. Dac exist deja Set un set de formulare, opiunea nu este disponibil. Remove Form nltur setul de formulare. Opiunea este disponibil numai dac exist un set de Set formulare, iar acesta conine numai un formular. Add New Form Adaug un formular la setul de formulare. Opiunea este disponibil numai dac a fost creat un set de formulare. Remove Form Quick Form... Run Form nltur formularul curent din set. Opiunea este disponibil numai dac a fost creat un set de formulare, iar acesta conine mai mult de un formular. Deschide fereastra Constructorului rapid de formulare. Lanseaz n execuie formularul.
Identificai instrumentele specifice constructorului de formulare: butoanele din barele de instrumente, ferestrele i opiunile de meniu specifice acestei aplicaii. Afiai barele cu instrumente i identificai pe fiecare bar controalele pe care le putei folosi.
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
255
Buton
1 2 3 4 5 6 7 8 Select Object View Classes Label TextBox EditBox CommandButton CommandGroup OptionButton 9 10 11 12 13 14 15 16
Buton
CheckBox ComboBox List Spinner Grid Image Timer PageFrame 17 18 18 20 21 22 23 24
Buton
OLE Container Control OLE Bound Control Line Shape Container Separator BuildLock ButtonLock
Marea majoritate a butoanelor din bara Form controls le vei folosi pentru a crea obiecte n formulare (Label, TextBox etc.). Butonul Select Object l putei folosi pentru a selecta un grup de obiecte din formular. Butonul BuildLock l putei folosi pentru a lansa n execuie Constructorul rapid pentru formulare, iar butonul ButtonLock l vei folosi atunci cnd vei dori s creai mai multe instane ale aceluiai obiect.
1 Buton
1 2 3
4
4 5 6
9 Buton
7 8 9 Layout Toolbar Form Builder Auto Format
Buton
Code Window Form Control Toolbar Color Palette Toolbar
Majoritatea butoanelor din bara Form Designer pot fi folosite pentru a stabili ce instrumente ale aplicaiei vei afia (fereastra de proprieti, fereastra de cod etc). Butonul FormBuilder l putei folosi pentru lansa n execuie Constructorul rapid pentru formulare. Butonul AutoFormat l vei folosi atunci cnd vei dori s aplicai un anumit stil de formatare asupra obiectelor de acelai tip, selectate. Stilul de formatare se refer la aspectul chenarului, la culorile folosite, la fonturile caracterelor, la alinierea obiectelor i la efectul 3D al obiectelor. La acionarea acestui buton se deschide fereastra aplicaiei Constructorului de format: AutoFormat Builder. Identificai opiunile de meniu pentru care butoanele din aceast bar sunt scurtturi.
10 11 12 13
Buton
1 2 3 4 Align Left Sides Align Right Sides Align Top Edges Align Bottom Edges 5 6 7 8 9
Buton
Align Vertical Centers Align Horizontal Centers Same Width Same Height Same Size 10 11 12 13
Buton
Center Horizontally Center Vertically Bring to Front Send to Back
Butoanele din bara Layout sunt disponibile numai dac au fost selectate mai multe controale i se folosesc pentru a stabili alinierea grupului de controale, modul n care se uniformizeaz dimensiunea lor i stratul din formular n care vor fi afiate (obiectele pot fi
256 Informatic
afiate n dou straturi). Butoanele Align Left Se stabilete Sides, Align Right Sides, Align Top Edges i culoarea cernelii. Align Bottom Edges se folosesc pentru alinierea Se stabilete controalelor fa de marginea grupului selectat. Butoanele Align Vertical Centers i Align culoarea hrtiei. Horizontal Centers se folosesc pentru alinierea centrat fa de axa vertical, respectiv orizontal a Paleta de culori grupului selectat, iar Center Horizontally i Center Vertically se folosesc pentru alinierea centrat fa Se deschide o de axa vertical, respectiv orizontal a grupului palet de culori selectat, n mijlocul formularului. Butoanele Same pentru a alege l l a i uniformiza dimensiunea Width, Same Height i Same Size se folosesc pentru controalelor din grupul selectat: la cel mai lat, la cel mai nalt i la cel mai mare. Butoanele Bring to Front i Send to Back stabilesc stratul n care va fi afiat grupul de controale: deasupra celorlalte sau dedesubt. Paleta de culori conine controale prin care putei s stabilii elementul pentru care alegei culoarea (hrtia sau cerneala), controale pentru o palet standard de culori i controlul pentru deschiderea unui constructor de culori.
n fereastra de proprieti putei stabili i vizualiza proprietile formularului i a fiecrui obiect din formular. Din lista ascuns alegei formularul sau obiectul pentru care stabilii proprietile. Dac deschidei aceast list putei vedea ierarhia de obiecte a formularului. Prin intermediul ei identificai relaia de filiaie a obiectelor n formular. Exist urmtoarele convenii n scrierea proprietilor n list:
Normal - proprietatea are valoarea implicit i nu este protejat la scriere (este de tip Read-Write). Bold - proprietatea are valoarea modificat fa de cea implicit. Italic - proprietatea are valoarea implicit i nu este protejat la scriere (este de tip Read-Only). Fiecare proprietate are un meniu rapid care conine opiunea Reset to Default prin care se atribuie proprietii valoarea implicit i Help... care deschide fereastra cu informaii despre proprietate (help dependent de context).
Definii n fereastr dou obiecte, o etichet i o caset de text astfel: executai clic pe butonul Label din bara cu controale i apoi indicai n formular colul din stnga sus al etichetei i glisai mouse-ul pn cnd obinei dimensiunea dorit pentru obiect. Repetai operaia pentru caseta de text (butonul TextBox). Identificai pentru aceste controale valorile implicite pentru proprietile, evenimentele i metodele asociate. Formularul i obiectele din formular au fiecare cte un meniu rapid de comenzi pe care l deschidei executnd pe formular sau pe obiect clic cu butonul din dreapta al mouse-ului. n tabel, opiunile disponibile pentru formular sunt marcate cu F, iar cele disponibile pentru obiecte sunt marcate cu O.
Opiunea Run Copy Cut F O O Semnificaie Lanseaz n execuie formularul. Copiaz n Clipboard obiectul selectat. Mut n Clipboard obiectul selectat.
257
Semnificaie Insereaz n formular, n poziia indicat, obiectul care fost copiat anterior n Clipboard. Deschide fereastra Data Environment Afieaz n fereastra de proprieti formularul sau obiectul selectat. Deschide fereastra Constructorului rapid de formulare corespunztoare obiectului selectat. Deschide fereastra pentru scrierea secvenei de cod asociate unei metode sau eveniment al obiectului selectat.
F,O Deschide fereastra cu informaii despre obiect (help dependent de context). Lista ascuns din care alegei obiectul pentru care stabilii prorpietile i procedurile pentru metode i evenimente.
Conine Toate proprietile Numai proprietile care caracterizeaz data memorat n control. Numai metodele i evenimentele asociate obiectului. Numai proprietile care caracterizeaz aspectul controlului. Alte proprieti dect cele care caracterizeaz datele i aspectul.
Activeaz constructorul de expresii Expression Builder pentru construirea interactiv a unei expresii. Proprietate pentru care s-a modificat valoarea implicit Proprietate protejat la scriere Proprietate sau metod sau eveniment selectat
Identificai, pentru formular i obiectele definite n formular, opiunile meniului rapid. Cu obiectele din formular putei executa mai multe operaii:
Selectare obiect - executai clic pe suprafaa obiectului. Selectare grup de obiecte - executai clic pe butonul Select Object din bara Form controls i glisai apoi mouse-ul peste obiectele pe care vrei s le selectai. Mutarea obiectului - fie glisai obiectul cu mouse-ul, fie selectai obiectul i apoi folosii operaiile Cut i Paste (din meniul Edit sau din meniul de comenzi rapide).
258 Informatic
Copierea obiectului - selec-tai obiectul i apoi folosii operaiile Copy i Paste (din meniul Edit sau din meniul de comenzi rapide). tergerea obiectului - selectai obiectul i apoi apsai tasta Delete. Creai instane multiple ale unui obiect - executai clic pe butonul ButtonLock din bara Form controls, executai apoi clic n aceast bar pe obiectul pentru care creai instane multiple, creai obiectul n formular i apoi executai clic n locul n care vrei s creai o copie a acestui obiect. Executai clic pentru fiecare copie pe care vrei s o creai. Dup ce ai terminat de creat copii ale obiectului, dezactivai aceast funcie executnd clic pe butonul ButtonLock.
Folosind funcia de creare de instane multiple, mai adugai la formular dou casete de text. Selectai grupul de casete de text i aplicai un anumit stil acestor casete (cu AutoFormat Builder). Aliniai grupul n diferite maniere folosind butoanele de pe bara Layout.
Structura ierarhizat Schimbai ordinea de para formularului. curgere a formularului fie folosind opiunea de meniu, fie butonul Sel Tab Order din bara Form Designer. Stabilii ordinea executnd clic n formular, pe obiecte, n ordinea n care vrei s fie parcurse:
259
Deschidei fereastra constructorului de aplicaii. n fereastra de proprieti atribuii urmtoarele valori proprietilor (care determin aspectul i comportarea formularului): Name = "Form1" ScaleMode = 3 Top = 13 Left = 14 Height = 300 Width = 450 Desktop = .F. BackColor = 220,220,220 ForeColor = 0,0,0 BorderStyle = 2 Caption = "Exemplu" FontName = "Courier New" FontSize = 16 FontBold = .T. DrawWidth = 5 FillColor = 150,150,150 FillStyle = 7 Closable = .T. Enabled = .T. Visible = .T. ShowTips = .F. TabIndex = 1 TabStop = .T. WindowState = 0 WindowType = 0 Pentru afiarea textului i a desenelor, la apsarea butonului de mouse s-a scris procedura asociat evenimentului MouseDown n care s-au apelat metodele specifice formularelor - Print (scrierea textului), Line (desenarea liniei), Circle (desenarea cercului). Pentru a avea acces la fereastra de cod, deschidei n fereastra de pro-prieti seciunea Method i din lista de metode i evenimente alegei evenimentul MouseDown.
Din lista ascuns Object putei alege obiectul pentru care scriei codul procedurii.
Din lista ascuns Procedure putei alege evenimentul sau metoda pentru care scriei secvena de cod.
260 Informatic
ThisForm.Print('Exemplu') y2=50 ThisForm.CurrentX=; for i=1 to 8 ThisForm.CurrentX+10 ThisForm.Line(x1,y1,x2,y2) ThisForm.CurrentY=; ThisForm.Line(x2,y2,x1,y2+50) ThisForm.CurrentY+10 x1=x1+50 endfor x2=x2+50 x1=25 endfor y1=10 ThisForm.Circle(75,225,225) x2=65 Endproc Pentru tergerea textului i a desenelor, la eliberarea butonului de mouse s-a scris procedura asociat evenimentului MouseUp n care s-a apelat metoda Cls (tergerea): Procedure MouseUp Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Cls Endproc Salvai formularul i l lansai n execuie executnd clic pe butonul Run din bara standard.
Run - Lansai n execuie formularul Modify Form - Modificai formularul
Observaie: Procedurile asociate evenimentelor MouseMove, MouseUp i MouseDown primesc din partea sistemului urmtoarele informaii prin intermediul parametrilor: nButton - reprezint butonul de mouse acionat: 1 - butonul stng, 1 - butonul drept i 4 -butonul din mijloc. nShift - este un cod numeric (modul n care se calculeaz a fost prezentat la evenimentul PressKey) prin care se poate determina dac mouse-ul a fost acionat mpreun cu o tast rece Shift, Alt i Ctrl. nXCoord, nYCoord - reprezint coordonatele cursorului de mouse, relative la formular.
261
Creai seturi de formulare 1. Creai un set de formulare care conine dou formulare. Legendele celor dou formulare sunt Formular 1 i Formular 2. Pentru fundalul lor s-au ales dou culori diferite.
Creai setul de formulare cu opiunea de meniu Create Form Set Form. Iniial setul va conine un singur formular. Adugai al doilea formular cu opiunea Add New Form Form. Proprietile setului de formulare i ale formularelor se vor stabili prin intermediul ferestrei de proprieti astfel: * Proprietatile setului Caption = "Formularul 1" AutoRelease = .T. AlwaysOnTop = .T. Name = "Formset1" * Proprietatile formularului 2 * Proprietatile formularului 1 Name = "Form2" Name = "Form1" Top = 32 Top = 8 Left = 113 Left = 44 Height = 250 Height = 250 Width = 375 Width = 375 BackColor = 192,192,192 BackColor = 128,128,128 BorderStyle = 2 BorderStyle = 1 Caption = "Formularul 2" Pentru fiecare formular, scriei cte o procedur asociat evenimentului Click. La producerea acestui eveniment, se parcurg ciclic cele dou formulare, i se scrie n bara de titlu al fiecrui formular numrul su. Procedure Click for n=1 to thisformset.formcount thisformSet.Forms(n).Caption= thisformSet.Forms(n).Caption+str(n,2) endfor Endproc Salvai setul de formulare i l testai lansndu-l n execuie.
2. Setului de formulare li se va mai aduga un formular. Formularul Formular 1 va fi afiat ntotdeauna deasupra celorlalte. Formularele pot fi mutate pe ecran, dar nici un formular nu poate fi adus deasupra formularului Formular 1. Se implementeaz, prin intermediul procedurilor, rspunsuri la evenimentul Click.
Deschidei formulaul anterior i l salvai sub un alt nume. Adugai la setul de formulare cel de al treilea formular.
262 Informatic
Stabilii proprietile pentru cel de la treilea formular: * Proprietatile formularului 3 Name = "Form3" Top = 54 Left = 132 Caption = "Formularul 3" Pentru fiecare formular scriei cte o procedur asociat evenimentului Click. La producere acestui eveniment, se parcurg ciclic cele trei formulare i se scrie n fiecare formular eticheta formularului n care s-a produs evenimentul Click: * Procedura pentru formularul 1 Procedure Click for n=1 to thisformset.formcount thisformSet.Forms(n).Print('Formularul 1') endfor Endproc * Procedura pentru formularul 2 Procedure Click for n=1 to thisformset.formcount thisformSet.Forms(n).Print('Formularul 2') endfor Endproc * Procedura pentru formularul 3 Procedure Click for n=1 to thisformset.formcount thisformSet.Forms(n).Print('Formularul 3') endfor Endproc
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 9 Proprietile care pot fi folosite pentru parcurgerea ciclic a paginilor din set:
Numrul de pagini din set PageCount . Este de tip numeric.
263
Paginile Pages . Este de tip vector. n elementele vectorului se pstreaz referinele ctre paginile din set. 9 Proprietile de tip numeric care pot fi folosite pentru dimensiunile paginilor din set: PageHeight - nlimea paginii (fr etichet); PageWidth - limea paginii. 9 Proprietile care caracterizeaz etichetele paginilor din set: Prezena etichetelor Tabs . Este de tip logic i determin dac vor fi afiate etichetele. Dac are valoarea .T. (implicit), etichetele paginilor vor fi afiate, altfel zona etichetei va fi ocupat de pagin. Limea etichetelor TabStyle . Este de tip numeric. Dac are valoarea 0 (Justified), eticheta este dimensionat dup lungimea textului. Dac are valoarea 1 - (Nonjustified), etichetele paginilor sunt dimensionate astfel nct s ocupe toat limea setului de pagin. Aranjarea etichetelor TabsStretch . Este de tip numeric i determin modul n care vor fi aranjate etichetele n cadrul setului de pagini, atunci cnd lungimea textului etichetelor depete limea setului de pagini. Dac are valoarea 0 (Multiple Rows), etichetele vor fi scrise pe mai multe rnduri. Dac are valoarea 1 (Single Row), etichetele sunt afiate pe o singur linie i textul etichetelor este secionat astfel nct s ncap n etichet. Valoarea implicit este 1. Identificarea unei pagini se poate face n dou moduri: <nume_set_pagini>.<nume_pagin> sau <nume_set_pagini>.Pages(<n>) unde Pages este numele propritii care pstreaz ntr-un vector referinele fiecrei pagini a setului, iar <n> indexul paginii din acest vector. Formularele de tip pagin au proprietatea specific de tip numeric PageOrder numrul de ordine al paginii. Ea este diferit de indexul paginii din vectorul Pages. Modificarea unui numr de ordine al unei pagini duce la rearanjarea tuturor pginilor. De exemplu, dac exist patru pagini i vrei ca pagina a patra s devin a doua, i atroibuii acesteia numrul de ordine 2. Automat pagina a doua va primi numrul de ordine 3, iar pagina a treia numrul de ordine 4.
Lansai n execuie constructorul de formulare i creai un formular nou. Executai clic pe butonul PageFrame din bara Form controls. Glisai apoi mouse-ul n fereastra formularului, peste suprafaa care vrei s fie ocupat de setul de pagini. Se va crea iniial un set de pagini cu dou pagini.
264 Informatic
n fereastra Properties, alegei din lista de obiecte obiectul PageFrame1 i scriei pentru proprietatea PageCount (numr de pagini) valoarea 8. Stabilii apoi i celelalte prorpieti ale obiectelor. Valorile proprietilor formularului, setului de pagini i paginilor sunt: * Formularul Caption = "Form1" Name = "Form1" * Setul de pagini Name = "Pageframe1" PageCount = 8 PageHeight=203 PageWedth=345 TabStretch = 0 Top = 12 Left = 12 Width = 349 Height = 252 Tabs = .T. * Paginile Page1.Caption = "Pagina 1" Page1.Name = "P1" Page1.PageOrder = 1 Page2.Caption = "Pagina 2" Page2.Name = "P2" Page2.PageOrder = 2 .............................. Page8.Caption = "Pagina 8" Page8.Name = "P8" Page8.PageOrder = 8
2. n fereastra Properties, deschidei lista cu obiectele din pagin i observai structura ierarhizat a obiectelor din formular. 3. Cele dou moduri n care sunt afiate paginile sunt controlate cu proprietatea TabStretch. Testai efectul acestei proprieti.
Setul de pagini se identific prin: Form1.Pageframe1
4. Dac paginii P2 i se atribuie numrul de ordine 5 (Page2.PageOrder=5), se vor modifica i paginile: P3 va primi numrul de ordine 2, P4 va primi numrul de ordine 3 i P5 va primi numrul de ordine 4. Testai operaia de schimbare a ordinii paginilor.
TabStretch=0 TabStretch=1
265
ncercai:
Adevrat/Fals: 1. Interfaa de explorare este o interfa container care conine mai multe ferestre. 2. Procedura asociat evenimentului KeyPress primete ca parametru codul numeric asociat tastelor reci apsate. 3. Focalizarea este o metod prin care se poate mri un control grafic. 4. Evenimentul Init este declanat de activarea obiectului. 5. Print este o metod prin care scriei ntr-un formular. 6. Evenimentul Destroy este declanat de eliberarea zonei de memorie alocate obiectului. 7. Procedura asociat evenimentului Load se execut dup cea asociat evenimentului Init. Completai: 1. Dimensiunile, poziiile pe ecran, vizibilitatea i disponibilitatea sunt ........................... ale unui obiect vizual. 2. Variabila de sistem folosit pentru a referi fereastra implicit a aplicaiei Visual FoxPro este ....... . 3. Funcia care furnizeaz codul unei culori descrise prin intensitatea celor trei culori de baz este ........ 4. Un obiect poate fi focalizat din program cu metoda ...................... 5. Procedura asociat evenimentului .......... al unui formular este ultima care se execut. Alegei rspunsurile corecte: 1. Pentru un obiect,Click este: a) o proprietate b) un eveniment c) o metod 2. Stabilii tipul formularului (modal/nemodal) cu proprietatea: a) WindowType b) ShowWindow c) MDIForm 3. Ordinea tabulrii este o proprietate specific: a) tuturor controalelor b) controalelor gril c) formularelor 4. Caseta de dialog Open a interfeei aplicaiei Visual FoxPro este o caset de dialog: a) modal b) nemodal c) copil d) printe 5. Stilul interfeei aplicaiei Visual FoxPro este de tip: a) SDI b) MDI c) de explorare 6. Pentru un formular, Release este: a) o proprietate b) un eveniment c) o metod
266 Informatic
spunsuri: R Adevrat/Fals: 1-F; 2-A; 3-F; 4-F; 5-F; 6-A; 7-F.
Completai: 1-proprieti; 2-_screen; 3-rgb(); 4-SetFocus ; 5-Unload Alegei rspunsurile corecte: 1-b; 2-a; 3- c; 4-a; 5-b; 6-c.
3.4. C o n t r o alele
267
9 Culorile controlului care nu este disponibil sunt determinate de proprietile de tip numeric:
BackColor - culoarea fundalului; ForeColor - culoarea textului. 9 Tasta de acces. Putei focaliza rapid un control apsnd o liter mpreun cu tasta Alt. Tasta literei se numete tast de acces (access key) i ea este afiat subliniat. Putei s o stabilii, dac n proprietatea Caption a controlului scriei litera care vrei s fie tast de acces precedat de caracterele: \<. De exemplu, dac legenda unui control este Telefon i vrei ca litera F s fie tast de acces, vei scrie legenda astfel: Tele\<fon. n formular legenda va fi afiat Telefon. 9 Protejarea la scriere ReadOnly . Este de tip logic i caracterizeaz modul de acces la un control: dac are valoarea .T., controlul nu poate fi editat (poate fi numai vizualizat), altfel utilizatorul poate modifica valoarea controlului. Valoarea implicit a proprietii este .F.. Evenimentele specifice sunt: 9 Accesul condiionat When . Se declaneaz naintea primirii focalizrii. Procedura asociat evenimentului poate fi folosit pentru a focaliza condiionat controlul: dac nu sunt ndeplinite anumite condiii (precizate n procedur) controlul nu va putea fi focalizat. Procedura va ntoarce un rezultat de tip logic: valoarea .T. va permite primirea focalizrii, iar valoarea .F. nu. 9 Validarea Valid . Se declaneaz nainte de pierderea focalizrii. Procedura asociat evenimentului poate fi folosit pentru a ceda focalizarea condiionat: de exemplu, n cazul unuei casete de text, dac valoarea introdus n cmp nu ndeplinete o anumit condiie, nu se va putea focaliza urmtorul control. Procedura va ntoarce fie un rezultat de tip logic (valoarea .T. va permite transferarea focalizrii, iar valoarea .F. va pstra focalizarea), fie un rezultat numeric (0 - controlul pstreaz focalizarea, diferit de 0 focalizarea va avansa peste n controale, n fiind valoarea furnizat; avansarea se va face n sensul acionrii tastei Tab, dac valoarea este pozitiv, i n sens invers, dac valoarea este negativ). Astfel, dac procedura ntoarce valoarea 1, focalizarea este trecut controlului urmtor, iar dac ntoarce valoarea -1, focalizarea este trecut controlului anterior.
268 Informatic
i un buton Stop care poate opri execuia procesului. n general, acestui control nu i se asociaz valori, ci aciuni descrise prin procedura asociat evenimentului Click. Butonul de comand nu are proprietatea BackColor, iar proprietatea Style poate avea valorile: 0 - standard (implicit) i 1 - invizibil. Are proprietile WordWrap i Autosize (care vor fi prezentate ulterior). n funcie de modul n care este informat utilizatorul despre aciunea butonului exist: 9 Butoane n care aciunea este descris printr-un text. n acest caz, textul care descrie aciunea va fi pstrat de proprietatea Caption a controlului. 9 Butoane n care aciunea este descris printr-o imagine. n acest caz, identificatorul fiierului care conine imaginea care va fi afiat va fi pstrat de proprietatea Picture a controlului (identificatorul fiierului n care este pstrat imaginea). n cazul n care se folosete imaginea pentru descrierea aciunii, trebuie folosite i urmtoarele proprieti: DownPicture - imaginea afiat atunci cnd butonul este focalizat; DisablePicture - imaginea afiat atunci cnd butonul nu este disponibil. Declanatorul poate fi acionat n mai multe moduri: 9 Executai clic pe butonul focalizat. 9 Focalizai butonul apsnd repetat tasta Tab i apoi apsai tasta Enter sau Spaiu. 9 Apsai tasta Alt mpreun cu tasta de acces la buton (cu tasta literei de identificare). 9 Dac butonul de comand este butonul implicit al formularului, apsai tasta Enter, indiferent de poziia selectorului. 9 Dac butonul de comand este butonul de anulare al formularului, apsai tasta Esc, indiferent de poziia selectorului. Indiferent de modul ales, evenimentul este acelai (evenimentul Click): prin acionarea butonului se declaneaz operaia atribuit lui. ntr-un formular nu poate fi dect un buton implicit i un buton de anulare. Tipul butonului este controlat cu proprietile specifice unui buton de comand: 9 Implicit Default . Este de tip logic. Dac are valoarea .T., butonul de comand este butonul implicit (default command button). ntr-un formular, un singur buton de comand poate fi implicit. Valoarea implicit pentru aceast proprietate este .F.. 9 Anulare Cancel . Este de tip logic. Dac are valoarea .T., butonul de comand este butonul de anulare (cancel command button). ntr-un formular, un singur buton de comand poate fi de anulare. Valoarea implicit pentru aceast proprietate este .F..
269
Construii un formular care conine butoane de comand, folosind metoda programrii Realizai un formular care s prezinte panta unei linii. Formularul este de tip caset de dialog, are titlul Test linie i culoarea fundalului gri. Pentru testarea liniei se vor folosi trei butoane de comand: Crescator, Normal, Descrescator. Cel de la patrulea buton, Terminare, se folosete pentru a nchide formularul. Toate butoanele au taste de acces. Aciunile realizate la acionarea butonului sunt descrise n procedurile pentru evenimentele Click ale fiecrui buton.
Scriei programul surs ntr-un fiier forma_p.prg. public h Top = 100 F1 = CreateObject('Form') Height = 25 F1.Caption='Test linie' Procedure Click F1.Closable = .F. ThisForm.L.Visible = .F. F1.Width=400 ThisForm.L.Height=H F1.Height=200 ThisForm.L.LineSlant ='/' F1.BackColor=RGB(220,220,220) ThisForm.L.Visible = .T. Enddefine F1.AddObject('L','Line') F1.AddObject('B1','Buton1') Define class Buton2 as; F1.AddObject('B2','Buton2') CommandButton F1.AddObject('B3','Buton3') Caption = '\<Normal' F1.AddObject('B4','Buton4') Left = 150 Top = 100 F1.L.Visible = .T. Height = 25 F1.L.Top = 20 Procedure Click F1.L.Left = 150 ThisForm.L.Visible = .F. h=F1.L.Height ThisForm.L.Height=0 F1.B1.Visible =.T. ThisForm.L.Visible = .T. F1.B2.Visible =.T. Enddefine F1.B3.Visible =.T. F1.B4.Visible =.T. Define class Buton3 as; CommandButton F1.Show Caption = '\<Descrescator' Read events Left = 275 Top = 100 Define class Buton1 as; Height = 25 CommandButton Procedure Click Caption = ' \<Crescator' ThisForm.L.Visible = .F. Left = 25 ThisForm.L.Height=H
270 Informatic
ThisForm.L.LineSlant ='\' ThisForm.L.Visible = .T. Enddefine Cancel = .T. Left = 150 Top = 150 Height = 25 Define class Buton4 as; Procedure Click CommandButton Clear events Caption = '\<Terminare' Enddefine Salvai programul i-l lansai n execuie cu comanda do forma_p.prg. Testai butoanele.
Construii un formular care conine butoane de comand folosind metoda vizual
Creai un formular nou forma_v. Creai n acest formular un obiect de tip linie: executai clic pe butonul Line de pe bara Form controls i glisai apoi mouse-ul n formular pentru a trasa linia. Pentru a crea cele patru butoane declantoare, folosii facilitatea de creare de instan-e multiple. Executai clic pe butonul ButtonLock pe bara Form controls, apoi exe-cutai clic pe butonul CommandButton de pe aceeai bar. Glisai mouseul n formular pentru a crea un buton de comand. Apoi executai clic de trei ori n poziiile n care vrei s apar celelalte butoane. Dezactivai facilitatea executnd clic pe bu-tonul ButtonLock. Modificai corespunztor valorile proprietilor formularului i obiectelor din formular (pe baza instruciunilor din programul surs). Scriei cte o procedur pentru fiecare eveniment Click al celor patru butoane (pe baza instruciunilor din programul surs). Salvai formularul i-l lansai n execuie cu comanda do form forma_v. Testai formularul.
271
(implicit) - eticheta nu este redimensionat; n acest caz textul care nu ncape n etichet este tiat i nu mai este afiat. 9 Trunchierea textului WordWrap . Este de tip logic i stabilete cum va fi expandat eticheta (pe orizontal sau pe vertical) pentru a ncpea textul atunci cnd controlul este redimensionat: .T. - textul este trunchiat, adic se mrete dimensiunea etichetei pe vertical, pstrndu-i-se limea (textul va fi scris pe mai multe rnduri, separarea textului pe rnduri fcndu-se la nivel de cuvnt), iar .F. (implicit) - textul nu se trunchiaz, nu i se modific nlimea, dar este mrit limea. Dac are valoarea .T., proprietatea AutoSize este ignorat.
Construii un formular care conine etichete Caseta de dialog Test mouse conine dou seciuni pentru testarea mouse-ului: seciunea Deplasare mouse - pentru testarea deplasrii mouse-ului (coordonate, buton apsat i taste apsate) i Apsare buton - pentru testarea butonului apsat (coordonate, buton apsat i taste apsate). Controalele folosite pentru afiare sunt de tip etichet (label). n fiecarea seciune se creeaz 11 etichete. De exemplu, n prima seciune se definesc 5 etichete cu text fix: Coordonatele cursorului de mouse sunt:, x=, y=, Buton apasat, Tasta apasata i 6 etichete cu legende dependente de aciunile mouse-ului: dou pentru coordonate, una pentru butonul apsat i trei pentru tastele apsate.
Creai un formular nou. Creai n formular un set de pagini cu dou pagini. Creai n fiecare seciune etichetele astfel: executai clic pe butonul Label de pe bara Form controls i glisai apoi mouse-ul n formular pentru a trasa eticheta.
272 Informatic
Folosind fereastra Properties stabilii proprietile formularului, a setului de pagini, ale paginilor i ale obiectelor folosite:
* Formularul Page2.Caption = "Apasare buton" Name = "Formular" * Etichetele Top = 11 * proprietati comune: Left = 33 Name = .... Height = 296 AutoSize = .T. Width = 375 BackStyle = 0 BackColor = 200,200,200 Caption = .... Caption = "Test mouse" Height = ... WindowState = 0 Left = ... * Setul de pagini Top = ... Name = "Caseta" Width = ... PageCount = 2 *Exemplu: TabStretch = 1 Name = "L2" ActivePage = 1 AutoSize = .T. Top = 0 BackStyle = 0 Left = -12 Caption = "x= " Width = 408 Height = 18 Height = 253 Left = 47 * Sectiunea 1 Top = 72 Page1.Name = "Sect1" Width = 20 Page1.Caption="Deplasare mouse" * Butonul de comanda * Sectiunea 2 Name = "Buton" Page2.Name = "Sect2" Caption = "\<Terminare" Pentru seciunea 1 a casetei se asociaz o procedur evenimentului MouseMove (n etichetele L4 i L5 se afieaz coordonatele, n eticheta L7 se afieaz butonul apsat, iar n etichetele L9, L10 i L11 se afieaz tastele apsate): Procedure Sect1.MouseMove Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Caseta.Pages(1).L4.Caption=str(nXCoord,4,0) ThisForm.Caseta.Pages(1).L5.Caption=str(nYCoord,4,0) Do case case nButton=1 ThisForm.Caseta.Pages(1).L7.Caption='Stanga' case nButton=2 ThisForm.Caseta.Pages(1).L7.Caption='Dreapta' case nButton=4 ThisForm.Caseta.Pages(1).L7.Caption='Mijloc' otherwise nButton=0 ThisForm.Caseta.Pages(1).L7.Caption='' Endcase if inlist(nShift,1,3,5,7) ThisForm.Caseta.Pages(1).L9.Visible=.T. else ThisForm.Caseta.Pages(1).L9.Visible=.F. endif if inlist(nShift,2,3,6,7) ThisForm.Caseta.Pages(1).L10.Visible=.T. else
273
ThisForm.Caseta.Pages(1).L10.Visible=.F. endif if inlist(nShift,4,5,6,7) ThisForm.Caseta.Pages(1).L11.Visible=.T. else ThisForm.Caseta.Pages(1).L11.Visible=.F. Endif ThisForm.Caseta.Refresh Endproc Pentru seciunea 2 a casetei se asociaz o procedur evenimentului MouseDown (n etichetele L10 i L11 se afieaz coordonatele, n eticheta L2 se afieaz butonul apsat, iar n etichetele L5, L5 i L6 se afieaz tastele apsate) i o procedur evenimentului MouseUp: Procedure Sect2.MouseDown Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Caseta.Pages(2).L10.Caption=str(nXCoord,4,0) ThisForm.Caseta.Pages(2).L11.Caption=str(nYCoord,4,0) Do case case nButton=1 ThisForm.Caseta.Pages(2).L2.Caption='Stanga' case nButton=2 ThisForm.Caseta.Pages(2).L2.Caption='Dreapta' case nButton=4 ThisForm.Caseta.Pages(2).L2.Caption='Mijloc' otherwise ThisForm.Caseta.Pages(2).L2.Caption='' Endcase if inlist(nShift,1,3,5,7) ThisForm.Caseta.Pages(2).L4.Visible=.T. else ThisForm.Caseta.Pages(2).L4.Visible=.F. endif if inlist(nShift,2,3,6,7) ThisForm.Caseta.Pages(2).L5.Visible=.T. else ThisForm.Caseta.Pages(2).L5.Visible=.F. endif if inlist(nShift,4,5,6,7) ThisForm.Caseta.Pages(2).L6.Visible=.T. else ThisForm.Caseta.Pages(2).L6.Visible=.F. Endif ThisForm.Caseta.Refresh Endproc Procedure Sect2.MouseUp Lparameters nButton, nShift, nXCoord, nYCoord ThisForm.Caseta.Pages(2).L10.Caption='' ThisForm.Caseta.Pages(2).L11.Caption='' ThisForm.Caseta.Pages(2).L2.Caption='' ThisForm.Caseta.Pages(2).L4.Visible=.F. ThisForm.Caseta.Pages(2).L5.Visible=.F.
274 Informatic
ThisForm.Caseta.Pages(2).L6.Visible=.F. ThisForm.Caseta.Refresh Endproc Pentru butonul de comand s-a asociat o procedur evenimentului Click: Procedure Click ThisForm.Release Endproc
275
9 Lungimea maxim a textului MaxLength (tip numeric) - numrul maxim de caractere care pot fi scrise n caseta de text . Se folosete n cazul cmpurilor de tip ir de caractere pentru ca textul introdus s nu depeasc lungimea permis n cmp. 9 Proprieti prin care se controleaz formatul de introducere i afiare a datei memorate n proprietatea Value:
Formatul de introducere: Format (tip ir de caractere). Prin aceast proprietate se stabilete caracteristica ntregului cmp de editare. De exemplu, dac proprietatea are valoarea 'A', n caseta de text nu vei putea scrie dect litere. Masca de introducere: InputMask (tip ir de caractere). Prin aceast proprietate se stabilete un ablon pentru format n care se precizeaz caracteristica fiecrei poziii a formatului. Fa de proprietatea anterioar prezint avantajul c
ablonul Cod Semnificaie X Orice caracter. 9 Numai cifre i semne (ca de exemplu semnul minus -) # Cifre, spaii i semne $ Afieaz simbolul monetar $$ Afieaz simbolul monetar mobil. * Afieaz asteriscuri la stnga valorii. . Reprezint poziia punctului zecimal (separatporul ntre partea ntreag i partea fracionar). , Reprezint poziia separatorului ordinelor de mrime (sute de mii, sutele de mii de milioane etc.) Format Cod Semnificaie A Numai litere, fr spaii sau semne de punctuaie. D Pentru datele calendaristice, se folosete formatul stabilit prin set date. E Datele de tip dat calendaristic vor fi editate n format british. K Selecteaz textul din cmp atunci cnd este focalizat controlul. L Se folosete numai pentru tipul numeric; afieaz zerouri nesemnificative n n locul spaiilor. R Afieaz ablonul definit prin proprietatea InputMask. Valoarea ablonului nu va fi memorat n proprietatea Value. T Se folosete numai pentru tipul ir de caractere; nltur spaiile de la nceputul i de la sfritul irului de caractere. ! Se folosete numai pentru tipul ir de caractere; convertete toate literele n litere mari. $ Se folosete numai pentru tipul numeric; afieaz simbolul monetar.
permite i precizarea lungimii formatului. De exemplu, dac proprietatea are valoa-rea '9999.99', n caseta de text vei putea scrie numai o valoare numeric; numrul va avea maxim 4 cifre pentru partea ntreag i dou cifre pentru partea fracionar. 9 Selectarea la focalizare: SelectOnEntry . Este de tip logic; dac are valoarea .T., coninutul cmpului este selectat la focalizarea controlului. Se recomand selectarea la focalizare pentru cmpurile a cror valoare de obicei trebuie schimbat des. 9 Proprieti specifice casetelor de text pentru introducerea cmpurilor memo:
Deschiderea ferestrei de editare a cmpului memo: OpenWindow (tip logic). Se folosete pentru a stabili modul n care se face desciderea ferestrei: dac are valoarea .T. (implicit), se va deschide automat atunci cnd este focalizat controlul, altfel trebuie deschis de ctre utilizator prin apsarea tastelor Ctrl+PageDown. Fereastra folosit pentru editarea cmpului memo: MemoWindow (tip ir de caractere). Ea poate fi: fereastra implicit a interfeei Visual FoxPro (valoarea
276 Informatic
proprietii este irul vid) sau o fereastr definit de utilizator (valoarea proprietii va fi numele ferestrei).
Construii un formular care conine casete de text folosind metoda programrii Realizai o caset de dialog care simuleaz un calculator. Vor fi trei casete de text: a,b - operanzii i c - rezultatul. Rezultatul trebuie s fie protejat la scrire. Pentru cele patru operaii se vor folosi declanatoarele +, -,*,/. Pentru operaia de mprire se va testa dac mpritorul este 0; dac are valoarea 0 se va afia un mesaj de atenionare, iar focalizarea va fi mutat pe operandul b. Cel de al cincilea buton, Terminare, se folosete pentru a nchide caseta de dialog.
277
F1.AddObject('L1','Label') F1.AddObject('C1','TextBox') F1.AddObject('L2','Label') F1.AddObject('C2','TextBox') F1.AddObject('L3','Label') F1.AddObject('L4','Label') F1.AddObject('C3','TextBox') F1.AddObject('B1','Buton1') F1.AddObject('B2','Buton2') F1.AddObject('B3','Buton3') F1.AddObject('B4','Buton4') F1.AddObject('B5','Buton5') F1.L1.AutoSize = .T. F1.L1.BackColor=RGB(220,220,220) F1.L1.Caption = "a" F1.L1.Height = 18 F1.L1.Left = 48 F1.L1.Top = 36 F1.L1.Width = 8 F1.L1.Visible =.T. F1.L2.AutoSize = .T. F1.L2.BackColor=RGB(220,220,220) F1.L2.Caption = "b" F1.L2.Height = 18 F1.L2.Left = 48 F1.L2.Top = 96 F1.L2.Width = 8 F1.L2.Visible =.T. F1.L3.BackColor=RGB(220,220,220) F1.L3.Caption = "c" F1.L3.Height = 18 F1.L3.Left = 48 F1.L3.Top = 144 F1.L3.Width = 7 F1.L3.Visible =.T. F1.L4.BackColor=RGB(220,220,220) F1.L4.Caption = "Imposibil!!!; Impartire la zero" F1.L4.Height = 25 F1.L4.Left = 36 F1.L4.Top = 204 F1.L4.Visible = .F. F1.L4.Width = 181 F1.C1.Value=0 F1.C1.InputMask = "999999" F1.C1.Left = 85 F1.C1.Top = 36 F1.C1.Height = 25 F1.C1.Width = 108 F1.C1.Visible =.T.
F1.C2.Value=0 F1.C2.InputMask = "999999" F1.C2.Left = 85 F1.C2.Top = 84 F1.C2.Height = 25 F1.C2.Width = 108 F1.C2.Visible =.T. F1.C3.Value=0 F1.C3.BackColor=RGB(220,220,220) F1.C3.Height = 25 F1.C3.Left = 85 F1.C3.ReadOnly = .T. F1.C3.Top = 144 F1.C3.Width = 108 F1.C3.Style = 1 F1.C3.Visible =.T. F1.B1.Visible =.T. F1.B2.Visible =.T. F1.B3.Visible =.T. F1.B4.Visible =.T. F1.B5.Visible =.T. F1.Show Read events Define class Buton1 as; CommandButton Top = 24 Left = 276 Height = 25 Width = 61 Caption = "+" Procedure Click ThisForm.C3.Value=; ThisForm.C1.Value+; ThisForm.C2.Value ThisForm.C3.Refresh Enddefine Define class Buton2 as; CommandButton Top = 60 Left = 276 Height = 25 Width = 61 Caption = "-" Procedure Click ThisForm.C3.Value=; ThisForm.C1.Value-; ThisForm.C2.Value ThisForm.C3.Refresh Enddefine
278 Informatic
Define class Buton3 as; ThisForm.B4.StatusBarText=; CommandButton 'ImposibiI!!! -; Top = 96 Impartire la 0' Left = 276 ThisForm.L4.Visible=.T. Height = 25 ThisForm.C2.SetFocus Width = 61 else Caption = "*" ThisForm.C3.Value=; Procedure Click ThisForm.C1.Value/; ThisForm.C3.Value=; ThisForm.C2.Value ThisForm.C1.Value*; ThisForm.C3.Refresh ThisForm.C2.Value endif ThisForm.C3.Refresh Enddefine Enddefine Define class Buton5 as; Define class Buton4 as; CommandButton CommandButton Top = 204 Top = 132 Left = 264 Left = 276 Height = 25 Height = 25 Width = 84 Width = 61 Caption = "\<Terminare" Caption = "/" Procedure Click Procedure Click ThisForm.Release ThisForm.B4.StatusBarText='' clear events ThisForm.L4.Visible=.F. Enddefine if ThisForm.C2.Value=0 Salvai fiierul. Lansai n execuie programul Calc_p.prg. Testai formularul.
Construii un formular care conine casete de text folosind metoda vizual 1. Realizai caseta de dialog din exemplul precedent folosind metoda vizual.
Creai un formular nou, n care creai urmtoarele obicete: patru etichete, trei casete de text i cinci butoane de comand.
Stabilii pentru formular i obiecte urmtoarele proprieti: * Formularul Name = "Label2" && Eticheta2 Name = "Form1" Caption = "\<b" Top = 0 Name = "Label3" && Eticheta3 Left = 0 Caption = "c" BackColor = 220,220,220 Name = "Label4" && Eticheta4 Caption = "Operatii" Caption = "Imposibil!!! ; * Casetele de text Impartire la zero" Name = "Text1" && Text1 Visible = .F. InputMask = "999999" * pentru toate etichetele Name = "Text2" && Text2 AutoSize = .T. InputMask = "999999" BackStyle = 0 Name = "Text3" && Text3 * Butoanele BackColor = 220,220,220 Name = "Command1" && Buton1 ReadOnly = .T. Caption = "+" Style = 1 Name = "Command2" && Buton2 * Etichetele Caption = "-" Name = "Label1" && Eticheta1 Name = "Command3" && Buton3 Caption = "\<a" Caption = "*"
279
Name = "Command4" && Buton4 Name = "Command5" && Buton5 Caption = "/" Caption = "Terminare" Scriei procedurile asociate urmtoarelor evenimente: evenimentul Init al formularului i evenimentele Click ale butoanelor: procedure Init && Formular ThisForm.Text1.Value=0 ThisForm.Text2.Value=0 ThisForm.Text3.Value=0 ThisForm.Label4.Visible=.F. endproc procedure Click && Buton1 ThisForm.Text3.Value=ThisForm.Text1.Value+ThisForm.Text2.Value ThisForm.Text3.Refresh endproc procedure Click && Buton2 ThisForm.Text3.Value=ThisForm.Text1.Value-ThisForm.Text2.Value ThisForm.Text3.Refresh endproc procedure Click && Buton3 ThisForm.Text3.Value=ThisForm.Text1.Value*ThisForm.Text2.Value ThisForm.Text3.Refresh endproc procedure Click && Buton4 ThisForm.Command4.StatusBarText='' ThisForm.Label4.Visible=.F. if ThisForm.Text2.Value=0 ThisForm.Command4.StatusBarText='ImposibiI!!! -Impartire la 0' ThisForm.Label4.Visible=.T. ThisForm.Text2.SetFocus else ThisForm.Text3.Value=ThisForm.Text1.Value/ThisForm.Text2.Value ThisForm.Text3.Refresh endif endproc procedure Click && Buton5 ThisForm.Release endproc Salvai formularul. l lansai n excuie i-l testai.
2. Realizai caseta de dialog din exemplul precedent folosind metoda vizual.
Salvai formularul anterior sub un alt nume. tergei cea de a patra etichet (cea folosit pentru atenionare; pentru atenionare vei folosi de data aceasta o fereastr de atenionare). Adugai la formular cele dou noi butoane (pentru salvare n memorie
280 Informatic
M+ i pentru readucere din memorie). Pentru memorarea numrului se va folosi variabila de memorie global memorie.
Pentru obiectele adugate stabilii proprietile: Name = "Command6" && Buton6 Name = "Command7" Caption = "M+" Caption = "M-" Scriei o procedur asociat evenimentului Load al formularului n care iniializai variabila de memorie memorie. procedure Load && Formular memorie=0 public memorie endproc Modificai procedura asociat evenimentului Clic al butonului Buton4. procedure Click && Buton4 ThisForm.Command4.StatusBarText='' if ThisForm.Text2.Value=0 ThisForm.Command4.StatusBarText='ImposibiI!!! -Impartire la 0' Wait Windows 'ImposibiI!!! -Impartire la 0' ThisForm.Text2.SetFocus else ThisForm.Text3.Value=ThisForm.Text1.Value/ThisForm.Text2.Value ThisForm.Text3.Refresh endif endproc Scriei procdurile asociate evenimentului Clic pentru cele dou noi butoane: procedure Click && Buton6 procedure Click && Buton7 Memorie=ThisForm.Text3.Value ThisForm.Text1.Value=Memorie endproc endproc
3. Realizai caseta de dialog pentru introducerea parolei. Creai formularul i adugai la formular o etichet, o caset de text i un buton de comand. Sursa controlului caset de text va fi variabila de memorie m.parola. Pentru a permite introducerea unei parole caseta de dialog trebuie s fie un formular modal. Stabilii pentru formular i controale urmtoarele proprieti: * Formularul AutoSize = .T. Name = "Form1" BackStyle = 0 BackColor = 192,192,192 Caption = "Parola" Caption = "Parola" Name = "Text1" Closable = .F. ControlSource = "m.parola" WindowType = 1 && Modal PasswordChar = "*" * Obiectele Name = "Command1" Name = "Label1" Caption = "\<Terminare" Scriei procedurile asociate evenimentelor formularului Load i Unload (prin care este returnat parola ctre un program):
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor Procedure Load && Formular Procedure Unload && Formular parola=space(6) return parola endproc endproc Scriei procedura asociat evenimentului Click al butonului de terminare: Procedure Click && Buton ThisForm.Release endproc Salvai formularul sub numele form_par.
281
Deschidei fereastra editorului de texte i scriei urmtorul program prin care lansai n execuie formularul. Formularul va furniza programului apelant parola introdus de utilizator. Parola corect este alfa plus dou caractere pentru ziua din lun (de exemplu, dac parola se introduce pe 12 februarie, parola corect este alfa12). n programul principal se stabilete parola corect (variabila parola_c) i se verific dac parola furnizat este corect. Se accept maxim 3 ncercri. set talk off if day(date())<10 parola_c='alfa0'+str(day(date()),1) else parola_c='alfa'+str(day(date()),2) endif for i=1 to 3 do form form_par to parola if parola=parola_c wait window 'Felicitari!!! Parola este corecta' exit else wait window 'Parola gresita !!! Mai aveti '+str(3-i,1)+'; incercari' endif endfor Salvai programul. Lansai n execuie programul i testai modul n care funcioneaz programul i formularul pentru parol. 4. Realizai o caset de dialog care s simuleze operaiile de selectare a textului i de lucru cu zona de memorie Clipboard pentru transferul datelor (operaiile Copy, Cut i Paste). Pentru aceste operaii se vor folosi butoanele Copiere (Copy), Mutare (Cut), Inserare (Paste) i Stergere (Delete). Butoanele au taste de acces. n acest mod scurttura Alt+C este similar cu Ctrl+C, Alt+M este similar cu Ctrl+X, Alt+I este similar cu Ctrl+V, iar Alt+S este similar cu Delete. Transferul textului se va face prin intermediul unei variabile de memorie zona_s care simuleaz zona de memorie Clipboard. Butoanele
282 Informatic
Stergere, Copiere i Mutare nu vor fi disponibile dac nu a fost selectat un text, iar butonul Inserare nu va fi disponibil dac variabila de memorie zona_s este vid (n Clipboard nu au fost transferate date). n caseta de dialog se vor crea dou zone pentru editarea textului (dou controale de tip EditBox). Operaiile se pot executa n aceeai zon (acelai document) sau ntre cele dou zone (dou documente diferite). Pentru a ti cu ce zon de text se va lucra, se va folosi variabila de memorie text, de tip numeric, care are valoarea 1 pentru prima zon de text i valoarea 2 pentru a doua zon de text. Creai formularul i adugai la formular dou etichete, dou zone de editare i cinci butoane de comand. Pentru zona de editare folosii butonul EditBox de pe bara Form Controls. Stabilii pentru formular i controale urmtoarele proprieti: * Formularul * Pentru toate etichetele Name = "Form1" AutoSize = .T. BackColor = 192,192,192 BackStyle = 0 Caption = "Prelucrare text" * Butoane Closable = .F. Name = "Command1" * Zonele de editare Caption = "\<Stergere" Name = "Edit1" Name = "Command2" HideSelection = .F. Caption = "\<Inserare" Name = "Edit2" Name = "Command3" HideSelection = .F. Caption = "\<Copiere" *Etichetele Name = "Command4" Name = "Label1" Caption = "\<Mutare" Caption = "Text 1" Name = "Command5" Name = "Label2" Cancel = .T. Caption = "Text 2" Caption = "\<Terminare" Scriei procedura asociat evenimentului Init al formularului. n aceast procedur declarai variabilele globale text i zona_s i iniializai proprietile Value ale celor dou zone de editare: procedure Init && Formular ThisForm.Edit1.Value='' public text,zona_s ThisForm.Edit2.Value='' text=1 endproc zona_s='' Scriei procedurile asociate evenimentului LostFocus pentru cele dou zone de text, n care memorai n variabila text zona de editare care a pierdut focalizarea. procedure LostFocus &&Edit1 procedure LostFocus &&Edit1 text=1 text=2 endproc endproc Scriei procedurile asociate evenimentului Click pentru cele cinci butoane: procedure Click &&Buton1 else if text=1 ThisForm.Edit2.SelText=zona_s ThisForm.Edit1.SelText='' endif else endproc ThisForm.Edit2.SelText='' procedure Click &&Buton3 endif if text=1 endproc zona_s=ThisForm.Edit1.SelText procedure Click &&Buton2 else if text=1 zona_s=ThisForm.Edit2.SelText ThisForm.Edit1.SelText=zona_s endif
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor endproc ThisForm.Edit2.SelText='' procedure Click &&Buton4 endif if text=1 endproc zona_s=ThisForm.Edit1.SelText procedure Click &&Buton5 ThisForm.Edit1.SelText='' ThisForm.Release else endproc zona_s=ThisForm.Edit2.SelText Salvai formularul. Lansai n execuie formularul i-l testai.
283
5. Realizai o caset de dialog care s simuleze operaiile de cutare i nlocuire ntr-un text (operaiile Find i Replace). Pentru aceste operaii se vor folosi butoanele Cauta (Find), Inlocuieste (Replace) i Inlocuieste toate aparitiile (Replace All). Butoanele au taste de acces. n acest mod scurttura Alt+C este similar cu Ctrl+F i Alt+I este similar cu Ctrl+H. Butonul Cauta nu este disponibil dac zona de editare i caseta de text cu eticheta Se caut sunt vide. Butoanele Inlocuieste i Inlocuieste toate aparitiile nu sunt disponibile dac nu a fost gsit n zona de text textul scris n caseta de text cu eticheta Se cauta.
Creai formularul i adugai la formular trei etichete, o zon de editare, dou casete de text, un grup de trei butoane de comand i un buton de comand. Stabilii
Grupul de butoane de comand
pentru formular i controale urmtoarele proprieti: * Formular Name = "Form1" Closable = .F. BackColor = 192,192,192 Caption = "Prelucrare texte" * Zona de editare Name = "Edit1" HideSelection = .F. *Etichete Name = "Label1" Caption = "Text" Name = "Label2" Caption = "Se cauta"
Name = "Label3" Caption = "Se inlocuieste cu" * Pentru toate etichetele AutoSize = .T. BackStyle = 0 *Casetele de text Name = "Text1" DisabledBackColor = 192,192,192 Name = "Text2" DisabledBackColor = 192,192,192
284 Informatic
* Grupul de butoane Command1.Caption = "\<Cauta" Name = "Commandgroup1" Command1.Style = 0 AutoSize = .T. Command2.Name = "Command2" ButtonCount = 3 Command2.AutoSize = .F. BackStyle = 0 Command2.Caption="\<Inlocuieste" Value = 1 Command3.Name = "Command3" Height = 106 Command3.AutoSize = .T. Left = 288 Command3.Caption = "Inlocuieste; Top = 36 toate \<aparitiile" Width = 198 * Butonul de comanda Command1.Name = "Command1" Name = "Command1" Command1.AutoSize = .F. Caption = "\<Terminare" Pentru formular scriei procedura asociat evenimentului Init: procedure Init &&Formular public x store 0 to x ThisForm.Edit1.Value='' ThisForm.Text1.Value='' ThisForm.Text2.Value='' ThisForm.Text1.Enabled=.F. ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc Pentru zona de editare scriei proceduri asociate evenimentelor GotFocus, LostFocus i Valid: procedure GotFocus && EditBox ThisForm.Text1.Enabled=.T. ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure LostFocus && EditBox ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure Valid && EditBox if len(ThisForm.Edit1.Value)<>0 ThisForm.Text1.Enabled=.T. Return .T. else ThisForm.Text1.Enabled=.F. Return .F. endif endproc
285
Pentru casetele de text scriei proceduri asociate evenimentelor GotFocus i LostFocus: procedure GotFocus &&Text1 ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure LostFocus &&Text1 if Len(ThisForm.Text1.Value)<>0 ThisForm.Commandgroup1.Command1.Enabled=.T. if Len(ThisForm.Text2.Value)<>0 ThisForm.Commandgroup1.Command2.Enabled=.T. ThisForm.Commandgroup1.Command3.Enabled=.T. endif else ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endif endproc procedure GotFocus &&Text2 ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure LostFocus &&Text2 if Len(ThisForm.Text2.Value)<>0 ThisForm.Commandgroup1.Command2.Enabled=.T. ThisForm.Commandgroup1.Command3.Enabled=.T. else ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endif endproc Pentru butoanele din grup i pentru butonul Terminare scriei proceduri asociate evenimentului Click: procedure Command1.Click && Grup.Buton1 x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value) if x<>0 ThisForm.Text2.Enabled=.T. ThisForm.Edit1.SelStart=at(alltrim(ThisForm.Text1.Value),; ThisForm.Edit1.Value)-1 ThisForm.Edit1.SelLength=Len(alltrim(ThisForm.Text1.Value)) n=n+1 else ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. ThisForm.Text2.Enabled=.F. endif
286 Informatic
endproc procedure Command2.Click && Grup.Buton1 ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value) ThisForm.Text2.Value='' ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure Command3.Click && Grup.Buton1 ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value) x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value) do while x<>0 ThisForm.Edit1.SelStart=at(alltrim(ThisForm.Text1.Value),; ThisForm.Edit1.Value)-1 ThisForm.Edit1.SelLength=Len(alltrim(ThisForm.Text1.Value)) ThisForm.Edit1.SelText=alltrim(ThisForm.Text2.Value) x=at(alltrim(ThisForm.Text1.Value),ThisForm.Edit1.Value) enddo ThisForm.Text2.Value='' ThisForm.Text2.Enabled=.F. ThisForm.Commandgroup1.Command1.Enabled=.F. ThisForm.Commandgroup1.Command2.Enabled=.F. ThisForm.Commandgroup1.Command3.Enabled=.F. endproc procedure Click && Buton1 ThisForm.Release endproc Salvai formularul. Lansai formularul n execuie i-l testai.
6. Creai tabelul agenda cu urmtoarea structur: nume(C,15), prenume(C,15), adresa (C,40), telefon(C,10) i data_n(D). Realizai o caset de dialog care s permit urmtoarele operaii cu datele din tabel: parcurgerea tabelului pentru vizualizare (nu se pot modifica datele din cmpuri) i adugarea de noi nregistrri. Butoanele >>> i <<< se folosesc pntru parcurgerea tabelului nainte i napoi, iar butonul Adauga pentru adugarea de noi nregistrri. Creai formularul i adugai la formular cinci etichete, o zon de editare (pentru cmpul adresa), patru casete de text (pentru restul cmpurilor) i patru butoane de comand. Stabilii pentru formular i controale urmtoarele proprieti: * Formular Name = "Form1" BackColor = 220,220,220 Caption = "Agenda" Closable = .F. * Casetele de text Name = "Text1" ControlSource = "agenda.nume"
287
Name = "Text2" Name = "Label4" ControlSource="agenda.prenume" "Tele\<fon" Name = "Text3" Name = "Label5" ControlSource="agenda.telefon" Caption = "\<Data nasterii" Name = "Text4" *pentru toate etichetele: ControlSource="agenda.data_n" AutoSize = .T. Format = "E" BackStyle = 0 * Zona de editare * Butoane Name = "Edit1" Name = "Command1" ControlSource="agenda.adresa" Caption = ">>>" *Etichetele Name = "Command2" Name = "Label1" Caption = "<<<" Caption = "\<Numele" Name = "Command3" Name = "Label2" Caption = "\<Adauga" Caption = "\<Preumele" Name = "Command4" Name = "Label3" Caption = "\<Terminare" "Adre\<sa" Scriei procedurile asociate evenimentelor Load, Unload i Init ale formularului: procedure Load &&Formular ThisForm.Text3.ReadOnly=.T. use agenda ThisForm.Text4.ReadOnly=.T. goto top ThisForm.Edit1.ReadOnly=.T. endproc ThisForm.Text1.SetFocus procedure Init &&Formular endproc set date to british procedure Unload &&Formular ThisForm.Text1.ReadOnly=.T. use ThisForm.Text2.ReadOnly=.T. endproc Scriei procedurile asociate evenimentului Init al casetelor de text i al zonei de editare: procedure Init &&Text1 endif if eof() endproc ThisForm.text1.Value='' procedure Init &&Text3 endif if eof() endproc ThisForm.Text3.Value='' procedure Init &&Text2 endif if eof() endproc ThisForm.Text2.Value='' procedure Init &&Text4 endif if eof() endproc ThisForm.Text4.Value={ / / } procedure Init &&Edit1 endif if eof() endproc ThisForm.Edit1.Value='' Scriei procedurile asociate evenimentelor Click ale butoanelor: procedure Click &&Buton1 ThisForm.Refresh if not eof() endif skip endproc ThisForm.Text1.ReadOnly=.T. procedure Click &&Buton2 ThisForm.Text2.ReadOnly=.T. if not bof() ThisForm.Text3.ReadOnly=.T. skip -1 ThisForm.Text4.ReadOnly=.T. ThisForm.Text1.ReadOnly=.T. ThisForm.Edit1.ReadOnly=.T. ThisForm.Text2.ReadOnly=.T.
288 Informatic
ThisForm.Text3.ReadOnly=.T. ThisForm.Text4.ReadOnly=.T. ThisForm.Edit1.ReadOnly=.T. ThisForm.Refresh endif endproc procedure Click &&Buton3 append blank ThisForm.Text1.ReadOnly=.F. ThisForm.Text2.ReadOnly=.F. Salvai formularul. Lansai formularul n i-l testai. ThisForm.Text3.ReadOnly=.F. ThisForm.Text4.ReadOnly=.F. ThisForm.Edit1.ReadOnly=.F. ThisForm.Refresh ThisForm.Text1.SetFocus endproc procedure Click &&Buton4 ThisForm.Release endproc
execuie
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 9 Evenimentele declanate de acionarea derulorului cu mouse-ul:
UpClick - cnd este acionat butonul de incrementare i DownClick - cnd este acionat butonul de decrementare.
289
Construii un formular care conine casete de text folosind metoda programrii Realizai o caset de dialog n care se folosesc trei controale de tip caset de text cu derulor pentru introducerea unei date: anul, luna i ziua. Se mai folosesc trei etichete i un buton de comand. Limitele pentru an au fost stabilite: minim 1900 i maxim anul curent, adic year(date()). Limitele pentru lun sunt 1 i 12, iar pentru zi 1 i 31.
Creai un formular nou. n formular creai urmtoarele controale: trei casete de text cu derulor, trei etichete i un buton de comand. Pentru caseta de text cu derulor folosii instrumentul Spinner de pe bara Form Controls.
Stabilii propritile pentru formular i controale. Pentru controlul Spinner1 trebuie s atribuii prorpietilor KeyboardHighValue i SpinnerHighValue o valoare calculat: year(date()). Pentru aceasta, n fereastra de proprieti folosii butonul constructorului de expresii Expression Builder care deschide caseta de dialog prin intermediul creia construii expresia folosit pentru calcul. * Formularul SpinnerLowValue = 1.00 Name = "Form1" Value = 1.0 BackColor = 192,192,192 * Derulorul Ziua Caption = "Data" Name = "Spinner3" Closable = .F. InputMask = "99" * Derulorul An KeyboardHighValue = 31 Name = "Spinner1" KeyboardLowValue = 1 Increment = 10.00 SpinnerHighValue = 31.00 InputMask = "9999" SpinnerLowValue = 1.00 KeyboardHighValue=year(date()) Value = 1.0 KeyboardLowValue = 1900 * Etichetele SpinnerHighValue = year(date()) Name = "Label1" SpinnerLowValue = 1900.00 Caption = "Anul" Value = 2000.0000 Name = "Label2" * Derulorul Luna Caption = "Luna" Name = "Spinner2" Name = "Label3" InputMask = "99" Caption = "Ziua" KeyboardHighValue = 12 * Butonul de comanda KeyboardLowValue = 1 Name = "Command1" SpinnerHighValue = 12.00 Caption = "Terminare"
290 Informatic
Definii urmtoarele proceduri pentru evenimentele care valideaz datele introduse n casetele de text cu derulor RangeLow i RangeHight i pentru evenimentul Click generat de executarea unui clic pe butonul de terminare: Procedure RangeLow && Spinner1 case; return 1900 thisform.spinner2.value=2 Endproc return 28 Procedure RangeHigh && Spinner2 case; luna inlist(thisform.spinner2.; return 12 value,1,3,5,7,8,10,12) Endproc return 31 Procedure RangeHigh && Spinner3 otherwise do case return 30 case; endcase thisform.spinner2.value=2 and; Endproc thisform.spinner1.value%4=0 Procedure Click return 29 ThisForm.Release Endproc Salvai formularul. Lansai n execuie formularul i-l testai.
291
9 Antetul coloanei. Este o etichet afiat n partea de sus a coloanei care conine un text explicativ referitor la datele afiate n coloan. 9 Celula. Celula curent (celula activ) este celula care primete focalizarea. Ea este determinat de numrul rndului i numrul coloanei la intersecia crora se gsete celula. Utilizatorul poate schimba n orice moment celula curent folosind mouse-ul sau tastatura (tasta Tab). Dimensiunea celulei este determinat de nlimea rndului i limea coloanei. Aceste proprieti trebuie s fie modificate dac nu sunt suficiente ca s ncap textul sau imaginea n celul. 9 Alinierea. Se refer la alinierea datelor n coloanele tabelului i n celule. 9 Barele de derulare. Se folosesc pentru a deplasa coninutul grilei atunci cnd nu pot fi vizualizate toate datele n zona de afiare a grilei. Se pot folosi bare de derulare pe vertical i pe orizontal. 9 Liniile folosite ca delimitatori. Pentru delimitarea celulelor se pot folosi linii care pot fi caracterizate de culoare i grosime. 9 Coloana cu marcajul pentru tergere. Este o coloan care poate fi folosit pentru a marca o nregistrare pentru tergere (se execut clic n aceast coloan n dreptul nregistrrii pe care vrei s o marcai pentru tergere sau pentru care vrei s anulai un marcaj pentru tergere - la fel ca la fereastra Browse). 9 Coloana cu marcajul rndului curent. Este o coloan care poate fi folosit pentru a stabili nregistrarea curent (se execut clic n aceast coloan n dreptul nregistrrii care vrei s devin nregistrare curent - la fel ca la fereastra Browse). 9 Panourile grilei. La fel ca la fereastra Browse grila poate fi mprit n dou partiii numite panouri. Cele dou panouri pot funciona ca dou grile independente, iar divizarea lor se face prin intermediul unei bare de divizare (split).
Coloana Antetul Formularul
Coloana cu marcajul rndului
Grila Toate aceste elemente pot fi caracterizate cu ajutorul proprietilor grilei, coloanelor i al anteturilor, pot fi manipulate cu ajutorul metodelor i pot rspunde la evenimente specifice.
292 Informatic
Antetul - obiectul Header
Creeaz un antet al unei coloane dintr-o gril prin care se afieaz o etichet n partea de sus a coloanei. Antetul poate rspunde la evenimente. Aspectul antetului poate fi stabilit prin intermediul proprietilor pentru fontul caracterelor (nume font, dimensiune, stil), pentru aliniere i culoare (pentru fond i pentru text). Obiectul nu are proprieti pentru dimensiune i poziie. Prin proprietatea Caption a antetului se stabilete textul care se afieaz ca etichet a coloanei. Antetul rspunde la evenimente declanate de aciunile mouse-ului (Click, RightClick, DblClick, MouseUp, MouseDown, MouseMove) i cunoate metoda Refresh.
293
Controlul curent: CurrentControl - este de tip ir de caractere i conine numele controlului care afieaz i primete date n celula activ a coloanei. Rspndirea influenei: Sparse - este de tip logic i se folosete pentru a controla modul n care controlul curent influeneaz i celelalte controale din coloan. Dac are valoarea .T. (valoarea implicit), numai celula activ folosete obiectul de interfa specificat n proprietatea CurrentControl (controlul curent), iar celelalte celule din coloan folosesc pentru afiare i editare controale de tip caset de text (TextBox). Dac are valoarea .F., toate celulele din coloan vor folosi obiectul de interfa specificat n proprietatea CurrentControl. Aadar, dac vrei ca ntr-o coloan s folosii pentru vizualizarea i editarea datelor un alt tip de control dect caseta de text, proprietatea Sparse a coloanei trebuie s aib valoarea .F.. Domeniul sursei de date: Bound - este de tip logic i se folosete pentru a controla sursa de date a controalelor din coloan. Dac are valoarea .T. (valoarea implicit), toate controalele din coloan vor folosi aceei surs de date ca i coloana, iar dac are valoarea .F., fiecare control din coloan va putea folosi propria sa surs de date. Aadar, dac vrei s obligai toate controalele din coloan s foloseasc sursa de date a coloanei (condiie necesar n cazul unui tabel al sursei de date), proprietatea Bound a coloanei trebuie s aib valoarea .T.. 9 Proprietile folosite pentru manipularea coloanei: Deplasarea coloanei: Movable - este de tip logic i determin dac o coloan poate fi mutat sau nu. Dac are valoarea .T. (valoarea implicit), coloana poate fi mutat interactiv, iar dac are valoarea .F., coloana nu poate fi mutat interactiv de ctre utilizator (cu ajutorul tastaturii sau prin glisarea cu mouse-ul a coloanei), ci numai din program prin modificarea valorii proprietii ColumnOrder. Redimensionarea: Resizable - este de tip logic i determin dac o coloan poate fi redimensionat sau nu. Dac are valoarea .T., coloana poate fi redimensionat interactiv (pe lime), iar dac are valoarea .F. (valoarea implicit), coloana nu poate fi redimensionat interactiv de ctre utilizator (cu ajutorul tastaturii sau prin glisarea cu mouse-ul a uneia dintre laturile coloanei), ci numai din program prin modificarea valorii proprietii Width. Printre metodele care pot fi folosite de coloan sunt: SetAll, Refresh, SetFocus i Move. Evenimentele recunoscute de coloan sunt: MouseMove, Moved (provocat prin mutatea interactiv a coloanei de ctre utilizator sau prin modificarea din program a proprietilor Top i Left ale coloanei) i Resize (provocat prin redimensionarea interactiv a coloanei de ctre utilizator, sau prin modificarea din program a proprietii Width a coloanei).
294 Informatic
grilei, dar care nu se stabilesc la nivelul componentei, deoarece trebuie s existe un aspect unitar al acestor componente la nivelul grilei): 9 nlimea antetului HeaderHeight . Este de tip numeric i se msoar n pixeli. 9 Modificarea interactiv a nlimii antetului AllowHeaderSizing . Este de tip logic. Dac are valorea .T., permite modificarea interactiv de ctre utilizator a nlimii antetului. 9 nlimea rndului RowHeight . Este de tip numeric. Dac are valoarea -1, nlimea este aleas automat astfel nct s ncap caracterele corespunztoare dimensiunii stabilite prin proprietile FontSize i FontName. 9 Modificarea interactiv a nlimii rndului AllowRowSizing . Este de tip logic. Dac are valorea .T., permite modificarea interactiv de ctre utilizator a nlimii rndului. 9 Evidenierea celulei focalizate HeighLight . Este de tip logic i determin cum este afiat celula focalizat: dac are valoarea .T., celula focalizat apare evideniat, iar dac are valoarea .F., celula focalizat nu apare evideniat. Alte proprieti se folosesc pentru a stabili aspectul fizic al elementelor specifice grilei: 9 Barele de derulare ScrollBars . Este de tip Valoare Efect ScrollBars numeric i controleaz ce bare de derulare sunt 0 Barele nu sunt afiate. afiate. Pentru valorile diferite de 0 barele de 1 Se afieaz numai barele derulare sunt afiate automat atunci cnd n spaiul pe orizontal. de afiare al grilei nu pot fi afiate toate datele din 2 Se afieaz numai barele sursa de date a grilei. Acionarea elementelor pe vertical. caracteristice ale barei de derulare sunt sesizate de 3 Se afieaz barele pe evenimentul Scrolled. Barele de derulare pot fi (implicit) orizontal i pe vertical. acionate interactiv (clic pe sgei, clic deasupra, deddesubt, la dreapta sau la stnga casetei de derulare sau glisarea casetei de derulare) sau pot fi acionate din program folosind metoda DoScroll. 9 Coloana cu marcajul nregistrrii curente RecordMark . Este de tip logic i controleaz dac este afiat coloana care conine marcajul pentru nregistrarea curent: dac are valoarea .T. (implicit), este afiat, iar dac are valoarea .F., nu este afiat. 9 Coloana cu marcajele pentru tergere DeleteMark . Este de tip logic i controleaz dac este afiat coloana care conine marcajele pentru tergere. Dac are valoarea .T. (implicit), este afiat, iar dac are valoarea .F., coloana nu este afiat. 9 Proprietile folosite pentru a caracteriza liniile folosite ca delimitatori: Modul de afiare a liniilor: GridLines - este de tip Valoare numeric. 0 Grosimea liniilor: GridLineWidth - este de tip numeric i determin grosimea n pixeli a liniilor. Culoarea liniilor: GridLineColor - este de tip numeric i reprezint codul culorii. 9 Proprietile folosite pentru a caracteriza mprirea grilei n panouri:
Efect GridLines Liniile nu sunt afiate. 1 Liniile se afieaz numai pe orizontal. 2 Liniile se afieaz numai pe vertical. 3 Liniile se afieaz pe (implicit) orizontal i pe vertical.
mprirea n panouri: Partition - este de tip numeric i controleaz dac grila este mprit sau nu n panouri. Dac are valoarea 0, grila nu este mprit n panouri, dac are valoarea diferit de 0, nseamn c grila este mprit n
295
panouri, iar valoarea proprietii reprezint distana dintre marginea stng a grilei i bara de divizare a grilei n panouri. Panoul activ: Panel - este de tip numeric. Dac are valoarea 0, panoul activ este n stnga, iar dac are valoarea 1 (implicit), panoul activ este n dreapta. Legtura dintre panouri: PanelLink - este de tip logic i determin dac cele dou panouri sunt legate ntre ele (dac au acelai aspect determinat de proprietile HeaderHeight, DeleteMark, GridLines,..., HeightLight, RecordMark, RowHeight, ScrollBar): dac are valoarea .T. (implicit), au acelai aspect, iar dac are valoarea .F., nu au acelai aspect. 9 Proprietile folosite pentru a caracteriza coloanele grilei: Numul de coloane: ColumnCount - este de tip numeric. Implicit are valoarea -1, care nseamn numr suficient de coloane pentru a afia cmpurile sursei de date. Referirea coloanei: Columns - este de tip vector i conine referine ctre coloanele grilei. Prima coloan afiat: LeftColumn - este de tip numeric i reprezint numrul coloanei (numrtoarea se face ncepnd de la stnga) care va fi prima afiat. De exemplu, dac proprietatea are valoarea 3, afiarea n gril va ncepe cu coloana 3, iar coloanele 1 i 2 nu vor fi afiate. Pe lng proprietile care caracterizeaz aspectul, grila mai are i proprieti specifice, prin care este caracterizat comportamentul ei: 9 Proprietile folosite pentru a caracteriza celula activ (focalizat): Poziia absolut furnizat de numrul rndului ActiveRow i de numrul coloanei ActiveColumn . Aceste proprieti sunt de tip numeric i se calculeaz fa de primul rnd, respectiv prima coloan a grilei. Sunt proprieti protejate la scriere (read-only). Aceste valori corespund parametrilor metodei ActivateCell. Poziia relativ furnizat de numrul rndului RelativeRow fa de primul rnd afiat n gril i de numrul coloanei RelativeColumn fa de prima coloan afiat n gril. Aceste proprieti sunt de tip numeric. De exemplu, dac prima coloan afiat n gril este coloana 2, iar proprietatea ActiveColumn are valoarea 5, nseamn c valoarea proprietii RelativeColumn este 3. 9 Adugarea datelor la gril este controlat cu proprietatea de tip logic AllowAddNew , care dac are valoarea .T. permite adugarea de noi rnduri la gril (dac se apas tasta se mai adaug un rnd la gril). 9 Proprietile folosite pentru a caracteriza sursa de date a grilei: Tipul sursei de date: RecordSourceType este de tip numeric i caracterizeaz ce date se vor folosi pentru a popula grila. Dac datele vor fi preluate dintr-un tabel, acesta poate fi permanent sau temporar (cusor), poate fi deja construit sau poate fi construit la iniializarea grilei (n procedura asociat evenimentului Init al grilei se poate crea un tabel folosind comanda SQL Create table). nregistrrile tabelului vor fi rndurile grilei, iar cmpurile lui vor fi coloanele grilei. Sursa de date: RecordSource este de tip ir de caractere i furnizeaz numele tabelului folosit ca surs de date sau numele aliasului cursorului sau numele fiierului de interogri.
296 Informatic
RowSourceType Semnific: 0 - Table Sursa de date este un tabel deja construit. El va fi deschis automat la iniializarea grilei (evenimentul Init). 1 - Alias (implicit) Tabelul care va fi sursa de date este specificat prin alias. 2 - Prompt Sursa de date este un tabel al crui nume va fi specificat de utilizator pin intermediul unei casete de dialog; dac este deschis o baz de date poate alege un tabel din ea. 3 - Query Sursa de date este generat dintr-un fiier de interogri (.qpr). 4 - SQL Statement Sursa de date va fi descris printr-o instruciune SQL Select de interogare a bazei de date, care va genera un tabel permanent sau temporar ce va fi afiat n gril. RowSource Numele tabelului. Aliasul tabelului. Numele tabelului.
9 Proprietile folosite pentru a caracteriza grila care afieaz date dintr-un tabel al bazei de date:
Cmpul cheie: RelationalExpr este de tip caracter i precizeaz cmpul cheie care asigur legtura ntre tabelul condus i tabelul conductor i care permite reunirea celor dou tabele ntr-un singur tabel. Aliasul tabelului conductor: LinkMaster este de tip ir de caractere i furnizeaz aliasul tabelului conductor al tabelului afiat n gril. Pe lng metodele obinuite, printre care i SetAll i SetFocus, grila mai are urmtoarele metode specifice: 9 Manipularea barelor de derulare DoScroll . Prin aceast metod pemite derularea din program a coninutului grilei pentru a simula acionarea interactiv a barelor de derulare. Metoda are parametrul <n>. Apelul metodei se face cu DoScroll(<n>). Parametrul <n> determin modul n care se face derularea i poate avea urmtoarele valori: 0- derulare cu un rnd n sus, 1- derulare cu un rnd n jos, 2- derulare cu o pagin n sus, 3- derulare cu o pagin n jos, 4- derulare cu o coloan la stnga, 5- derulare cu o coloan la dreapta, 6derulare cu o pagin la stnga, 7- derulare cu cte o pagin la dreapta. 9 Activarea celulei ActiveCell . Prin aceast metod se poate schimba din program celula activ. Metoda trebuie s primeasc doi parametri: <n> - numrul rndului i <m> - numrul coloanei. Apelul metodei se face cu ActivateCell(<n>,<m>). 9 Adugarea unei coloane la gril AddColumn . Prin aceast metod se poate aduga un nou obiect Column la gril. Metoda trebuie s primeasc un parametru <n> - poziia coloanei n gril; coloanele care urmeaz dup ea sunt deplasate cu o poziie spre drepata. Apelul metodei se face cu AddColumn(<n>). 9 tergerea unei coloane din gril DeleteColumn . Prin aceast metod se poate terge un obiect Column din gril. Metoda poate primi un parametru <n> - poziia coloanei care se terge din gril, altfel se terge coloana activ (cea care conine celula activ); coloanele care urmeaz dup ea sunt deplasate cu o poziie spre stnga. Apelul metodei se face cu DeleteColumn([<n>]).
297
<nDirection> care i comunic modul n care a fost acionat bara de derulare: 0derulare cu un rnd n sus (butonul sau tasta ), 1- derulare cu un rnd n jos (butonul sau tasta ), 2- derulare cu o pagin n sus (clic pe bara vertical, deasupra casetei), 3derulare cu o pagin n jos (clic pe bara vertical, sub caset), 4- derulare cu o coloan la stnga (butonul sau tasta ), 5- derulare cu o coloan la dreapta (butonul sau tasta ), 6- derulare cu o pagin la stnga (clic pe bara orizontal, la stnga casetei), 7derulare cu o pagin la dreapta (clic pe bara orizontal, la dreapta casetei). 9 Marcarea pentru tergere a unei nregistrri Deleted . Acest eveniment este declanat fie de marcarea interactiv n gril a nregistrrii pentru tergere sau refacerea ei, fie prin marcarea pentru tergere cu comanda Delete. Procedura asociat evenimentului primete din partea acestuia parametrul <nRecNo> care i comunic numrul nregistrrii marcate pentru tergere. 9 Schimbarea celulei focalizate (fie interactiv prin deplasarea selectorului de celul cu mouse-ul sau cu tastatura, fie din program cu metoda ActivateCell): Dup mutarea focalizrii: AfterRowColChange - se produce atunci cnd utilizatorul mut focalizarea ntr-o celul dintr-o alt coloan sau un alt rnd al grilei, dup ce a fost focalizat noua celul i numai dac procedura asociat evenimentului When a obiectului din celula nou focalizat furnizeaz un rezultat .T.. Evenimentul furnizeaz un parametru care corespunde indexului coloanei sau rndului n care a fost mutat focalizarea. naintea mutrii focalizrii: BeforeRowColChange - se produce atunci cnd utilizatorul mut focalizarea ntr-o celul dintr-o alt coloan sau un alt rnd al grilei, nainte ca noua celul s primeasc focalizarea i nainte de evenimentul Valid al obiectului din celula din care se mut focalizarea.
Creai un formular nou. n acest formular vei crea n mod rapid o gril pentru cmpurile din tabelul agenda cu ajutorul obiectului Data Environment. Executai clic pe butonul Data Environment din bara Form Designer. Se deschide caseta de dialog Open din care alegei tabelul agenda. n fereastra Data Environment va fi afiat tabelul. Indicai titlul tabelului i l glisai n formular. Dup ce eliberai butonul mouse-ului, n formular se va crea o gril cu o structur de coloane care corespunde cmpurilor din tabel. Legendele din anteturile coloanelor vor fi numele cmpurilor. Facei urmtoarele modificri de proprieti n fereastra Properties: Pentru obiectul Grid1 modificai proprietatea AllowAddNew = .T., pentru obiectul
298 Informatic
Header1 al coloanei a cincea (controlul Column5) modificai proprietatea Caption= 'Data nasterii'.
Adugai o coloan la gril: n obiectul Grid1 modificai proprietatea ColumnCount=6. n coloana a asea se va afia un cmp calculat i anume vrsta persoanei. Stabilii pentru aceast coloan proprietile: pentru obiectul Column6 proprietile ControlSource=int((date()-agenda.data_n)/365) i ReadOnly=.T.(este protejat la scriere fiind un cmp calculat), iar pentru controlul Header al acestei coloane proprietatea Caption='Varsta'. Salvai formularul sub numele agenda_t i nchidei constructorul de formulare. Prin aceast metod fiecrei coloane i se atribuie implicit un control de tip caset de text. Vom schimba tipul controlului din coloana a treia (pentru adresa), cu o zon de editare, astfel: deschidei tabelul asociat formularului cu comanda: use agenda_t.scx Deschidei fereastra Browse cu comanda browse. Cutai n acest tabel nregistrarea care coprespunde obiectului Grid1.Column3.Text1 (caseta de text din coloana a treia a grilei). n aceast nregistrare facei urmtoarele modificri: n coloanele class i baseclass nlocuii textbox cu editbox, n coloana objname nlocuii Text1 cu Edit1. Deschidei cmpul Properties i tergei coninutul. nchidei fereastra Browse. nchidei tabelul cu comanda use. Deschidei fiierul pentru modificare cu comanda modi form agenda_t. Adugai la formular un buton pentru terminare. Facei modificrile ncesare pentru proprieti, astfel nct ele s corespund cu cele prezentate mai jos. * Mediul de date Column2.ControlSource =; Name = "Dataenvironment" "agenda.prenume" Name = "Cursor1" Column2.ReadOnly = .F. Alias = "agenda" Column3.Name = "Column4" CursorSource = agenda.dbf Column3.ControlSource =; * Formular "agenda.telefon" Name = "Form1" Column3.ReadOnly = .F. Caption = "Agenda" Column4.Name = "Column5" Closable = .F. Column4.ControlSource =; * Grila "agenda.data_n" Name = "Grid1" Column4.ReadOnly = .F. ColumnCount = 6 Column5.Name = "Column6" AllowAddNew = .T. Column5.ControlSource =; AllowRowSizing = .T. "int((date()-agenda.data_n)/365)" Panel = 1 Column5.ReadOnly = .T. ReadOnly = .T. Column6.Name = "Column3" RecordSource = "agenda" Column6.Bound = .T. RecordSourceType = 1 Column6.ControlSource =; RowHeight = 30 "agenda.adresa" * coloanele grilei Column6.ReadOnly = .F. Column1.Name = "Column1" Column6.Sparse = .F. Column1.ControlSource =; * Antetul coloanelor + control "agenda.nume" Name = "Header1" Column1.ReadOnly = .F. Caption = "nume" Column2.Name = "Column2" Name = "Text1" ReadOnly = .F.
299
Name = "Header1" ReadOnly = .T. Caption = "prenume" Name = "Header1" Name = "Text1" Caption = "adresa" ReadOnly = .F. Name = "Edit1" Name = "Header1" ReadOnly = .F. Caption = "telefon" * pentru toate controalele Name = "Text1" * caseta de text: ReadOnly = .F. BorderStyle = 0 Name = "Header1" Margin = 0 Caption = "data nasterii" ForeColor = 0,0,0 Name = "Text1" BackColor = 255,255,255 ReadOnly = .F. * Butonul de comanda Name = "Header1" Name = "Command1" Caption = "varsta" Caption = "\<Termina" Name = "Text1" Default = .T. Scriei procedurile asociate evenimentelor Init al formularului i Click al butonului de nchidere (prin care se terg i nregistrrile considerate vide - fr nume pentru persoan - i cele care au fost marcate pentru tergere): procedure Init && formular delete set date to british endscan endproc pack procedure Click && Buton ThisForm.Release scan for nume=space(15) endproc Salvai formularul i-l lansai n execuie. Testai grila.
Adugai la tabel cmpul de tip numeric Copii (numrul de copii ai persoanei respective). Reluai operaia de creare a grilei folosind metoda constructorului rapid (deschidei tabelul, creai un formular nou i apsai butonul BuilderLock de pe bara Form Controls. n caseta de dialog care se deschide, n seciunea Grid gsii instrumentele necesare pentru a alege cmpurile din tabel care vor fi surs de date pentru coloanele grilei, n seciunea Style gsii instrumentele necesare pentru a alege stilul grilei, iar n seciunea Layout gsii instrumentele necesare pentru stabilirea unor proprieti pentru obiectele grilei: proprietatea Caption pentru Header, tipul controlului din lista Control type). Pentru cmpul Copii alegei un control de tip Spinner).
300 Informatic
ncercai:
Adevrat/Fals: 1. Textul afiat n formular prin care utilizatorul poate identifica rolul controlului se pstreaz n proprietatea Name. 2. Proprietile ReadOnly i Enabled au aceeai semnificaie: controleaz accesul la un control. 3. When este un eveniment declanat naintea primirii focalizrii de ctre control. 4. Proprietatea Default este specific unui control de tip CommandButton. 5. Eticheta are proprietatea AutoSize. 6. Cmpul de editare are proprietatea WordWrap. 7. Increment este o propritatea specific unui control de tip Spinner. 8. Evenimentul UpClick este specific tuturor controalelor. 9. Obiectul Column se poate crea numai n obiectul container Grid. 10. Proprietatea Panel controleaz mprirea grilei n panouri. Completai: 1. Informaiile despre control, afiate ntr-o caset atunci cnd este indicat controlul, se pstreaz n proprietatea .............. i se poate folosi numai dac proprietatea .............. a formularului are valoarea .T.
301
Evenimentul Valid se declaneaz .................................... focalizrii. Un formular care conine o caset de text pentru introducerea parolei trebuie s fie ............ Evenimentul DownClick este specific unui control de tip ........ Obiectul Header se poate crea numai n obiectul ................... Sparse este o proprietate specific unui control ........................... Textul afiat ca o etichet a unei coloane dintr-o gril se memoreaz n proprietatea Caption a controlului ........... 8. Proprietatea prin care se stabilete dac toate controalele dintr-o coloan au aceeai surs de date este ..............
Alegei rspunsurile corecte: 1. Tipul datelor memorate ntr-un control este determinat de proprietatea: a) Value b) Control Source c) Caption 2. SelectedText este o proprietate a controlului: a) TextBox b) Label c) EditBox 3. Pentru formatul datelor memorate n proprietatea Value, caracteristica ntregului cmp de editare se stabilete prin proprietatea: a) Format b) InputMask c) ControlSource 4. HeaderHeight este o proprietate specific unui control: a) Grid b) Column c) Header 5. Sursa de date a grilei se pstreaz n proprietatea: a) RecordSourceType b) RecordSource c) RecordMark spunsuri: R Adevrat/Fals: 1-F; 2-F; 3-A; 4-A; 5-A; 6-F; 7-A; 8-F; 9-A; 10-F.
Completai: 1-ToolTipText, ShowToolTips; 2-dup pierderea; 3-modal; 4-Spinner; 5- Column; 6Column; 7-Header; 8-Bound. Alegei rspunsurile corecte: 1-b; 2-a,c; 3- a; 4-a; 5-b.
Un set de opiuni care permite utilizatorului s ir de caractere aleag numai una dintre ele. sau numere O list de variante din care utilizatorul poate s aleag una sau mai multe variante. ir de caractere sau numere
O combinaie ntre o list i o caset de text. ir de caractere Utilizatorul poate fie s aleag din list, fie s sau numere scrie alegerea n zona de editare a casetei.
302 Informatic
Comutatorul CheckBoxx
Se folosete ntr-o aplicaie pentru a permite utilizatorului s aleag din dou variante posibile, adic s comute ntre dou variante posibile. ntr-un formular, comutatoarele sunt independente unele de altele. De obicei, legenda comutatorului afieaz numele comutatorului care corespunde datei a crui valoare va fi stabilit de utilizator. Proprietatea de aliniere a comutatorului (Alignment) se refer la modul de aranjare a legendei fa de comutator (la dreapta - 1 sau la stnga - 0). Metoda de acionare a unui comutator este la fel ca i la butoanele de comnad: Click. Astfel, procedura asociat evenimentului Click trebuie s asigure trecerea comutatorului dintr-o stare n alta i de a atribui proprietii Value valoarea corespunztoare noii stri. Valoarea unui comutator poate fi de tip logic sau numeric:.F. sau 0, dac este dezactivat, .T. sau 1, dac este activat i NULL sau 2, dac nu este disponibil. Stilul de reprezentare a comutatorului poate fi stabilit cu proprietatea Style. Dac proprietatea are valoarea 0 - Standard (implicit), controlul este reprezentat grafic printr-o caset pentru care, dac are n interior semnul de validare, valoarea controlului este .T., iar dac nu are semnul de validare are valoarea .F.. De aceea se mai numete i caset de validare. Dac proprietatea are valoarea 1 - Graphic, controlul este reprezentat ca un buton de comand: n interiorul su este afiat o imagine care poate fi nsoit de text (textul va fi scris centrat, sub imagine). Pentru acest stil de reprezentare trebuie folosit proprietatea DownPicture prin care se stabilete aspectul comutatorului cnd este activat. Se recomand folosirea acestui tip de reprezentare n barele cu instrumente. n proprietatea Value se memoreaz 0 sau 1 dac proprietatea ControlSource este tip numeric sau .T. sau .F. dac proprietatea ControlSource este de tip logic.
Creai un comutator folosind metoda programrii clasice n caseta de dialog Test se folosete comutatorul Afisare patrat pentru a controla afiarea unei forme de tip ptrat. Scriei pogramul surs:
F1 = CreateObject('Form') F1.Closable = .F. F1.Caption='Test' F1.Height=200 F1.BackColor = RGB(200,200,200) F1.AddObject('B1','Buton') F1.AddObject('C1','Comutator') F1.AddObject('P1','Patrat') F1.B1.Visible =.T. F1.C1.Value=.F. F1.C1.Visible = .T.
F1.C1.BackStyle = 0 F1.C1.Click F1.Show Read events Define class Comutator asB; CheckBox Alignment=1 Top = 40 Left = 10 Height = 25
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor Width = 130 Cancel = .T. FontSize=12 Left = 125 Caption = "\<Afisare patrat" Top = 150 Procedure Click Height = 25 ThisForm.P1.Visible =; Procedure Click !ThisForm.P1.Visible ThisForm.Release ThisForm.CurrentX=55 Clear events ThisForm.CurrentY=100 Enddefine If This.Value Define class Patrat as Shape ThisForm.Print("Patrat") Top = 30 else Left = 220 ThisForm.Print(space(12)) Width = 100 endif Height = 100 Enddefine Curvature = 0 Define class Buton as; BackColor = RGB(100,100,100) CommandButton FillStyle=7 Caption = '\<Terminarea' Enddefine Scriei pogramul. Lansai programul n execuie i testai comutatorul.
303
Creai un comutator folosind metoda programrii vizuale Creai un formular nou. Creai n acest formular urmtoarele obiecte: un comutator, o form i un buton. Pentru comutator folosii butonul CheckBox, iar pentru form butonul Shape de pe bara Form controls.
Stabilii pentru formular i controale urmtoarele proprieti: *Formular BackStyle = 0 Name = "Form1" Caption = "\<Afisare patrat" BackColor = 192,192,192 * Forma Caption = "Test" Name = "Shape1" Closable = .F. BackColor = 100,100,100 * Comutator FillStyle = 7 Name = "Check1" * Buton de comanda FontSize = 12 Name = "Command1" AutoSize = .T. Cancel = .T. Alignment = 1 Caption = "\<Terminare" Scriei procedurile asociate evnimentelor Init i Click ale comutatorului i evenimentului Click al butonului :
304 Informatic
procedure Init &&Check1 ThisForm.Print("Patrat") ThisForm.Check1.Value=.T. else endproc ThisForm.Print(space(12)) procedure Click &&Check1 endif ThisForm.Shape1.Visible=; endproc !ThisForm.Shape1.Visible procedure Click &&Buton ThisForm.CurrentX=55 ThisForm.Release ThisForm.CurrentY=100 endproc if ThisForm.Check1.Value Salvai formularul. l lansai n execuie i-l testai.
Adugai la tabelul Agenda cmpul de tip logic Are_copii (are valoarea adevrat dac persoana respectiv are copii). Reluai operaia de creare a grilei folosind metoda constructorului rapid. Pentru cmpul Are_copii alegei un control de tip CheckBox).
305
9 Apsai tastele de acces la buton (tasta Alt mpreun cu tasta literei de identificare).
Pentru administrarea butoanelor din grup putei folosi proprietile specifice grupului de butoane radio: 9 Numrul de butoane din grup ButtonCount . Este de tip numeric. 9 Butoanele Buttons . Este de tip vector i poate fi folosit pentru referirea butoanelor din grup. Putei folosi metoda SetAll pentru a atribui aceeai valoare a unei proprieti tuturor butoanelor din grup. Sintaxa de apelare a metodei este: SetAll('<proprietate>',<valoare>). Evenimentul Click asociat grupului de butoane radio va atribui datei valoarea asociat butonului selectat.
Creai un grup de butoane cu opiuni folosind metoda programrii n caseta de dialog Test se folosete grupul de butoane radio Afisare pentru a alege figura geometric afiat: cerc, elipsa sau patrat. n procedura asociat evenimentului Click al grupului de butoane se va testa proprietatea Value a grupului i n funcie de valoarea ei se va afia una dintre figurile geometrice. Pentru afiarea unei legende a grupului de butoane s-a folosit un control de tip etichet. Obiectele, proprietile obiectelor i procedurile asociate evenimentelor sunt prezentate n programul urmtor. Scriei programul, l salvai, l lansai n execuie i apoi testai grupul de butoane radio.
dimension a(3) a(1)='Cerc ' a(2)='Elipsa ' a(3)='Patrat ' F1 = CreateObject('Form') F1.Closable = .F. F1.FontSize=14 F1.Caption='Test' F1.BackColor = RGB(200,200,200) F1.AddObject('B1','Buton') F1.AddObject('GO1','GrupOpt') F1.AddObject('C1','Cerc') F1.AddObject('E1','Elipsa') F1.AddObject('P1','Patrat') F1.AddObject('L1','Label')
F1.B1.Visible =.T. F1.L1.Caption = 'Afisare' F1.L1.AutoSize = .T. F1.L1.Top=20 F1.L1.Left=20 F1.L1.BackStyle=0 F1.L1.Visible =.T. F1.GO1.Buttons(1).Caption=; "\<Cerc" F1.GO1.Buttons(2).Caption=; "\<Elipsa" F1.GO1.Buttons(3).Caption=; "\<Patrat" F1.GO1.SetAll("Width", 100) F1.GO1.SetAll("Left", 10)
306 Informatic
F1.GO1.SetAll("BackStyle", 0) F1.GO1.SetAll("FontSize", 12) F1.GO1.Visible = .T. F1.GO1.BackStyle = 0 F1.GO1.Click F1.Show Read events Define class GrupOpt as; OptionGroup ButtonCount = 3 Top = 40 Left = 20 Height = 80 Width = 100 Procedure Click ThisForm.C1.Visible = .F. ThisForm.E1.Visible = .F. ThisForm.P1.Visible = .F. do case case ThisForm.GO1.Value=1 ThisForm.C1.Visible =.T. case ThisForm.GO1.Value = 2 ThisForm.E1.Visible = .T. case ThisForm.GO1.Value = 3 ThisForm.P1.Visible = .T. endcase ThisForm.CurrentX=20 ThisForm.CurrentY=150 ThisForm.Print; (a(ThisForm.GO1.Value)) Enddefine Define class Buton as; CommandButton Caption = '\<Terminarea' Cancel = .T. Left = 125 Top = 200 Height = 25 Procedure Click ThisForm.Release clear events enddefine Define class Cerc as shape Top = 30 Left = 200 Width = 100 Height = 100 Curvature = 99 BackColor = RGB(200,200,200) FillStyle=4 Enddefine Define class Elipsa as shape Top = 30 Left = 200 Width = 120 Height = 80 Curvature = 99 BackColor = RGB(150,150,150) FillStyle=5 Enddefine Define class Patrat as shape Top = 30 Left = 200 Width = 100 Height = 100 Curvature = 0 BackColor = RGB(100,100,100) FillStyle=7 Enddefine
Creai un formular n care definii apoi o legend pentru grupul de butoane de opiuni, un grup de butoane de opiuni cu trei butoane, trei forme care se vor suprapune n formular i un buton. Stabilii proprietile formularului i ale controalelor din formular: * Formular AutoSize = .T. Name = "Form1" BackStyle = 0 BackColor = 200,200,200 Caption = "Afisare" Caption = "Test" * Grupul de optiuni Closable = .F. Name = "Optiongroup1" FontSize = 14 AutoSize = .T. * Eticheta grupului ButtonCount = 3 Name = "Label1" BackStyle = 0
307
Value = 1 BackColor = 150,150,150 Option1.Name = "Option1" Curvature = 90 Option1.Caption = "\<Cerc" FillStyle = 5 Option2.Name = "Option2" Height = 80 Option2.Caption = "\<Elipsa" Left = 195 Option3.Name = "Option3" Top = 24 Option3.Caption = "\<Patrat" Width = 120 * Formele Name = "Shape3" Name = "Shape1" BackColor = 100,100,100 BackColor = 200,200,200 FillStyle = 7 Curvature = 99 Height = 120 FillStyle = 4 Left = 195 Height = 120 Top = 24 Left = 195 Width = 120 Top = 24 Name = "Command1" Width = 120 Cancel = .T. Name = "Shape2" Caption = "\<Terminare" Scriei procedurile asociate evenimentelor Init al formularului, Init i Click ale grupului de butoane de opiuni i Click al butonului de comenzi: procedure Init &&Formular ThisForm.Optiongroup1.Value=1 ThisForm.Shape1.Visible=.T. ThisForm.Shape2.Visible=.F. ThisForm.Shape3.Visible=.F. endproc procedure Init &&Grup optiuni public a dimension a(3) a(1)='Cerc ' a(2)='Elipsa ' a(3)='Patrat ' ThisForm.Optiongroup1.SetAll("Width",100) ThisForm.Optiongroup1.SetAll("Left",100) ThisForm.Optiongroup1.SetAll("BackStyle",0) ThisForm.Optiongroup1.SetAll("FontSize",12) endproc procedure Click &&Grup optiuni ThisForm.Shape1.Visible = .F. ThisForm.Shape2.Visible = .F. ThisForm.Shape3.Visible = .F. do case case ThisForm.Optiongroup1.Value=1 ThisForm.Shape1.Visible=.T. case ThisForm.Optiongroup1.Value=2 ThisForm.Shape2.Visible =.T. case ThisForm.Optiongroup1.Value=3 ThisForm.Shape3.Visible =.T. endcase ThisForm.CurrentX=20 ThisForm.CurrentY=150 ThisForm.Print(a(ThisForm.Optiongroup1.Value))
308 Informatic
endproc procedure Click &&Buton ThisForm.Release endproc Salvai formularul, l lansai n execuie i-l testai.
Creai un grup de butoane cu opiuni folosind Option Group Builder Creai acelai grup de butoane radio folosind acest constructor rapid. Creai obiectul de tip grup de butoane de opiuni, l selectai i deschidei caseta de dialog a constructorului rapid cu opiunea Builder a meniului de comenzi rapide al controlului. Caseta de dialog conine trei seciuni: Buttons pentru stabilirea butoanelor (numr, tip, etichete), Layout pentru stabilirea aspectului controlului (modul n care vor fi afiate butoanele - pe orizontal sau vertical, dimensiunea spaiului care separ butoanele, stilul bordurii) i Value pentru stabilirea cmpului dintr-un tabel n care se va memora valoarea asociat controlului.
Lista ListBoxx afieaz colecia de valori din care utilizatorul poate s aleag sub forma unei liste de articole ntr-o caset, afiate pe vertical, pe o singur coloan sau pe mai multe coloane (liste multicoloan). n cazul listei multicoloan un articol din list conine mai multe coloane cu valori. Dac numrul de articole din colecie depete capacitatea de afiare a casetei, apar automat barele de derulare. Articolele listei pot s fie derulate numai pe vertical. Caseta combinat ComboBox este un control care combin o caset de text cu o list permind utilizatorului s aleag dintr-o colecie de valori. Aceste valori sunt afiate n list i utilizatorul poate fie s aleag un articol din list, fie s scrie valoarea de la tastatur n caseta de text. Fa de list, caseta combinat are i proprietatea stil Style . Proprietatea este de tip numeric i poate lua valorile: 0 - Drop-down Combo, adic o caset derulant combinat care conine o list derulant i o caset de text i 1 -
309
Drop-down List, adic o list derulant, care conine numai o list derulant (se mai numete i list ascuns). Aadar, folosind aceste tipuri de controale putei obine urmtoarele tipuri de liste: 9 Lista simpl (List). Afieaz pe ecran mai multe articole (nu neaprat toate articolele). Se obine cu controlul ListBox . 9 Lista ascuns sau lista derulant (Drop-down List). Afieaz pe ecran numai articolul curent selectat din list (ascunde restul articoleleor). Pentru a avea acces i la alte elemente, lista trebuie deschis. n urma operaiei de deschidere, lista este expandat (se deruleaz coninutul), iar utilizatorul are acces la mai multe articole (nu neaprat toate). Se obine cu controlul ComboBox avnd proprietatea Style=1. 9 Caseta derulant combinat (Drop-down List). Combin o list ascuns cu o caset de text. Afieaz pe ecran numai elementul curent selectat din list. Pentru a avea acces i la alte elemente lista trebuie deschis. n urma operaiei de deschidere, lista este expandat (sunt afiate mai multe articole, nu neaprat toate) i se activeaz caseta de text. Utilizatorul fie poate alege un articol din list, fie scrie valoarea n caseta de text. Se obine cu controlul ComboBox avnd proprietatea Style=0. Identificarea articolelor din list Articolele listei pot fi precizate, nainte de executarea listei (liste statice), la fel ca i n cazul butoanelor radio, prin precizarea sursei de date n momentul proiectrii i citirea sursei de date a listei n momentul execuiei, dar pot fi stabilite i n timpul execuiei (liste dinamice), prin adugarea i nlturarea unor articole din list. n timpul execuiei, articolele listei sunt pstrate n memoria intern sub forma unui tablou de memorie. Dac lista are o singur coloan, tabloul va fi de tip vector cu elemente de tip ir de caractere, iar dac are mai multe coloane, va fi de tip matrice. Fiecare element al vectorului, respectiv fiecare rnd al matricei reprezint un articol din list. Articolele listei pot fi aranjate n ordine alfabetic (sortate) sau nu. Fiecrui articol din list i se atribuie, la crearea listei sau la adugarea lui la list, dou co-duri numerice pentru identificare: 9 Indexul (Index) Reprezint poziia articolului n list la un moment dat. Operaiile de reordonare a listei, de tergere sau de adugare a unui articol au ca efect shimbarea poziiei articolului n list. n acest caz se modific i indexul articolelor, pentru a reflecta noua situaie. 9 Codul de identificare (ItemID). Reprezint un cod numeric unic asociat articolului care nu se modific pe toat perioada existenei articolului n list (nu se modific la schimbarea poziiei articolului n list). De obicei, acest cod este indexul iniial al articolului (atribuit articolului la adugarea lui la list). Numele proprietilor care folosesc acest cod pentru identificarea unui articol n list conin cuvntul cheie ID. Pentru conversia celor dou coduri numerice se pot folosi metodele: ItemIDToIndex - furnizeaz codul asociat al unui articol specificat prin index. IndexToItemID - furnizeaz indexul unui articol specificat prin codul asociat. De exemplu, dac ntr-o list identificat prin numele Lista articolul din poziia 5 are codul 20, apelarea metodei Lista.IndexToItemID(5) va furniza numrul 20, iar apelarea metodei Lista.IndexToItemID(20) va furniza numrul 5.
310 Informatic
Selectarea articolelor din list A selecta un articol din list, nseamn a atribui proprietii Value a obiectului de tip list valoarea articolului selctat. Dac lista este de tip multicoloan, proprietii Value a listei i se va atribui numai una dintre valoarile afiate n coloanele articolului. Selectarea unui articol din list se poate face fie cu mouse-ul (se execut clic pe articol), fie de la tastatur (se deplaseaz selectorul pe articol cu tastele i i se confirm alegerea apsnd tasta Enter). Dac lista este ascuns, n prealabil ea trebuie deschis fie cu mouse-ul (se execut clic pe butonul cu sgeat din partea dreapt), fie de la tastatur (se apas tastele Alt+). Mecanismul implementat pentru listele Visual FoxPro permite selectarea unui grup de articole din list. Aceast metod de selectare multipl este util atunci cnd dorii s executai operaii cu un grup de articole din list: s copiai, s mutai sau s tergei un grup de articole dintr-o list n alta (de exemplu s copiai, s mutai sau s tergei un grup de fiiere), s efectuai calcule cu un grup de articole etc. Pentru a avea evidena articolelor selectate, lista are asociat un vector cu valori logice de aceeai lungime ca i vectorul list. Fiecare element al vectorului descrie starea unui articol din list: dac are valoarea adevrat, articolul este selectat, iar dac are valoarea fals, nu este selectat. Selectarea unui grup de articole din list se face prin selectarea fiecrui articol fie cu mouse-ul (se execut clic pe articol cu tasta Shift sau Ctrl apsat), fie cu tastatura (se deplaseaz selectorul pe articol cu tastele i i se confirm alegerea apsnd tasta Shift sau Ctrl mpreun cu tasta Space). Tasta Shift se folosete atunci cnd grupul de articole selectat formeaz un bloc continuu n list, iar tasta Ctrl atunci cnd articolele sunt dispersate n list. Pentru anularea selectrii unui articol din grup se procedeaz la fel ca i la selectarea lui. Dac lista permite selectarea unui grup de articole, proprietii Value a listei i se va atribui valoarea ultimului articol selectat (chiar dac ntre timp i s-a anulat selectarea, dar dup el nu a mai fost selectat un alt articol din list). Lista poate s permit sau nu selectarea unui grup de articole. De exemplu, dac lista conine fiiere care pot fi deschise, se va putea selecta un singur fiier, iar dac lista conine documente care pot fi copiate sau mutate, se vor putea selecta mai multe documente. Proprietile specifice listei sunt: 9 Proprietile folosite pentru a controla culoarea de afiare a articolelor i a listei: Lista nu este disponibil: DisabledBackColor - pentru fundal i DisabledForeColor - pentru text. Chenarul listei: BorderColor - pentru fundal i DisabledItemForeColor - pentru text. Articolele din list (care nu au fost selectate): ItemBackColor - pentru fundal i ItemForeColor - pentru text. Articolele selectate din list: SelectedItemBackColor - pentru fundal i SelectedItemForeColor - pentru text. Articolele din list care nu sunt disponibile: DisabledItemBackColor - pentru fundal i DisabledItemForeColor - pentru text.
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 9 Sursa de date a listei:
311
Tipul sursei de date: RowSourceType - este de tip numeric i specific un cod prin care poate fi identificat tipul sursei de date. Sursa de date: RowSource - este de tip ir de caractere i furnizez sursa de date.
RowSourceType Articolele listei sunt furnizate: RowSource 0 - None n timpul execuiei listei folosind meto- Nu este precizat. dele AddItem sau AddListItem. 1 - Value Prin enumerare ntr-o list de valori. Lista de valori. Valorile sunt separate n list prin virgul. 2 - Alias Prin preluare din cmpurile unui tabel. Numele tabelului din baza de date sau a tabelului liber (.dbf). 3 - SQL Statement De o instruciune SQL Select de inte- Instruciunea SQL rogare a bazei de date, care va genera un tabel permanent sau temporar ce va conine articolele listei. 4 - Query De o interogare. Numele fiierului de interogri (.qpr) 5 - Array De un tablou de memorie (vector Numele tabloului de memorie. pentru lista cu o singur coloan sau matrice pentru lista cu multe coloane). 6 -Fields De cmpurile unui tabel, enumerate Lista de nume de cmpuri ( separa-te ntr-o list. n list prin virgul). Numele cmpului trebuie precedat de numele tabelului: <nume_tabel>.<nume_cmp> 7 - Files un grup de fiiere dintr-un director. ablonul care descrie grupul de fiiere. 8 - Structure numele cmpurilor unui tabel. Numele tabelului.
9 Variabila de memorie sau cmpul n care se memoreaz valoarea elementului selectat ControlSource . Dac este de tip numeric, se va memora poziia curent n list a articolului selectat, iar dac este de tip ir de caractere, se va memora textul asociat articolului selectat. 9 Data memorat n prorprietatea Value BoundTo . Este de tip logic: dac are valoarea .T., n proprietatea Value se va memora textul asociat articolului selectat, iar dac are valoarea .F., n proprietatea Value se va memora coninutul variabilei sau cmpului specificat de proprietatea ControlSource. 9 Tabloul de memorie care conine articolele listei este caracterizat de proprietile:
Numrul de articole din list: ListCount - este de tip numeric. Tabloul de memorie (de tip vector sau matrice, n funcie de numrul de coloane ale listei) se pstreaz n proprietile: List - articolele se pstreaz n ordinea poziiei lor curente (ordinea n care sunt afiate n list) i ListItem - articolele se pstreaz n ordinea dat de codurile de identificare. Ambele proprieti sunt de tip tablou de memorie. De exemplu, n lista cu numele Lista, Lista.List(5) identific al cincilea articol din list, iar Lista.ListItem(5) identific articolul din list care are codul de identificare 5. Dac lista conine mai multe coloane, trebuie precizat i numrul coloanei. De exemplu, dac lista Lista are 4 coloane, Lista.List(5,2) identific a doua coloan din cel de al cincilea articol din list. Proprietatea ListCount poate fi folosit pentru a parcurge elementele tabloului de la primul element pn la ultimul (ListCount).
312 Informatic
Identificatorul articolului selectat este furnizat de proprietile: ListIndex - care se folosete mpreun cu proprietatea List (dac are valoarea 0, nu este selectat un articol, iar dac are o valoare cuprins ntre 1 i ListCount reprezint poziia curent a articolului selectat) i ListItemID - care se folosete mpreun cu proprietatea ListItem (dac are valoarea -1, nu este selectat un articol, iar dac are o valoare pozitiv reprezint codul de identificare al articolului selectat). Ambele sunt de tip numeric. De exemplu, pentru a face referire la articolul selectat n lista Lista se poate folosi Lista.List(Lista.ListIndex), dar i Lista.ListItem(Lista.ListIItemID). Vectorul cu indeci asociat listei poate fi folosit de programator pentru a atribui intern coduri speciale articolelor listei. Fiecare element al vectorului conine un cod special asociat unui articol din list, diferit de codul de identificare. Dimensiunea vectorului este egal cu numrul de elemente, respectiv cu numrul de rnduri ale tabloului asociat listei. Vectorul este furnizat de proprietile: ItemData - vector n care identificarea articolului se face prin poziia n list i ItemIDData - vector n care identificarea articolului se face prin codul de identificare. De exemplu, n listaLista se obine codul special asociat articolului focalizat cu Lista.ItemData(Lista.ListIndex). Codul special asociat poate fi folosit pentru a identifica un articol din list: poziia n list a unui articol cu codul special asociat cu valoarea12345 se poate afla cu Lista.ItemIDData(12345). 9 Ordonarea articolelor n list este controlat cu urmtoarele proprieti: Autosortarea: Sorted - este de tip logic i controleaz modul n care sunt afiate articolele din list. Dac are valoarea .T., articolele din list sunt automat ordonate alfabetic, inndu-se cont de diferena dintre literele mari i mici. Dac are valoarea .F. (implicit), articolele din list sunt afiate n ordinea natural, ordinea n care au fost adugate la creare sau n care au fost preluate dintr-o surs de date. Proprietatea este disponibil numai pentru valorile 0 i 1 ale proprietii RowSourceType. Ordonarea manual: MoveBars - este de tip logic i controleaz dac articolele pot fi aranjate manual n list. Dac are valoarea .T., este afiat bara de mutare care permite executarea interactiv a operaiei de mutare a articolelor n list. Dac are valoarea .F. (implicit), bara nu este afiat. Pentru a muta un articol n list se poate folosi fie tastatura (se selecteaz articolul i apoi cu tastat Ctrl apsat se deplaseaz articolul n noua poziie cu tastele i ), fie mouse-ul (pe bara de mutare se gliseaz butonul din dreptul articolului pe care vrei s-l mutai n noua poziie). Proprietatea este specific numai controlului ListBox. 9 Cutarea asistat: IncrementalSearch - este de tip logic i controleaz dac se poate folosi metoda de cutare asistat pentru gsirea unui articol n list. Dac are valoarea .T., se folosete cutarea asistat, iar dac are valoarea .F., nu este activat aceast facilitate. Cutarea asistat nseamn c atunci cnd este apsat o tast, sistemul interpreteaz aceast tast ca fiind primul caracter al textului afiat de articolul cutat i deruleaz lista astfel nct s fie afiat n list primul articol care ndeplinete aceast condiie. Dac se mai apas o tast, aceasta este interpretat ca fiind al doilea caracter al textului afiat de articolul cutat i deruleaz lista astfel nct s fie afiat n list primul articol care afieaz un text care ncepe cu cele dou caractere .a.m.d. Este util s activai aceast facilitate dac lista are dimensiuni mari. 9 Primul articol vizibil din list: TopIndex - furnizeaz poziia curent a primului articol afiat n partea vizibil a listei i TopItemID - furnizeaz codul de identificare a
313
primului articol afiat n partea vizibil a listei. Aceste proprieti se pot folosi pentru a afla dac un articol se gsete n zona vizibil a listei sau pentru a schimba articolele afiate n partea vizibil a listei. 9 Ultimul articol adugat la list: NewIndex - furnizeaz poziia curent a ultimului articol adugat la list i NewItemID - furnizeaz codul de identificare a ultimului articol adugat la list. 9 Proprieti specifice listelor care au ca surs de date tablouri de memorie prin care se controleaz intervalul de elemente din tablou care sunt preluate n list (valabil numai pentru RowSourceType=5). Proprietile sunt de tip numeric i determin intervalul de elemente, respectiv de rnduri care vor fi folosite ca surs de date, altfel vor fi folosite toate elementele, respectiv toate rndurile din tabloul. Primul element: FirstElement - primul element, respectiv primul rnd al intervalului. Implicit are valoarea 1 (primul element, respectiv primul rnd al tabloului). Numrul de elemente: NumberOfElements - numrul de elemente, respectiv de rnduri preluate din sursa de date ncepnd cu primul element al intervalului. Implicit are valoarea corespunztoare numrului de elemente, respectiv de rnduri ale tabloului. 9 Proprieti specifice selectrii multiple: Selectarea multipl: MultipleSelect - este de tip numeric i controleaz dac este permis (valoarea 1) sau nu (valoarea 0 - implicit) selectarea mai multor articole n list. Evidena articolelor selectate este furnizat de proprietile Selected i SelectedID . Ambele proprieti sunt de tip vector cu elemente de tip logic i conin attea elemente cte articole sunt n list. Fiecare element din vector reprezint starea unui articol: dac are valoarea .T., articolul este selectat, iar dac are valoarea .F., articolul nu este selectat. Cei doi vectori se deosebesc dup modul n care se face identificarea articolelor: dup poziia curent, respectiv dup codul de identificare. De exemplu, dac vrei s aflai dac n lista Lista a fost selectat al treilea articol din list, aflai valoarea proprietii Lista.Selected(3), iar dac vrei s aflai dac articolul cu codul de identificare 10 a fost selectat, aflai valoarea proprietii Lista.SelectedID(10). Aceste proprieti pot fi folosite pentru a selecta un articol sau pentru a anula selectarea unui articol din program. De exemplu, dac vrei s selectai al treilea articol n lista Lista, atribuii valoarea corespunztoare proprietii: Lista.Selected(3)=.T., iar dac vrei s anulai selectarea pentru articolul cu codul de identificare 10, atribuii valoarea corespunztoare proprietii: Lista.SelectedID(10)=.F.. 9 Proprieti specifice listelor cu mai multe coloane: Numrul de coloane: ColumnCount - este de tip numeric; dac are valoarea 0, nu se afieaz coloane. Limea coloanelor: ColumnWidth - este de o list de numere, separate prin virgul; fiecare numr reprezint limea unei coloane. De exemplu, n lista Lista Lista.ColumnCount=3 i Lista.ColumnWidth='5,7,9' Afiarea liniilor separatoare ntre coloane: ColumnLines - este de tip logic (dac are valoarea .T. - implicit - ntre coloane vor fi afiate linii separatoare, altfel liniile de separare sunt invizibile).
314 Informatic
Coloana preluat de proprietatea Value a controlului: BoundColumn - este de tip numeric i reprezint numrul coloanei al crui text va fi preluat de proprietatea Value. Implicit se preia textul din prima coloan. Textul din prima coloan este preluat de proprietatea DisplayValue - este de tip ir de caratere. Proprietatea este util atunci cnd n proprietatea Value este preluat textul articolului dintr-o alt coloan. Metodele specifice listei sunt: 9 Adugarea unui articol la list: AddItem i AddItemList . Metodelor trebuie s li se comunice textul afiat de articol (<text>), poziia n care va fi adugat (<n>) pentru AddItem, respectiv codul de identificare atribuit pentru AddItemList i numrul coloanei (<n>) n cazul unor liste cu coloane: AddItem('<text>'[,<n>[,<c>]])). Dac poziia precizat este valid, articolul va fi inserat n poziia precizat. Dac nu este precizat poziia, articolul va fi inserat n poziia corespunztoare dac lista este sortat, iar dac nu este sortat, va fi adugat la sfritul listei. Dac lista are mai multe coloane i nu se precizeaz coloana, se va considera coloana 1. Aceste metode se pot folosi numai pentru listele a cror surs de date nu este precizat (RowSourceType=0). 9 nlturarea unui articol din list: RemoveItem i RemoveItemList . Metodelor trebuie s li se comunice indexul articolului nlturat , respectiv codul de identificare al articolului. De exemplu, apelul metodei RemoveItem(5) nltur din list articolul din poziia a cincea. 9 tergerea coninutului unei liste: Clear . 9 Remprosptarea listei: Requery . Acest metod trebuie s fie apelat dup orice modificare a sursei de date. Prin aceast metod este recitit sursa de date a listei. Metoda este similar metodei Refresh.
Creai o list ascuns folosind valorile ca surs de date n exemplul de formular creat la lecia despre butoane radio, vei nlocui controlul folosit pentru alegerea formei afiate cu o list ascuns (obiectul ComboBox cu stilul 2). Sursa de date (numele celor trei forme) va fi precizat printr-o list de valori. Deoarece formularul pe care trebuie s-l realizai este foarte asemntor cu cel prezentat la acea lecie, l vei salva pe acela sub un alt nume, vei terge obiectul grup de butoane radio i n locul lui vei crea un control de tip list folosind instrumentul ComboBox de pe bara Form Controls.
Stabilii proprietile listei: Name = "Combo1" RowSourceType = 1 RowSource = "Cerc ,Elipsa ,Patrat " Style = 2 Scriei procedurile asociate elementului Init al formularului i evenimentului Click al listei (pstrai procedura asociat evenimentului Click al butonului de comand):
315
procedure Init && Formular ThisForm.Combo1.ListIndex = 1 ThisForm.Shape1.Visible=.T. ThisForm.Shape2.Visible=.F. ThisForm.Shape3.Visible=.F. endproc procedure Click && Lista ThisForm.Shape1.Visible = .F. ThisForm.Shape2.Visible = .F. ThisForm.Shape3.Visible = .F. do case case ThisForm.Combo1.Value = ThisForm.Combo1.List(1) ThisForm.Shape1.Visible = .T. case ThisForm.Combo1.Value = ThisForm.Combo1.List(2) ThisForm.Shape2.Visible = .T. case ThisForm.Combo1.Value = ThisForm.Combo1.List(3) ThisForm.Shape3.Visible = .T. endcase ThisForm.CurrentX=20 ThisForm.CurrentY=155 ThisForm.Print(ThisForm.Combo1.List(ThisForm.Combo1.ListIndex)) endproc Salvai formularul, l lansai n execuie i-l testai.
Creai o list ascuns folosind ca surs de date tabloul de memorie n exemplul de formular creat la lecia despre comutator, vei nlocui controlul comutator folosit pentru a controla afiarea ptratului cu o list ascuns din care vei alege culoarea de umplere a ptratului (obiectul ComboBox cu stilul 2). Lista va conine 8 culori i sursa de date (numele celor 8 culori) va fi precizat printr-un vector. Salvai formularul realizat anterior sub un alt nume, tergei obiectul comutator i n locul lui creai un control de tip list folosind instrumentul ComboBox de pe bara Form Controls. Vei mai aduga i un control de tip etichet pentru legenda listei.
Stabilii proprietile listei i ale etichetei: Name = "Label1" ControlSource = "" AutoSize = .T. Height = 25 BackStyle = 0 Left = 24 Caption = "Culoarea" NumberOfElements = 8 Name = "Combo1" Style = 2 RowSourceType = 5 Top = 48 RowSource = "a" Width = 121 Scriei procedurile asociate evenimentelor Load i Init ale formularului n care declarai i creai vectorul a: procedure Load && Formular public a dimension a(8) endproc procedure Init && Formular a(1)='Negru' a(2)='Rosu'
316 Informatic
a(3)='Verde' a(4)='Galben' a(5)='Albastru' a(6)='Magenta' a(7)='Cian' a(8)='Alb' ThisForm.Combo1.ListIndex = 8 ThisForm.Shape1.BackColor=rgb(255,255,255) ThisForm.Shape1.Visible=.T. endproc Formularului i vom aduga o metod pentru calculul codului de culoare corespunztor culorii din list. Metoda se numete Culoarea i folosete o matrice b cu 8 linii i 3 coloane pentru a calcula ponderea celor trei culori de baz: coloana 1 - ponderea pentru rou, coloana 2 - ponderea pentru verde i coloana 3 ponderea pentru albastru care corespund parametrilor funciei Rgb(). De exemplu, culoarea galben este determinat de valorile din cea de a patra linie a matricei i, deoarece codul ei este dat de funcia Rgb(255,255,0), conform tabelului prezentat anterior, elementele de pe linia a patra vor avea valoarea: b(4,1)=1, b(4,2)=1 i b(4,3)=0. Pentru constru-irea acestei metode folosii opiunea de meniu New Method... Form. n caseta de dialog scriei numele metodei Culoarea. Numele metodei va fi adugat la lista de metode a formularului. Alegei din lista afiat n seciunea Method a ferestrei de proprieti a formularului opiunea Culoarea. Se va deschide fereastra pentru cod. Scriei procedura asociat metodei: procedure culoarea && Formular b(i,j)=k%2 parameters n k=int(k/2) dimension b(8,3) enddo store 0 to b endfor for i=1 to 8 cod=rgb(b(n,1)*255,b(n,2)*255,; k=i-1 b(n,3)*255) j=0 return cod do while k <>0 endproc j=j+1 Scriei procedura asociat evenimentului Click al listei: procedure Click && Lista ThisForm.Shape1.BackColor =; ThisForm.Culoarea(ThisForm.Combo1.ListIndex) endproc
Creai o list cu mai multe coloane Lista va avea dou coloane corespunztoare cmpurilor nume i prenume din tabelul agenda. La alegerea unui articol din list, n formular se va afia numrul de telefon (se alege ca obiect eticheta) i a-dresa persoanei (se alege ca obiect zona de editare). Creai un fiier index (dup cmpurile nume i prenume pentru tabelul agenda.
Creai un formular nou. Adugai n formular patru etichete, o zon de edita-re, un buton declanator i o list (butonul ListBox de pe bara Form Controls). Stabilii proprietile formularului i ale obiectelor din formular:
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor * formularul Name = "Form1" BackColor = 200,200,200 Caption = "Test" Closable = .F. FontSize = 14 * eticheta folosita pentru * legenda listei Name = "Label1" Caption = "Alegeti:" * etichete folosite pentru * informare Name = "Label2" Caption = "Telefon" Name = "Label4" Caption = "Adresa" * eticheta folosita pentru afi* sarea numarului de telefon Name = "Label3" Caption = "" * pentru toate etichetele: AutoSize = .T. BackStyle = 0 * zona de editare Name = "Edit1" BackStyle = 0 Enabled = .T. ReadOnly = .T. * buton de comanda Name = "Command1" Cancel = .T. Caption = "\<Terminare" * Lista Name = "List1" BoundColumn = 2 ColumnCount = 2 ColumnWidths = "70,70" RowSourceType = 2 RowSource = "agenda" ColumnLines = .F. Height = 97 Left = 24 Top = 60 Width = 170
317
Scriei procedurile asociate evenimentelor Load, Init i Unload ale formularului n care deschidei i nchidei tabelul, evnimentului Click al butonului de comand i procedura Click a listei: procedure Load && Formular use agenda index agenda endproc procedure Init && Formular goto top ThisForm.List1.ListIndex = 1 locate for agenda.nume=ThisForm.List1.DisplayValue and; agenda.prenume=ThisForm.List1.Value ThisForm.Label3.Caption=agenda.telefon ThisForm.Edit1.Value=agenda.adresa endproc
318 Informatic
procedure Unload && Formular use endproc procedure Click && Buton ThisForm.Release endproc procedure Click &&Lista goto top locate for agenda.nume=ThisForm.List1.DisplayValue and; agenda.prenume=ThisForm.List1.Value ThisForm.Label3.Caption=agenda.telefon ThisForm.Edit1.Value=agenda.adresa endproc Salvai formularul, l lansai n execuie i-l testai.
Creai o list dinamic cu selecie multipl Creai un formular care conine dou liste. ntr-o list vor fi afiate fiierele de tip program din directorul curent (*.prg). Din aceast list vei selecta un grup de fiiere care vor fi adugate la cea de a doua list. Cea de a doua list este o list dinamic (se creeaz dinamic n timpul execuiei formularului). Pentru lucrul cu cele dou liste vor fi folosite dou butoane: unul pentru adugare la cea de a doua list a fiierelor selectate n prima list i unul pentru anularea selectrii unor fiiere din a doua list. Ambele liste permit selecie multipl. Dup ce ai selectat grupul de fiiere, acionai cel de al treilea buton, butonul de terminare care va declana operaia de copiere a fiierelor n directorul Test din rdcina discului C.
Creai directorul Test. Creai un formular nou. Adugai n formular dou liste, dou etichete (pentru legenda celor dou liste) i trei butoane de comand. Prima list va avea ca surs de date fiierele de tip *.prg. A doua list nu va avea surs de date. Stabilii prorpietile pentru formular i obiectele din formular: * Formularul Name = "Form1" Caption = "Test" Closable = .F. FontSize = 14 WindowType = 1 BackColor * Etichetele Name = "Label1" Caption = "Fisiere pentru ; selectare" Name = "Label2" Caption = "Fisiere selectate" * Toate tichetele: AutoSize = .T. BackStyle = 0
319
* Listele MultiSelect = .T. Name = "List1" * Butoanele BoundColumn = 1 Name = "Command1" RowSourceType = 7 Cancel = .T. RowSource = "*.prg" Caption = "\<Terminare" MultiSelect = .T. Name = "Command2" Name = "List2" Caption = "\<Selecteaza>>>" BoundColumn = 1 Name = "Command3" RowSourceType = 0 Caption="<<<\<Anuleaza selectare" RowSource = "" Scriei procedurile asociate evenimentelor Click ale celor trei butoane: procedure Click && Buton1 for i=1 to ThisForm.List2.Listcount numef=ThisForm.List2.List(i) copy file &numef to c:\test endfor ThisForm.Release endproc procedure Click && Buton2 for i=1 to ThisForm.List1.Listcount if ThisForm.List1.Selected(i) ThisForm.List2.AddItem(ThisForm.List1.List(i)) endif endfor ThisForm.List1.Requery ThisForm.List2.Requery endproc procedure Click && Buton3 for i=1 to ThisForm.List2.Listcount if ThisForm.List2.Selected(i) ThisForm.List2.RemoveItem(i) endif endfor ThisForm.List1.Requery ThisForm.List2.Requery endproc Salvai formularul, l lansai n execuie i-l testai.
320 Informatic
2. Creai un tabel pentru reeta unui preparat gastronomic cu urmtoarea structur: ingredient, unitate de msur, cantitate. Creai un tabel cu un singur cmp n care memorai ingredintele care pot fi folosite pentru prepararea lui. Creai un formular pentru introducerea datelor n tabel, care va conine o list pentru selectarea ingredientelor, un grup de butoane radio pentru alegerea unitii de msur, o caset de text pentru comunicarea cantitii i un buton pentru terminare. 3. Din tabelul cu elevii clasei nscrii la diferite echipe, creai un formular prin care s extragei numai elevii care fac parte din echipa de baschet. Formularul va conine o list cu dou coloane cu elevii din clas i va permite crearea unei liste dinamice cu elevii din echipa de baschet, prin selectarea lor din lista surs.
ncercai:
Adevrat/Fals: 1. Cu metoda SetAll putei selecta toate articolele dintr-o list. 2. Identificarea unui articol selectat n list se face cu proprietatea ListIndex. 3. Proprietatea Value a unui comutator memoreaz starea comutatorului. 4. Proprietatea Value a unui comutator poate fi de tip numeric. 5. Grupul de butoane radio are proprietatea AutoSize. Completai: 1. Pentru a atribui aceeai valoare unei proprieti pentru toate butoanele dintr-un grup de butoane radio folosii metoda ............... 2. Creai o list ascuns cu controlul ............... cu valorea .... a proprietii Style. 3. Remprosptarea listei se face cu metoda ........................ 4. IncrementalSearch este o proprietate specific unui control de tip .............. 5. Numrul de articole din list se pstreaz n proprietatea .................... Alegei rspunsurile corecte: 1. Tabloul de memorie n care se pstreaz articolele listei n ordinea poziiei lor curente se memoreaz n proprietatea: a) List b) ListItem c) ListIndex 2. FirstElement este o proprietate a listei care folosete ca surs de date: a) lista cu nume de cmpuri b) tabloul de memorie c) lista de valori 3. Articolele selectate dintr-o list cu selecie multipl se pstreaz ntr-un vector n proprietatea: a) MultipleSelect b) Selected c) ListItemID spunsuri: R Adevrat/Fals: 1-F; 2-A; 3-A; 4-A; 5-A.
Completai: 1-SetAll; 2-ComboBox,1; 3-Requery; 4-list; 5- ListCount; 6- Column; 7-Header; 8Bound. Alegei rspunsurile corecte: 1-a; 2-b; 3- b.
321
322 Informatic
tatatea logic AutoSize pentru a determina dac se redimensioneaz automat cadrul containerului atunci cnd se adaug obiecte noi. Pe lng metodele specifice unui formular (Refresh, Show, Move, Hide etc.), obiectul ToolBox are urmtoarele metode specifice : 9 Ancorarea barei: Dock ancoreaz bara la una dintre marginile ferestrei. Apelul metodei se face prin Dock([<poziie>[,<x>,<y>]]), unde parametrul reprezint marginea ferestrei de care va fi ancorat i poate lua aceleai valori ca i proprietatea DockPosition, iar <x> i <y> reprezint coordonatele poziiei barei ancorate. 9 Transformarea barei fixe n bar mobil cu metoda Move . Dac apelai aceast metod atunci cnd bara este ancorat, ea va deveni mobil. Pe lng evenimentele specifice unui formular, obiectul ToolBox rspunde la urmtoarele evenimente specifice : 9 Dup ancorarea barei: AfterDock este declanat dup ce a fost ancorat bara. 9 nainte de ancorarea barei: BeforeDock este declanat fie interactiv, prin glisarea barei de ctre utilizator pentru a fi ancorat, fie din program prin apelarea metodei Dock. Procedura asociat acestui eveniment primete parametrul nLocation care reprezint poziia n care va fi ancorat bara (aceleai valori ca i proprietatea DockPosition). nainte ca bara s fie redesenat n poziia de ancorare, n procedura asociat acestui eveniment se pot scrie instruciuni prin care s fie modificat aspectul barei (de exemplu, s se nlocuiasc un control cu un alt control). 9 Anularea ancorrii barei: Undock este declanat fie interactiv, prin glisarea barei de ctre utilizator din poziia n care a fost ancorat, fie din program prin apelarea metodei Move.
Bara cu instrumente va conine trei controale Atunci cnd sunt activate, determin scrierea pe ecran cu caractere cu stilul respectiv. pentru stabilirea stilului n care va fi scris Atunci cnd un buton este activat, textul textul pe ecran: ngroat (butonul Italic), legendei sale este scris cu acel stil. nclinat i subliniat (butonul Underline). Aceste butoane au efect de comutator. Executnd clic pe ele, proprietatea care corespunde stilului este negat (este o proprietate logic). De exemplu, dac se execut clic pe butonul Bold se va executa instruciunea screen.fontbold=!_screen.fontbol, adic proprietii FontBold a ecranului i se va atribui valoarea invers (este folosit opera-torul pentru negare !). Toate Toate Scriei n fiierul test_bara1 programul comutatoarele comutatoarele surs: sunt activate sunt dezactivate public ecran ecran=createobj('bara')
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor ecran.show define class bara as toolbar add object b1 as commandbutton add object s1 as separator add object b2 as commandbutton add object s2 as separator add object b3 as commandbutton b1.height = 20 b1.width = 50 b1.caption = "Bold" b2.height = 20 b2.width = 50 b2.caption = "Italic" b2.fontbold = .f. b2.fontitalic = .t. b3.height = 20 b3.width = 50 b3.caption = "subliniat" b3.fontbold = .f. b3.fontunderline = .t. left=1 top=1 width=25 caption="afisare ecran" procedure activate This.b1.FontBold=_screen.FontBold This.b2.FontItalic=_screen.FontItalic This.b3.FontUnderline=_screen.FontUnderline endproc procedure b1.click _ screen.FontBold =!_screen.FontBold This.FontBold =_screen.FontBold endproc procedure b2.click _ screen.FontItalic=!_screen.FontItalic This.FontItalic=_screen.FontItalic endproc procedure b3.click _ screen.FontUnderline=!_screen.FontUnderline This.FontUnderline=_screen.FontUnderline endproc enddefine Lansai n execuie programul cu comanda do test_bara1.
323
Testai bara de instrumente. Activai unul dintre stiluri sau mai multe stiluri. Afiai pe ecran un text de fiecare dat (de exemplu, comanda ? 'AAAA'). Urmrii efectul obinut. Deplasai bara cu instrumente n interiorul ferestrei Visual FoxPro. Ancorai bara n diferite poziii. nchidei bara executnd clic pe butonul de nchidere.
324 Informatic
Creai o bar de instrumente care acioneaz asupra unui formular Bara cu instrumente va conine aceleai trei controale pentru stabilirea stilului n care va fi scris textul pe ecran: ngroat (butonul Bold), nclinat (butonul Italic) i subliniat (butonul Underline). Aceste butoane au efect de comutator. Se va crea un set de formulare care va cuprinde un formular pentru fereastr i o bar cu instrumente. Butonul Test al formularului va testa stilul ales prin scrierea unui text n formular. Att butoanele din bara cu instrumente, ct i butoanele din formular vor afia informaii despre instrument (ToolTips). Scriei n fiierul test_bara2 programul surs: set=createobj('formset') set.addobject("bara1","bara") set.addobject("f1","form") set.f1.addobject("bt1","buton1") set.f1.addobject("bt2","buton2") set.f1.top=8 set.f1.left=44 set.f1.height=250 set.f1.width=400 set.f1.backcolor=rgb(190,190,190) set.f1.borderstyle=1 set.f1.caption="test" set.f1.showtips=.T. set.f1.closable=.F. set.f1.bt1.visible=.t. set.f1.bt2.visible=.t. set.f1.show set.bara1.show read events define class buton1 as commandbutton top = 200 left = 50 height = 25 width = 100 caption = "T\<est" ToolTipText = "Test scriere" procedure click ThisForm.print('test ') endproc enddefine define class buton2 as commandbutton top = 200 left = 250 height = 25 width = 100 ToolTipText = "Termina aplicatia" caption = "\<Terminare" procedure click ThisFormSet.Release clear events endproc
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor enddefine define class bara as toolbar add object b1 as commandbutton add object s1 as separator add object b2 as commandbutton add object s2 as separator add object b3 as commandbutton left = 1 top = 1 width = 25 showtips = .T. caption = "Afisare ecran" b1.height = 20 b1.width = 50 b1.ToolTipText="Ingrosat" b1.caption = "Bold" b2.height = 20 b2.width = 50 b2.ToolTipText="Aplecat" b2.caption = "Italic" b2.fontbold = .f. b3.height = 20 b3.width = 50 b3.ToolTipText="Subliniat" b3.caption = "Underline" b3.fontbold = .f. procedure activate This.b1.FontBold = ThisFormSet.f1.FontBold This.b2.FontItalic = ThisFormSet.f1.FontItalic This.b3.FontUnderline = ThisFormSet.f1.FontUnderline endproc procedure b1.click ThisFormSet.f1.FontBold = !ThisFormSet.f1.FontBold This.FontBold =ThisFormSet.f1.FontBold endproc procedure b2.click ThisFormSet.f1.FontItalic = !ThisFormSet.f1.FontItalic This.FontItalic = ThisFormSet.f1.FontItalic endproc procedure b3.click ThisFormSet.f1.FontUnderline = !ThisFormSet.f1.FontUnderline This.FontUnderline =ThisFormSet.f1.FontUnderline endproc enddefine Lansai n execuie programul cu comanda do test_bara2.
325
Testai bara de instrumente. Activai unul dintre stiluri sau mai multe stiluri i executai clic pe butonul Test din fereastr. Observai informaiile afiate pentru fiecare instrument selectat. nchidei setul de formulare executnd clic pe butonul Terminare.
326 Informatic
Modificai formularul creat anterior Adugai fomularului creat anterior un buton care s controleze afiarea barei cu instrumente:
Salvai fiierul cu programul surs test_bara2 sub numele test_bara3. Deschidei acest fiier i facei urmtoarele modificri. Adugai n program, nainte de definirea claselor, instruciunile: set.f1.addobject("bt3","buton3") set.f1.bt3.visible=.t. n seciunea Define class buton1 modificai: left=25 width=75 n seciunea Define class buton2 nlocuii buton 2 cu i buton 3 modificai: left=300 width=75 Adugai seciunea de program pentru definirea clasei Buton2: define class Buton2 as CommandButton Top = 200 Left = 150 Height = 25 Width = 75 ToolTipText='Afiseaza/anuleaza bara cu instrumente' Caption = "\<Bara" procedure Click ThisFormSet.Bara1.Visible=!ThisFormSet.Bara1.Visible endproc enddefine Lansai n execuie programul cu comanda do test_bara3.
Creai vizual o bar de instrumente Se va crea bara de la primul exemplu. Deoarece bara cu obiecte a constructorului de formulare nu are un buton asociat obiectului ToolBar, trebuie fcut un mic artificiu: se construiete un formular vid care se transform apoi ntr-o bar cu instrumente.
Deschidei fereastra constructorului de formulare cu comanda create form bara. Salvai i nchidei fereastra constructorului. Deschidei tabelul asociat formularului cu comanda use bara.scx. Afiai coninutul tabelului cu comnada browse.
n rndul 2 al tabelului sunt nregistrate caracteristicile obiectului DataEnvironment asociat formularului, iar n rndul 3 caracteristicile formularului Form1. n rndul 3 al tabelului vei face urmtoarele modificri n cmpurile memo:
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor 9 n cmpurile Class i BaseClass tergei Form i scriei ToolBar. 9 n cmpul Objname tergei Form1 i scriei Bara. 9 n cmpul Properties tergei tot coninutul. nchidei fereastra de editare i apoi i fiierul cu comanda use. Deschidei formularul cu comanda Modify Form bara.
327
n fereastra constructorului de formulare Form Design este afiat obiectul ToolBar. Adugai acestui obiect trei comutatoare. Spre deosebire de formular, ntr-o bar cu instrumente, poziiile obiectelor sunt stabilite automat. Ele vor fi plasate unele lng altele. Nu putei stabili dect ordinea n care apar butoanele n bar, nu i poziia exact a fiecrui buton. Pentru a aduga un control, procedai astfel: executai clic pe obiectul corespunztor de pe bara cu obiecte de interfa pentru a-l selecta (n exemplu, pe obiectul Command Button) i apoi n bara pe care o construii executai clic n poziia n care vrei s fie inserat obiectul. ntre butoane inserai separatori (obiectul Separator de pe bara cu obiecte). Stabilii pentru aceste controale valorile pentru restul pro-prietilor. Scriei procedurile corespunztoare evenimentelor. Salvai modificrile fcute n formular. nchidei constructorul de formulare. Deschidei din nou tabelul asociat formularului. Observai modificrile care au fost fcute. nchidei fereastra de editare i tabelul. Lansai n execuie formularul cu comanda do form bara. Reluai toate aceste operaii i creai vizual formularul i o bar de instrumente ca cele din cel de al doilea exemplu. Reluai toate aceste operaii i creai vizual formularul i o bar de instrumente ca cele din cel de al treilea exemplu.
Obiecte de tip OLE: container OLE OLE Containerx i control OLE OLE Bound Controlx
Prin intermediul tehnologiei OLE putei introduce ntr-un formular obiecte create cu alte aplicaii (documente, foi de calcul imagini). Aplicaiile cu care sunt create obiectele se numesc aplicaii server (de exemplu, o aplicaie Microsoft: Word, Excel, Paint etc.). Pentru adugarea obiectelor OLE ntr-un formular, aplicaia Visual FoxPro v pune la dispoziie dou obiecte vizuale: 9 obiecte OLE de tip container - OLEContainerx. 9 obiecte OLE asociate cmpurilor de tip General din tabel - OLEBoundControlx care permit afiarea i editarea unui obiect n acest tip de cmp. Recomandare: Dac dorii s editai un cmp de tip General ntr-un formular, folosii un obiect de tip OLEBoundControl. Dac dorii s vizualizai i eventual s editai ntr-un formular un obiect care nu este memorat ntr-un cmp, folosii un obiect de tip OLEContainer.
328 Inormatic
Containerul OLE permite afiarea i editarea obiectelor OLE ntr-o aplicaie Visual FoxPro. Obiectul vizual OLEContainer din Visual FoxPro este un container pentru obiectul creat cu o alt aplicaie. Aceste obiecte pot fi: 9 Controale OLE (fiiere .ocx). Au propriul lor set de proprieti, metode i evenimente. 9 Obiecte OLE inserabile. Nu au propriul lor set de proprieti, metode i evenimente (nu pot rspunde la evenimente). Containerul OLE care nu are proprietile ControlSource i Value. n scimb, obiectul vizual OLEBoundControl are aceste proprieti. Proprietatea ControlSource memoreaz numele cmpului n care se pstreaz obiectul.
Proprietile specifice obiectelor vizuale Valoare Efect Autoactivate OLE Container i OLEBoundControl sunt: 0 Activat din program cu (Manual) metoda DoVerb. 9 Autoactivarea: Autoactivate este de tip 1 Activat atunci cnd obiectul numeric i determin modul n care poate fi (GotFocust) primete focalizarea. activat obiectul. A activa obiectul nseamn a 2 Activat atunci cnd se exeactiva aplicaia server care l-a creat. Dac are (DoubleClick) cut dublu clic pe obiect sau valoarea 2 (valoarea implicit), nu mai putei cnd obiectul este foca-lizat folosi evenimentul DoubleClick. i se apas tasta Enter. 9 Tipul de obiect permis OLETypeAlowed . 3 (Automatic) Activat de evenimentul impliEste de tip numeric i controleaz tipul de cit de activare al obiectului (de exemplu focalizarea obiect care poate fi adugat la cotainer. formularului). 9 Modul n care se execut redimensionarea Stretch . Este de tip numeric i controleaz modul n care este redimensionat obiectul pentru a ncpea n zona alocat lui n cadrul formularului. Valoarea implicit este 0.
Valoare Efect OLETypeAlowed 0 Linked - legat. 1 Embedded - ncapsulat. -1 OLE Bound - nu conine un obiect OLE. -2 OLE control - control OLE (.ocx) Valoare Efect Stretch 0 Clip - Este secionat ca s ncap. 1 Isometric - Este redimensionat ca s ncap, cu pstrarea proporiilor. 2 Stretch - Este redimensionat ca s ncap, fr pstrarea proporiilor.
9 Accesul la obiect Object . Este o referin ctre un obiect OLE care permite accesul la proprietile i metodele sale. Proprietile i metodele specifice unui anumit obiect OLE le putei afla din documentaia aplicaiei server. De exemplu, dac obiectul OLE este o foaie de calcul (un obiect Excel), informaiile despre proprietile i metodele lui le putei afla din documentaia aplicaiei Microsoft Excel. Folosii aceast proprietate astfel: pentru modificarea valorii unei proprieti:
Verb Efectul metodei DoVerb 0 Este aciunea implicit a obiectului. -1 Obiectul va fi activat pentru editare mpreun cu containerul OLE. -2 Deschide fereastra aplicaiei server n care se ncarc obiectul pentru editare. -3 Ascunde aplicaia care a creat obiectul (pentru obiectele ncapsulate). -4 Obiectul este activat n container pentru editare i sunt afiate instrumentele specifice aplicaiei server. -5 La focalizarea obiectului se creeaz o fereastr pentru editarea obiectului. -6 Obiectul este activat pentru editare dar sunt ignorate toate modificrile pe care aplicaia server le poate anula.
329
<nume_obiect>.Object.<nume_proprietate>=<valoare> iar pentru apelarea unei metode: <nume_obiect>.Object.<nume_metod>[(<list-parametri>)] 9 Aplicaia server cu care a fost creat obiectul: OLEClass (numele aplicaiei). 9 Identificatorul fiierului care conine obiectul (unitatea de disc, calea de director, numele i extensia): DocumentFile . 9 Redimensionarea zonei alocate obiectului OLE: Sizable . Are aceeai semnificaie ca i la obiectul ToolBar. Dac are valoarea .T. se poate folosi pro-prietatea AutoSize pentru a se redimensiona automat zona alo-cat obiectului. Metoda specific unui obiect OLE este DoVerb i are ca efect activarea obiectului i stabilirea ope-raiilor care se pot executa cu obiectul respectiv. Obiectul poate fi activat prin acionarea standard a obiectului sau prin alte aciuni (verbe). Metoda poate fi apelat prin: DoVerb[(<verb>)]
Inserai un obiect OLE ntr-un formular Vei insera o foaie de calcul creat cu aplicaia Excel. Creai un dosar Test n rdcina discului C. Creai n acest dosar o foaie de calcul cu aplicaia Excel pentru cheltuielile casnice din primul trimestru al anului. Atribuii formule de calcul (sum) pentru celulele care memoreaz totalul pe tip de cheltuial (pe orizontal) i totalul chltuielilor pe lun (pe vertical). Realizai o diagram cu repartiia cheltuielilor n luna ianuarie.
Scriei n fiierul obiect1 programul surs: f1 = createobject('Form') f1.height = 350 f1.width = 500 f1.closable = .f. f1.caption="Cheltuieli" f1.addobject('b1','buton1') f1.addobject('o1','obiectexcel') f1.b1.visible=.t. f1.o1.visible=.t. f1.o1.height = 275 f1.o1.width = 475 f1.show f1.o1.doverb(-1) && -1; pentru editare read events define class obiectexcel as olecontrol oleclass ='excel.sheet' && numele aplicatiei server documentfile = "c:\test\cheltuieli.xls" enddefine define class buton1 as commandbutton caption = '\<Terminare' cancel = .t.
330 Inormatic
left = 250 top = 310 height = 25 procedure click clear events thisform.release enddefine Lansai n execuie programul cu comanda do obiect1.
Obiectul a fost deschis pentru editare. Modificai valoarea cmpurilor. Observai c valorile din cmpurile pentru care s-a aplicat formula de calcul pentru sum (sum) sunt modificate automat pentru a reflecta corect sitiuaia din foaia de calcul. Dac ai fcut modificrile n coloana corespunztoare lunii ianuarie, observai c s-a modificat automat i diagrama. nchidei formularul. Lansai n execuie programul cu comanda do test_bara1.
Creai vizual obiectul inserat n formular Creai formularul din exemplul anterior folosind metoda vizual:
Din grupul de butoane radio al casetei de dialog Insert Object mai putei s activai butonul Create New, dac vrei s creai un obiect nou (din lista Object Type alegei aplicaia server pe care o vei folosi pentru crearea obiectului i se va deschide fereastra aplicaiei pentru a crea obiectul) sau butonul Insert Control dac vrei s inserai un control OLE (se deschide caseta de dialog Browse din care putei alege fiierul .ocx).
Deschidei fereastra constructorului de formulare cu comanda create form obiect1. Stabilii pentru formular proprietile din program. Selectai din bara cu obiecte a constructorului obiectul OLEContainer. n zona formularului delimitai zona ocupat de obiect prin glisarea mouse-ului. Se deschide caseta de dialog InsertObject
331
prin intermediul creia stabilii obiectul care va fi adugat n formular. Din grupul de butoane radio activai butonul Create From File. Acionai butonul Browse pentru a construi identificatorul fiierului care conine obiectul: discul C, dosarul Test i fiierul Cheltuieli.xls. nchidei caseta de dialog (clic pe butonul OK). n caseta de proprieti modificai proprietile controlului OLEControl pentru a corespunde cu cele din program. Observai care sunt proprietile, metodele i evenimentele acestui tip de control. Adugai la formular butonul pentru terminare. Stabilii proprietile controlului (cele din program) i codul evenimentului Click. Salvai formularul i nchidei aplicaia Constructorului de formulare. Lansai n execuie formularul cu comanda do form obiect1.
Creai vizual obiectul inserat ntr-un cmp de tip General Creai un tabel Sigle care conine cmpurile nume (C,15), prenume (C,15) i sigla (G). Cmpul Sigla va conine fieiere .bmp n care sunt memorate sigle pentru iniialele persoanelor nregistrate n tabel. Creai aceste fiiere cu aplicaia Windows Paint. Adugai date n tabel cu ajutorul ferestrei Browse. Atunci cnd vrei s adugai date n cmpul de tip General, executai clic pe cmp. Se deschide o fereastr de editare a cmpului n care vei insera obiectul cu opiunea Insert Object... Edit. Se deschide caseta de dialog Insert Object. Dac alegei butonul Create New, vei alege din lista Liste Object Type articolul Bitmap Image dup care se va deschide o zon de editare a obiectului i se vor afia instrumentele aplicaiei Paint cu care putei crea obiectul. Dac alegei butonul Create from File, se va deschide o caset de editare n care va trebui s scriei identificatorul fiierului care conine imaginea sau vei construi acest identificator cu ajutorul ferestrei Browse. Dup ce ai completat cu date cmpurile din tabel, nchidei tabelul. Creai un formular pentru acest tabel. Formularul va conine butoanele >>> i <<< pentru parcurgerea nregistrrilor din tabel.
Deschidei fereastra constructorului de formulare cu comanda create form obiect2. Adugai n fereastr urmtoarele obiecte: trei etichete cu legenda Nume, Prenume i Sigla, dou casete de text pentru cmpurile din tabel, sigle.nume (ControlSource= sigle.nume) i sigle.prenume (ControlSource= sigle.prenume), trei comutatoare cu legenda \<>>>, \<<<< i \<Terminare. Fereastra va avea legenda Sigle, culoarea fundalului gri i butonul de nchidere nu va fi disponibil. Etichetele trebuie s fie afiate transparent. Completai procedurile asociate evenimentului click al butoanelor >>> i <<<: procedure click && butonul >>> skip if not eof() endif
332 Inormatic
thisform.refresh skip -1 endproc endif procedure click && butonul <<< thisform.refresh if not bof() endproc Adugai la formular un obiect de tip OLEBoundControl: executai clic pe obiectul din bara de obiecte a constructorului. Stabilii proprietile controlului (ControlSource= sigle.sigla). Salvai formularul. Lansai n execuie formularul cu comanda do form obiect2. Testai formularul.
Linea
Shapea
Imaginea (image) poate fi folosit la crearea butoanelor cu pictograme n locul butoanelor cu legend, care pot fi folosite ca butoane declanatoare. Se recomand folosirea lor n cazul barelor cu instrumente. Imaginea grafic are o proprietate specific Picture (imaginea) care memoreaz sursa imaginii. Aceasta poate fi: un fiier bitmap .bmp, un fiier de imagini .ico sau un cmp din tabel de tip general. Formele i liniile (shape sau line) sunt folosite pentru a se desena elemente grafice pe suprafaa formularelor. Chiar dac au asociate evenimente (declanate de aciuni ale mouse-ului), au n general numai un rol decorativ, de grupare sau de evideniere. Ceasul Timer este un obiect nevizual care poate fi folosit n interfaa unei aplicaii pentru a msura timpul. Este un mecanism implementat n interfa care permite programatorului s declaneze un anumit proces dup un interval de timp. Este caracterizat de: 9 Proprietatea interval - Intervalx. Este de tip numeric i reprezint numrul de milisecunde dup care este generat evenimentul Timer, adic intervalul de timp pn la apelul procesului. Valoarea sa implicit este 0 (corespunde dezactivrii ceasului). 9 Evenimentul asociat ceasului - Timerx. Este un eveniment care se declaneaz la intervale egale de timp (stabilite de proprietatea Interval). n procedura asociat acestui eveniment se scriu instruciunile aciunii care trebuie s se execute dup un interval de timp. 9 Metoda de resetare a ceasului - Resetx prin care contorul ceasului este adus la 0.
333
Creai un formular controlat de ceas Creai un fiier bitmap n dosarul Test. Imaginea din formularul alturat a fost creat n fiierul test.bmp. Creai formularul Atenionare care, la acionarea unui buton Afisare va afia o imagine i o legend care vor disprea dup 2500 de ms. Ele vor fi reafiate numai dac se acioneaz din nou butonul Afisare:
Deschidei fereastra constructorului de formulare cu comanda create form imagine1. Stabilii pentru formular proprietile: BackColor=192,192,192 Caption="Atentionare" Closable=.F. Adugai n fereastr urmtoarele obiecte: o imagine (Image1), o etichet (Label1), dou butoane de comand (Command1 i Command2) i un ceas (Timer1). Stabilii pentru aceste controale proprietile: * Imagnea "Image1" Caption="Vizitati ruinele ; Picture=c\test\test.bmp castrului roman !!!" Visible = .F. Visible = .F. AutoSize = .T. * Butonul "Command1" * Eticheta "Label1" Caption="\<Afisare" FontSize = 12 * Butonul "Command1" Alignment = 2 Caption="\<Terminare" BackStyle = 0 Scriei procedurile asociate evenimentelor: procedure Click && Command1 endproc ThisForm.Image1.Visible=.T. procedure Timer ThisForm.Label1.Visible=.T. ThisForm.Image1.Visible=.F. ThisForm.Timer1.Interval=2500 ThisForm.Label1.Visible=.F. endproc This.Interval=0 procedure Click && Command2 endproc ThisForm.Release Salvai formularul. Lansai n execuie formularul cu comanda do form imagine1. Testai formularul. nchidei formularul. Deschidei formularul cu comanda modify form imagine1. Salvai formularul sub numele imagine2. Facei modificri n acest formular astfel nct imaginea i eticheta s fie afiate intermitent la un interval de 500 ms (se creeaz un efect dinamic, de animaie). Se modific urmtoarele proceduri: procedure Click && Command1 ThisForm.Timer1.Interval=500
334 Inormatic
endproc procedure Timer ThisForm.Image1.Visible=!ThisForm.Image1.Visible ThisForm.Label1.Visible=!ThisForm.Label1.Visible endproc Salvai formularul. Lansai n execuie formularul cu comanda do form imagine2. Testai formularul. nchidei formularul.
Creai un formular care simuleaz un ceas Fie creai dou fiiere bitmap .bmp, fie gsii n sistem dou fiiere cu pictograme .ico (de exemplu face01.ico i face02.ico n imaginile din formularul alturat). Creai formularul Ceas care, la acionarea unui buton Afisare va afia alternant la un interval de 500 ms o imagine n partea dreapt i o imagine n partea stng, iar sub cele dou imagini o afiare numeric a timpului (cu pasul de 500 ms).
Deschidei fereastra constructorului de formulare cu comanda create form imagine3. Stabilii pentru formular proprietile: BackColor=192,192,192 Caption="Ceas" Closable=.F. Adugai n fereastr urmtoarele obiecte: dou imagini (Image1 i Image2), o caset de text (TextBox1), dou butoane de comand (Command1 i Command2) i un ceas (Timer). Stabilii pentru aceste controale proprietile: * Imagnea "Image1" Caption="\<Afisare" Picture=c:\test\face01.ico * Butonul "Command2" BackStyle=0 Caption="\<Terminare" * Imagnea "Image2" * Ceasul "Timer" Picture=c:\test\face03.ico Interval=0 BackStyle=0 * Caseta de text "TextBox1" * Butonul "Command1" BackStyle=0
Scriei procedurile asociate evenimentelor: procedure Click && Command1 ThisForm.Text1.Value=0 ThisForm.Timer1.Interval=500
335
ThisForm.Image1.Visible=.T. ThisForm.Image2.Visible=.F. endproc procedure Click && Command2 ThisForm.Release endproc procedure Timer ThisForm.Text1.Value=ThisForm.Text1.Value+ ThisForm.Timer1.Interval ThisForm.Image1.Visible=!ThisForm.Image1.Visible ThisForm.Image2.Visible=!ThisForm.Image2.Visible endproc Salvai formularul. Lansai n execuie i testai formularul. nchidei formularul.
ncercai:
Adevrat/Fals: 1. Obiectul ToolBox are proprietatea AutoSize. 2. DocumentFile este o proprietate specific obiectelor de tip OLE. 3. Obiectul Timer are proprietatea Picture. Completai: 1. Evenimentul AfterDock este specific obiectului ............................ 2. Modul n care poate fi activat un obiect de tip OLE este controlat cu proprietatea ......................... 3. Metoda prin care contorul ceasului este adus la 0 este ....................
336 Inormatic
Alegei rspunsurile corecte: 1. Pentru un obiect ToolBox, Dock este: a) o proprietate b) o metod 2. Pentru un obiect de tip OLE DoVerb este: a) o proprietate b) o metod 3. Pentru obiectul ceas Timer este: a) o proprietate b) o metod
R spunsuri:
Adevrat/Fals: 1-A; 2-A; 3-F. Completai: 1-ToolBox; 2- Autoactivate; 3-Reset. Alegei rspunsurile corecte: 1-b; 2- b; 3- c.
4. Proiectarea m e n i u rilor
Dac aplicaia pune la dispoziia utilizatorului un set de comenzi, metoda cea mai avantajoas, mai uoar i mai potrivit pentru a grupa aceste comenzi astfel nct utilizatorul s aib acces la ele o reprezint meniurile. Meniul (menu) este un element de interfa prin care i se ofer utilizatorului posibilitatea de a selecta o opiune (menu item) dintr-o mulime finit de opiuni posibile, afiate pe ecran total sau parial. n urma selectrii unei opiuni se declaneaz o anumit aciune, corespunztoare opiunii alese. n Visual FoxPro putei folosi dou tipuri de meniu: 9 Meniul sistem - este pus la dispoziie de mediul Visual FoxPro pentru a realiza aciuni corespunztoare limbajului de comand. 9 Meniul utilizator - este creat de programatorul unei aplicaii ca element al aplicaiei construite de el. Tipul de meniu disponibil (modul n care este afiat bara de meniu Visual FoxPro n timpul execuiei programului) este controlat de parametrul Sysmenu cu comanda: set sysmenu on| off | automatic | to default unde: 9 on - bara de meniu Visual FoxPro este disponibil n timpul execuiei programului. 9 off - bara de meniu Visual FoxPro nu este disponibil n timpul execuiei programului. 9 automatic - bara de meniu Visual FoxPro este vizibil n timpul execuiei programului, iar opiunile sunt disponibile n funcie de comanda care se execut n program. 9 to default - se revine la afiarea meniului Visual FoxPro dup ce programul i-a terminat execuia. n funcie de modul n care este dispus lista cu opiuni, meniurile sunt de dou tipuri:
337
9 Meniuri orizontale - afieaz lista de opiuni pe un rnd, pe orizontal. Meniul orizontal se mai numete i bar de meniu (menu bar), iar opiunile sale se mai numesc i titluri de meniuri (menu titles). Ele pot fi reprezentate prin cuvinte, expresii sau pictograme. n terminologia Visual FoxPro, meniul orizontal se numete menu, iar opiunile sale se numesc pad. 9 Meniuri verticale - afieaz lista de opiuni ntr-o coloan, pe vertical. Ele se mai numesc i submeniuri. n terminologia Visual FoxPro, meniul vertical se numete popup, iar opiunile sale se numesc bar.
Sistemul de meniuri al unei aplicaii este o combinaie de bar de meniuri, titluri de meniuri, submeniuri i opiuni de meniu. Forma standard a unui sistem de meniuri este urmtoarea: 9 Meniul principal (main menu) este reprezentat printr-o bar de meniu afiat sub bara de titlu a unui formular de tip fereastr, n care ruleaz aplicaia. Atunci cnd se execut clic pe un titlu de meniu se deschide un meniu pe vertical. 9 Meniurile pe vertical afieaz o list cu opiuni. Opiunile pot fi comenzi de operaii de prelucrare, titluri de submeniuri sau bare separatoare. Barele separatoare se folosesc pentru a mpri n grupuri opiunile din lista meniului. Submeniul este un alt meniu care afieaz o alt list de opiuni. n acest mod se poate crea o structur arborescent de submeniuri. Pentru a face aplicaia mai uor de utilizat, opiunile de meniu sunt grupate dup funciile lor. Submeniurile se creeaz atunci cnd: 9 bara de meniu este plin cu titluri de meniu i nu mai ncape un nou titlu de meniu; 9 lista submeniului este format din comenzi care sunt folosite mai rar; 9 lista de comenzi din submeniu este ntr-o anumit relaie cu o opiune de meniu. Unele opiuni de meniu execut direct o aciune. Alte opiuni afieaz o caset de dialog, un fomular prin care aplicaia cere utilizatorului s-i furnizeze informaii suplimentare ca s poat executa aciunea cerut. n marea majoritate a aplicaiilor aceste opiuni de meniu sunt urmate de trei puncte. Este bine ca i n interfaa pe care o construii s respectai acest standard. Fiecrei opiuni de meniu i corespunde un control de meniu. Controlul meniului este i el un obiect. La fel ca orice obiect, i el are proprieti standard prin care i se poate stabili aspectul: legenda, disponibilitatea, vizibilitatea etc. Legenda este textul care apare n titlu sau n opiunea de meniu. Controlul meniu are asociat un singur eveniment care este declanat atunci cnd opiunea de meniu este selectat de la tastatur sau cu mouse-ul. Proprietile specifice unui control meniu sunt: 9 Legenda opiunii Prompt - este textul explicativ afiat de titlul meniului sau de opiunea de meniu. 9 Tasta de acces Access key - este tasta care se apas pentru a selecta direct titlul sau opiunea respectiv atunci cnd meniul este activat. Litera tastei de acces este subliniat n legend. Pentru a stabili o tast de acces, naintea literei respective din legend, scriei caracterele \<. 9 Scurttura Shortcut key - este combinaia de taste asociat opiunii de meniu care permite executarea unei comenzi dintr-un meniu fr s se mai activeze bara de
338 Informatic
meniu i s se selecteze comanda. Lng opiune, n partea dreapt este afiat un text cu combinaia respectiv de taste. 9 Mesajul informativ Message - este un mesaj afiat n bara de stare atunci cnd se selecteaz opiunea. 9 Marcajul de verificare Mark character - este un simbol care se afieaz n partea stng a opiunii de meniu n funcie de o condiie: dac valoarea condiiei este adevrat, n faa opiunii este afiat marcajul de verificare b(bifa), iar dac este fals, marcajul nu este afiat. Aceast proprietate permite folosirea opiunilor de meniu pentru stabilirea valorii unui parametru. Dac parametrul poate lua valoarea adevrat sau fals, se folosete o singur opiune care poate fi marcat sau nu. Numele opiunii este numele parametrului. Deoarece aceast opiune se comport la fel ca un control comutator, ea se mai numete i opiune comutator. Dac parametrul poate lua mai multe valori, se folosesc mai multe opiuni de meniu, numele fiecrei opiuni reprezentnd o valoare posibil a parametrului. O singur opiune din grupul de opiuni poate fi marcat i ea reprezint valoarea aleas pentru parametru. La alegerea unei noi opiuni din grup, va fi ters marcajul vechii opiuni i va fi marcat noua opiune. Deoarece grupul de opiuni de meniu se comport la fel ca un control de tip butoane radio, el se mai numete i grup de opiuni butoane radio. 9 Disponibilitatea Skip for - este determinat de o condiie prin care se controleaz dac opiunea de meniu este disponibil sau nu: dac expresia logic are valoarea adevrat, opiunea de meniu este disponibil. Pentru a controla afiarea marcajului n faa unei opiuni se folosete comanda: set mark of popup <nume_opiune> to <expL> unde <nume_opiune> este numele atribuit opiunii (diferit de legend) folosit pentru identificarea sa, iar <expL> exprim condiia care determin afiarea marcajului. Evenimentele specifice unui control meniu sunt: 9 Iniilizarea Setup - este declanat de crearea meniului. n procedura asociat acestui meniu putei defini variabilele de memorie, putei deschide fiiere, putei salva sau restaura un sistem de meniuri. Meniurile pot fi salvate n stiva meniurilor. Pentru operaiile cu stiva putei folosi comenzile push menu pentru salvarea meniului n stiv i pop menu pentru extragerea meniului n stiv. 9 tergerea Cleanup - este declanat de activarea meniului. n procedura asociat acestui meniu putei scrie secvene de cod prin care tergei informaiile care au fost afiate pe ecran i prin care stabilii ce opiuni de meniu sunt disponibile. Dac meniul este programul principal al aplicaiei, n aceast procedur putei activa procesorul de evenimente cu comanda read events. Comanda prin care dezactivai acest procesor clear evnts o vei scrie n procedura asociat opiunii de meniu prin care terminai aplicaia. Unele aplicaii pun la dispoziia utilizatorului meniuri derulante (pop-up menu) care sunt afiate deasupra formularului, independent de bara de meniu. Opiunile afiate n acest meniu depind de context, adic de locul n care se gsete cursorul atunci cnd este apsat butonul din partea dreapt a mouse-ului. El se numete meniul contextului (context menus) sau meniu de comenzi rapide. Pentru proiectarea unui meniu se poate folosi limbajul de comand care v pune la dispoziie comenzi i funcii pentru realizarea acestei operaii. Forma mai rapid i mai puin
339
laborioas o reprezint ns Constructorul de meniuri care permite programatorului s defineasc interactiv un sistem de meniuri i s stabileasc elementele sale componente (submeniuri i opiuni de meniu), proprietile lor (legenda, tastele de acces, scurttura) i aciunile asociate unei opiuni de meniu: declanarea unei aciuni sau deschiderea unui nou submeniu. Pentru realizarea unui sistem de meniuri trebuie s parcurgei urmtorii pai: 1. Proiectai sistemul de meniuri. n aceast faz decidei de ce meniuri avei nevoie, cnd sunt afiate n interfa i cnd sunt disponibile. Stabilii ce elemente vei folosi pentru sistemul de meniuri (titlurile din meniul principal, submeniurile, opiunile din submeniuri), adic structura sistemului de meniuri. Pentru fiecare element, vei stabili proprietile specifice. Pentru fiecare opiune de meniu, vei stabili ce aciune va declana n urma selectrii. Cnd proiectai sistemul de meniuri trebuie s avei n vedere c utilizatorul trebuie s-l foloseasc uor i trebuie s nvee repede s-l utilizeze. Utilizatorul i face o imagine mental despre modul n care este organizat aplicaia pe baza meniului i a opiunilor de meniu. De aceea, atunci cnd proiectai un sistem de meniuri este bine s respectai urmtoarele reguli: a. Organizai sistemul de meniuri pornind de la sarcinile pe care trebuie s le execute utilizatorul programului de aplicaii i nu de la structura de module a programului de aplicaii. b. Legendele afiate de titlurile i opiunile de meniuri trebuie s fie sugestive, cu un neles asociat aciunii determinate de titlu sau opiune. n general este bine s folosii verbe prin care descriei aciunea ce va rezulta n urma alegerii opiunii. Pentru informarea utilizatorului vei folosi construcii suplimentare (de exemplu mesaje n bara de stare) prin care vei descrie aciunea declanat de alegerea unei opiuni. c. n legendele titlurilor i opiunilor de meniu putei folosi att litere mari, ct i litere mici. Limitai folosirea literelor mari numai la evidenierea anumitor caracteristici. d. Limitai numrul de titluri de meniuri la un ecran. Dac ele depesc capacitatea unui ecran, le vei organiza n submeniuri. e. Opiunile de meniu se organizeaz fie innd cont de frecvena lor de folosire, fie ntr-o secven logic de folosire, fie alfabetic. Vei alege ultimul criteriu dac nu le cunoatei pe primele dou sau dac lista de opiuni este prea mare (de regul peste 8) pentru a uura parcurgerea listei de ctre utilizator. f. Punei bare separatoare ntre grupuri logice de opiuni de meniu. g. Este bine s nu se foloseasc mai mult de un nivel de submeniuri, pentru ca utilizatorul s nu-i piard timpul cutnd comenzi printr-o structur arborescent de meniuri. h. Stabilii taste de acces pentru titlurile de meniuri i opiunile de submeniuri i scurtturi pentru opiunile de submeniuri. 2. Creai meniurile i submeniurile i stabilii sarcinile pe care trebuie s le execute sistemul. Pentru aceasta lansai n execuie constructorul de meniuri cu comanda: create menu <nume_meniu>
340 Informatic
Vei preciza structura arborescent a meniului i vei specifica aciunile pe care trebuie s le execute fiecare opiune de meniu ca de exemplu afiarea unei casete de dialog, a unui formular, a unei bare de instrumente sau a unui alt sistem de meniuri. Cererea de executare a unei aciuni trebuie s se fac numai printr-o singur comand. Dac aciunea declanat de selectarea unei opiuni se descrie printr-un grup de instruciuni, acestea vor fi scrise ntr-un fiier de tip program surs i vor fi lansate n execuie printr-o singur comand: do <nume_fiier>. n urma acestor aciuni ale programatorului constructorul de meniuri va crea un fiier cu numele meniului i extensia .mnx n care se gsesc, sub forma unui tabel, componentele unui meniu i caracteristicile lor. Putei modifica un meniu cu comanda: modify menu <nume_meniu> 3. Generai programul excutabil al meniului. Pentru a putea folosi meniul, trebuie generat un program care, n urma execuiei sale, s activeze meniul. Programul va fi memorat ntr-un fiier cu extensia .mpr. Dup orice modificare a meniului va trebui s executai din nou operaia de generare. 4. Lansai n execuie i testai meniul. Meniul va fi activat prin lansarea n execuie a pogramului generat cu comanda: do <nume_meniu>.mpr
Creai un sistem de meniuri Sistemul de meniuri pe care l vei crea reprezint programul principal de aplicaie n care, n funcie de opiunile alese, vei lansa n execuie diferite module de program, construite anterior sub form de formulare. Se va folosi pentru meniul principal un meniu sub forma unei bare pe orizontal, la fel ca i meniul sistemului Visual FoxPro. Sistemul de meniuri va afia o bar de meniuri pe orizontal cu titlurile Afiseaza figuri, Utilitati i Terminare. Titlul Afiseaza figuri va deschide un meniu pe vertical care conine dou opiuni de tip submeniu: Patrat4 i Figuri4. Submeniul Patrat4 conine doua opiuni de tip comand: Afiseaza... care va lansa n execuie formularul n care este controlat afiarea unui ptrat cu ajutorul unui control de tip comutator i Coloreaza... care va lansa n execuie formularul n care este controlat afiarea culorii de umplere a unui ptrat cu ajutorul unui control de tip list. Submeniul Figuri4 conine dou opiuni de tip comand: Grup 1... care va lansa n execuie formularul n care este controlat afiarea unei anumite figuri geomtrice cu ajutorul unui control de grup de butoane radio i Grup 2... care va lansa n execuie formularul n care este controlat afiarea unei anumite figuri geomtrice cu ajutorul unui control de tip list. Titlul Utiliti va deschide un meniu pe vertical care conine dou opiuni de tip comand: Ceas... care va lansa n execuie formularul n care este simulat un ceas cu ajutorul controlului de tip Timer i Calculator... care va lansa n execuie formularul n care este simulat lucrul cu un
341
calculator de buzunar. Titlul Terminare va avea asociat o comand pentru terminarea aplicaiei.
Lansai n execuie constructorul de meniuri fie cu opiunea de meniu New...File (din caseta de dialog New alegei butonul radio Menu i executai apoi clic pe butonul New File), fie cu comanda:
create menu menu_test
Se deschide caseta de dialog New Menu care conine dou butoane: Menu pentru crearea unui sistem de meniuri sub form de bar orizontal pe primul rnd al formularului n locul sau mpreun cu titlurile meniului Visual FoxPro i Shortcut pentru crearea unui meniu derulant pe vertical n interiorul ferestrei de aplicaie. Putei alege butonul Shortcut atunci cnd vrei s creai un meniu de comenzi rapide asociat unui anumit element de interfa. Vei scrie comanda de lansare n execuie a acestui meniu n procedura asociat evenimentului RightClick al elementului respectiv. Deoarece vrem s construim un meniu sub form de bar pe orizontal, executai clic pe butonul Menu. Se deschide fereastra constructorului de meniuri Menu Designer, iar n bara de meniuri este afiat un titlu de meniu care conine opiuni specifice constructorului de meniuri: Menu. Deschidei acest meniu i observai opiunile pe care le conine. Identificai opiunile pentru care avei butoane n fereastra Menu Designer. Opiunea Quick menu v ajut s creai rapid un sistem de meniuri pornind de la meniul Visual FoPro. Se va genera automat structura acestui sistem de meniuri, dup care vei putea terge, aduga sau modifica opiunile sau meniurile Visual FoxPro. Vei construi ns sistemul de meniuri fr s folosii aceast facilitate. nainte de a specifica structura sistemului de meniuri, i vei stabili caracteristicile generale prin intermediul casetei de dialog General Option pe care o deschidei cu opiunea de meniu General Options...View. Ea conine urmtoarele controale: 9 Grupul de butoane radio Location prin intermediul crora stabilii poziia meniului pe care l creai fa de meniul sistemului Visual FoxPro: Replace - n locul acestuia, Append - la dreapta acestuia, Before naintea unui titlu de meniu i After - dup un titlu de meniu din meniul sistemului. Dac alegei una dintre ultimele dou opiuni, se va deschide o list derulant cu titlurile de meniuri din care putei s alegei titlul meniului fa de care va fi adugat n meniul sistemului, meniul creat de dumneavoastr. 9 Grupul de comutatoare Menu code prin intermediul crora stabilii dac dorii s scriei o secven de cod asociat evenimentului Setup (comutatorul Setup...) i evenimentului Cleanup (comutatorul Cleanup...). Dac activai comutatorul se va deschide o fereastr de editare n care vei scrie secvena de instruciuni.
342 Informatic
9 Zona de editare Procedure i comutatorul Edit le vei folosi dac vrei s definii o procedur global care va fi folosit implicit n ntregul sistem de meniuri. Ea va fi lansat n execuie de fiecare dat cnd se va alege o opiune creia nu i s-a atribuit o procedur proprie. Pentru meniul pe care l construii trebuie s fie activat butonul Replace. nchidei caseta de dialog executnd clic pe butonul Ok. Ai revenit n fereastra Menu Designer n care definii titlurile din meniul principal:
n fereastra Menu Designer putei folosi urmtoarele controale: 9 Zona de de lucru afieaz sub forma unui tabel mai multe controale: pe un rnd sunt afiate controalele corespunztoare definirii caracteristicilor unei opiuni de meniu, iar pe o coloan controalele corespunztoare unei caracteristici a opiunii de meniu. Coloanele sunt urmtoarele: Mover Control. Este prima coloan i conine un buton cu sgeat dubl. Se folosete pentru a schimba locul opiunilor n list (prin glisarea opiunii n noua poziie). Prompt. n aceast coloan se scrie textul legendei opiunii de meniu. Dac n legend scriei naintea textului caracterul \, opiunea nu va disponibil. Dac n legend scriei numai caracterele \-, opiunea respectiv va fi o linie de demarcare ntre grupurile de opiuni.
Result. n acest coloan este afiat un control de tip list ascuns din care putei alege tipul aciunii declanate de selectarea opiunii de meniu (tipul rezultatului). Tipul rezultatului poate fi: Submenu (se deschide un submeniu), Command (se execut o comand) sau Procedure (se execut o procedur). Pentru opiunile de submeniu Afiseaza, Coloreaza, Grup 1, Grup 2, Calculator i Ceas alegei un rezultat de tip Command, pentru titlul Terminare, rezultatul Procedure, pentru restul opiunilor rezultatul Submenu.
343
Zona de creare sau editare a rezultatului. Este coloana urmtoare rezultatului (coloana a patra). Conine un buton Create la creare i un buton Edit la editare. Dac tipul rezultatului este Submenu, la acionarea butonului se deschide o nou zon de lucru n care putei defini opiunile submeniului i caracteristile lor. Dac tipul rezultatului este Command, la acionarea butonului se activeaz n coloana a patra o caset de text n care scriei comanda. Dac tipul rezultatului este Procedure, la acionarea butonului se deschide o zon de editare n care scriei secvena de instruciuni a procedurii. Pentru opiunile de meniu pentru care ai ales rezultatul de tip Command, scriei comanda do form <nume_forma>, unde <nume_forma> este numele fiierului n care ai salvat formularul. Pentru titlul Terminare pentru care ai ales rezultatul Procedure, scriei n zona de editare urmtoarea secven de instruciuni: deactivate menu menu_test && dezactiveaza meniul release menu menu_test extended && elibereaza zona de ; memorie alocata meniului la creare set sysmenu to default clear memory clear Butonul Option. Dac l acionai se deschide caseta de dialog Prompt Option n care stabilii caracteristicile opiunii de meniu. Completai n aceast caset de dialog, pentru fiecare opiune de meniu, mesajul i scurttura. 9 Lista ascuns Menu level afieaz ierarhic meniurile din care s-a dezvoltat meniul pentru care se pecizeaz opiunile n zona de lucru a ferestrei (filiaia meniului). Alegnd o opiune din aceast list putei reveni ntr-unul din meniurile superioare lui. De exemplu, folosind aceast list putei s revenii din zona de lucru a meniului Patrat, n zona de lucru a meniului printe Afiseaz figuri sau a meniului principal Menu Bar.
Grupul de zone de editare Shortcut se folosete pentru a stabili o scurttur pentru opiunea de meniu. Combinaia de taste se scrie n zona de editare Key Label (de exemplu innd apsat tasta Alt apsai tasta S; scurttura va fi Alt+S). n zona de editare Key Text se va scrie textul afiat lng opiunea de meniu prin care se precizeaz scurttura. n caseta de editare Skip For scriei expresia logic folosit pentru a controla disponibilitatea opiunii de meniu. Putei folosi constructorul de expresii dac acionai butonul .... n caseta de editare Message scriei mesajul care va fi afiat n bara de stare la selectarea opiunii. Putei folosi constructorul de expresii. n zona de editare Comment putei scrie comentarii folosite intern, de proiectant.
344 Informatic
9 Seciunea de butoane Item conine butoane pentru inserarea unei opiuni de meniu ntre cele existente: Insert (o opiune definit de utilizator) i Insert Bar... (o opiune preluat din meniul sistemului Visual FoxPro) i pentru tergerea unei opiuni Delete. 9 Butonul Preview. Prin acionarea lui putei s previzualizai meniul pe care l construii: meniul sistemului este nlocuit de acesta i se deschide o caset de dialog Preview n care sunt prezentate informaii despre opiunea selectat din meniu (numele fiierul, legenda opiunii i comanda asociat). Dup ce ai terminat de construit meniul, l previzualizai folosind butonul Preview. Generai meniul executabil cu opiunea Generate...Menu. Lansai n execuie meniul cu comanda: do menu_test. Testai meniul. Structura meniului este memorat ntr-un fiier de tip tabel, care are cu numele meniului (menu_test) i extensia .mnx. Deschidei acest fiier cu comanda use menu_test.mnx. Afiai coninutul su cu comanda browse. Identificai n acest tabel semnificaia fiecrei coloane. Identificai ce element din structura meniului este nregistrat n fiecare rnd al tabelului.
Testai modul n care putei folosi procedura global i procedurile asociate evenimentelor Setup i Cleanup Vei aduga sistemului de meniuri o procedur global: Deschidei meniul anterior i-l salvai sub numele menu_1. n noul meniu vei face urmtoarele modificri: In caseta de dialog General Option scriei n zona de editare a procedurii globale instruciunea: ? "Test procedura globala" Activai comutatorul Setup i n fereastra de editare a procedurii scriei: ? "Test eveniment Setup" n fereastra Form Designer n meniul principal adugai titlul Scrie nainte de titlul de meniu Terminare. Acestui titlu de meniu i atribuii un rezultat de tip Command, dar nu i atribuii nici o comand. n meniul Utilitati adugai la sfrit dou opiuni: Scrie 1 i Scrie 2. Ambelor le atribuii un rezultat de tip comand. Opiunii Scrie 1 nu i atribuii nici o comand, iar opiunii Scrie 2 i atribuii comanda: ? "Test optiune Scrie 2" n procedura asociat titlului Terminare din meniul principal, tergei instruciunea clear. Salvai modificrile fcute i generai meniul executabil. Lansai n execuie meniul. Testai meniul Scrie i opiunile Scrie 1 i Scrie 2. Ce concluzii tragei? Deschidei meniul menu_1 i l salvai sub numele menu_2. n noul meniu deschidei caseta de dialog General Option, activai comutatorul Cleanup i n fereastra de editare a procedurii scriei: clear ? "Test eveniment Cleanup" Salvai modificrile fcute i generai meniul executabil. Lansai n execuie meniul. Testai meniul Scrie i opiunile Scrie 1 i Scrie 2. Ce concluzii tragei? Cnd se execut procedura asociat evenimentului Cleanup.
345
346 Informatic
va crea o list dinamic cu numele elevilor corigeni din clasa respectiv, n perioada aleas. Toate aceste formulare vor avea un buton de terminare. d. Meniul Listare va deschide un meniu pe vertical cu opiunile Lista 1, Lista 2, Lista 3, Lista 4, Lista 5 i Lista 6. Aceste opiuni vor fi grupate logic n dou grupuri de opiuni (fiecare grup va conine 3 opiuni) separate printr-o bar separatoare. Toate aceste opiuni de meniu vor afia rapoarte, n care nregistrrile vor fi grupate dup criteriul clasei. Lista 1 (Lista 4) i Lista 2 (Lista 5) vor afia rapoarte cu numele i prenumele elevului, notele i media pe primul semestru, respectiv al doilea semestru, iar Lista 3 ((Lista 6)) va afia un raport cu numele i prenumele elevului, mediile semestriale i media general. n primul grup de rapoarte, n cadrul grupului clasa, nregistrrile vor fi afiate n ordine alfabetic, iar al doilea grup de rapoarte n ordinea descresctoare a mediilor. Utilizatorul programului va cunoate semnificaia fiecrei opiuni din mesajul afiat n bara de stare. e. Stabilii scurtturi i mesaje pentru toate opiunile de meniu. f. nainte de a se activa meniul, afiai pe ecran o caset de dialog pentru introducerea parolei. Stabilii ce parol dorii. Se vor accepta numai cinci ncercri de comunicare a parolei pentru a avea acces la datele din baza de date.
5 . P r o i e c t a r e a a p l i c a i i l o r
5 . 1 . P r o g r a m u l m o ni t o r
O aplicaie cuprinde mai multe module: pentru introducerea datelor, pentru prelucrarea lor sau pentru afiarea unor rapoarte pe ecran sau la imprimant. Toate aceste module trebuie asamblate ntr-o aplicaie, n care un modul de program trebuie s le administreze i s le coordoneze. Programul monitor al unei aplicaii are rolul de a coordona executarea modulelor aplicaiei i a asigura colaborarea ntre ele. Sarcinile unui program monitor sunt: a. S configureze mediul de lucru. Sistemul de gestiune a bazelor de date poate fi configurat prin intermediul unor parametri a cror valoare se stabilete cu comanda set. Aceti parametri au valori implicite, iar n unele aplicaii aceste valori implicite nu sunt tocmai potrivite. De exemplu, parametrul talk trebui s aib valoarea off, iar parametrului date, care stabilete formatul datelor calendaristice, i se poate atribui un anumit format (set date to british). Se mai poate stabili directorul curent din care se vor prelua baza de date i alte fiiere necesare aplicaiei cu parametrul default (set default to <cale_director>). Ali parametri pentru care se stabilesc de obicei valorile sunt century, confirm, console, deleted i safety. b. S personalizeze fereastra de aplicaie. Aplicaia ruleaz n fereastra sistemului Visual FoxPro, care va deveni fereastra aplicaiei. De aceea trebuie s schimbai anumite proprieti ale acestei ferestre. Obiectul fereastra aplicaiei Visual FoxPro se identific prin variabila de memorie sistem _screen. De exemplu, dac vrei s schimbai legenda ferestrei de aplicaie vei folosi comanda de atribuire:
347
nainte ns de a modifica proprietile ferestrei, salvai valorile pe care le modificai n variabile de memorie (de exemplu: nume_f=_screen.caption) . c. S activeze meniul principal al aplicaiei. Din meniul principal se vor lansa n execuie modulele de program pentru prelucrarea datelor, formularele pentru editarea datelor, comenzile pentru afiarea rapoartele etc. d. S activeze procesorul de evenimente. Deoarece programul generat de constructorul de meniuri nu conine propriul procesor de evenimente, este necesar ca, dup ce a fost lansat n execuie programul care creeaz meniul, s se activeze procesorul de evenimente care la rndul su va activa meniul i va permite tratarea evenimentelor. e. S dezactiveze procesorul de evenimente i s refac starea anterioar a mediului de lucru la terminarea execuiei aplicaiei. Exemplu Pentru salvarea i restaurarea parametrilor care caracterizeaz starea sistemului, putei folosi dou tabele (cte una pentru fiecare tip de comand set): 9 stare1 (comenzi set pentru parametrii cu dou valori - on i off; de exemplu talk, century, confirm, console, deleted i safety) cu structura nume C(15), valoarea_s C(3), valoarea_a C(3); 9 stare2 (comenzi set pentru parametrii cu mai multe valori - set ... to; de exemplu default i date) cu structura nume C(15), valoarea_s C(30), valoarea_a C(30); unde valoarea_s este valoarea parametrului n sistemul Visual FoxPro, iar valoarea_a este valoarea parametrului n aplicaie. ncrcai iniial tabelul cu numele parameterilor pe care dorii s-i modificai (cmpul nume) i cu valorile pe care dorii s le aib n aplicaie. Pentru salvarea configurrii sistemului, la nceputul sesiunii de lucru vei folosi procedura intrare: procedure intrare * se salveaza valorile parametrilor sistemului * se atribuie parametrilor valorile aplicatiei use stare1 scan replace valoare_s with set(alltrim(stare1.nume)) alfa=alltrim(stare1.nume) beta=alltrim(stare1.valoare_a) set &alfa &beta endscan use use stare2 scan replace valoare_s with set(alltrim(stare2.nume)) alfa=alltrim(stare2.nume) beta=alltrim(stare2.valoare_a) set &alfa to &beta endscan use endproc
348 Informatic
Pentru restaurarea strii sitemului, la sfritul sesiunii de lucru vei folosi procedura ieire: procedure iesire * se restaureaza valorile parametrilor sistemului use stare1 scan alfa=alltrim(stare1.nume) beta=alltrim(stare1.valoare_s) set &alfa &beta endscan use use stare2 scan alfa=alltrim(stare2.nume) beta=alltrim(stare2.valoare_s) set &alfa to &beta endscan use endproc
5.2. G e s t i o n a r e a c o m p o n e n t e l o r u n e i a p li c a ii
349
9 Componente care nu se modific n timpul execuiei: programele, meniurile, rapoartele, formularele etc. 9 Componente care se modific n timpul execuiei: bazele de date, tabelele etc.
Aplicaia (application) este un fiier care conine componetele unui proiect care nu se modific n timpul execuiei. Fiierul aplicaiei are extensia .app. Pentru a crea o aplicaie trebuie parcurse urmtoarele etape: a. Se creeaz proiectul aplicaiei. Nu se poate crea o aplicaie dac nu ai inclus componentele ei ntr-un proiect. b. Se stabilete programul principal - Set Main. Orice aplicaie trebuie s aib un program principal. Programul principal este programul care se va executa atunci cnd se lanseaz n execuie aplicaia i din care vor fi apelate celelalte componente ale aplicaiei: modulele de program, meniurile, formularele etc. c. Se genereaz aplicaia. Aplicaia se lanseaz n execuie cu comanda: do <nume_aplicaie>.app Aplicaia este dependent de mediul Visual FoxPro. Pentru a crea un program independent de acest mediu, acesta trebuie s fie un program executabil (fiier cu extensia .exe) care se obine la fel ca o aplicaie, cu deosebirea c n caseta Build Options se activeaz butonul Build Executable. Aadar, pentru a putea rula aplicaia pe care ai construit-o pe un calculator pe care nu este instalat Visual FoxPro avei dou posibiliti: 9 Creai fiierul aplicaiei (.app) i l distribuii utilizatorului mpreun cu versiunea pentru rulare a sistemului Visual FoxPro care conine numai acele elemente care asigur execuia programelor, nu i modificarea lor. 9 Creai programul executabil al aplicaiei. Acesta nu are nevoie de varianta pentru rulare, ci i sunt necesare numai bibliotecile de rulare (fiiere care conin proceduri pentru rularea programelor). Aplicaia i programul executabil trebuie transportate la destinaie (calculatorul utilizatorului) pe un suport de memorare (discuri flexibile sau CD). Pe acest suport va fi construit kitul de instalare care va conine o imagine a structurii de directoare necesare executrii aplicaiei, directoarele n care se vor gsi fiierul executabil i alte fiiere necesare aplicaiei. Pentru realizarea kitului de instalare folosii procedura asistent a kitului de instalare Setup Wizard. Procedura creeaz pe hard discul calculatorului dumneavoastr, n directorul precizat, o imagine a chitului de instalare. Dup ce ai creat aceast imagine, o vei copia pe suportul de memorare stabilit pentru destinaie n timpul procesului de generare a kitului (dac ai ales discul flexibil, vei copia coninutul fiecrui director rezultat pe o dischet). La destinaie vei instala aplicaia lansnd n execuie programul setup.exe care a fost creat, n cazul suportului de tip disc flexibil, pe primul disc.
350 Informatic
Creai un proiect Proiectul va cuprinde meniul definit anterior menu_test, formularele care sunt activate de opiunile acestui meniu, i cele dou fiiere cu pictograme folosite n formularul care simuleaz ceasul. La aceste componente trebuie s adugai programul monitor.
Creai n rdcina discului C directorul Aplicaie. n acest director vei crea proiectul. Lansai n execuie generatorul de proiecte fie cu opiunea de meniu New...File (din caseta de dialog New alegei butonul radio Project i executai apoi clic pe butonul New File, dup care n caseta de dialog Create alegei directoul Aplicatie i atribuii proiectului numele Proiect), fie cu comanda: create project \aplicatie\proiect Se deschide fereastra Project Butonul de restrngere/expandare a ferestrei. n urma Manager care este mprit n operaiei de restrngere fereastra va fi redus la zona mai multe seciuni, fiecare etichetelor seciunilor i va putea fi ancorat la fel ca orice seciune reprezentnd o cate- bar de instrumente. Executnd apoi clic pe o etichet vei gorie de componente: All - toaexpanda numai seciunea corespunztoare etichetei. te componentele, Date - componentele care conin date (Database, Free Table, Queries), Documents - componentele utile pentru introducerea i afiarea datelor (formularele Forms i rapoartele Reports), Class Libraries - bibliotecile de clase, Code - componente care conin module de program (Pro-grams i Applications) i Other - alte componente (meniurile Menus, fiierele de texte Text Files i alte fiiere Other Files). n zona de lucru a ferestrei vor fi afiate componentele specifice seciunii.
Cu ajutorul Gestionarului de proiecte putei executa urmtoarele operaii: 9 Crearea unei componente noi (butonul New...). Se va deschide fereastra constructorului corespunztor componentei selectate: Menu Designer - pentru meniuri, Query Designer - pentru interogri, Report Designer - pentru rapoarte, Form Designer pentru formulare ... i fereastra de editare texte pentru Programs i Files. 9 Adugarea unei componente la proiect (butonul Add...). Dac obiectul a fost creat n afara proiectului, dup ce acionai acest buton putei s alegei dintr-o list componentele pe care dorii s le adugai la proiect. 9 Editarea unei componente a proiectului (butonul Modify). Selectai componenta din seciunea corespunztoare a fereastrei i acionai butonul. Se va deschide fereastra constructoului cu care ai creat componenta i putei s facei modificrile.
351
9 Lansarea n execuie a unei componente a proiectului (butonul Run). Selectai componenta i acionai butonul. Va fi lansat n execuie componenta (programul, interogarea, formularul etc.). 9 nlturarea unei componente din proiect (butonul Remove...). Selectai componenta din seciunea corespunztoare a ferestrei i acionai butonul. n caseta de dilaog care se deschide, confirmai dac dorii numai nlturarea componentei din proiect (Remove) sau nlturarea i tergerea ei de pe disc (Delete). 9 Construirea proiectului (butonul Build...). Dup ce apsai butonul, se va deschide o caset de dialog n care vei preciza ce vei construi (proiect, aplicaie, fiier executabil sau vei recompila toate fiierele). Deschidei seciunea Documents n care vei aduga la proiect formularele. Selectai obiectul Form i acionai butonul Add.... Se deschide caseta de dialog Open n care cutai directorul n care se gsete formularul i selectai apoi primul formular apelat n meniu. Acionai apoi butonul Ok. Vei repeta aceast operaie pentru fiecare formular care va fi adugat la proiect. Deschidei seciunea Other n care vei aduga la proiect meniul i fiierele cu pictograme necesare pentru simularea ceasului. Selectai mai nti obiectul Menus i acionai butonul Add.... Se deschide caseta de dialog Open din care selectai meniul menu_test i acionai apoi butonul Ok. Selectai apoi obiectul Other Files i acionai butonul Add.... Se deschide caseta de dialog Open din care selectai primul fiier cu pictogram (Face01.ico) i acionai apoi butonul Ok. Vei repeta aceast operaie i pentru al doilea fiier cu pictogram (Face01.ico). Facei modificri n meniu. Selectai obiectul Menus i l dezvoltai executnd clic pe butonul +. n lista afiat selectai meniul Menu_test i apoi executai clic pe butonul Modify. Se deschide fereastra constructorului de meniuri. Executai clic pe butonul Edit al meniului Terminare. n fereastra de editare a procedurii asociate titlului de meniu tergei instruciunile: set sysmenu to default clear memory i adugai instruciunea: clear events nchidei fereastra de editare. Deschidei seciunea code n care vei crea programul monitor. Selectai obiectul Programs i acionai butonul New.... Se deschide fereastra de editare. Scriei n fereastra de editare instruciunile programului monitor i apoi l salvai sub numele monitor. * se salveaza configuratia do menu_test.mpr salv=set('talk') * se activeaza procesorul de; _screen.Caption = 'Test' evenimente _screen.BackColor=Rgb(120,120,120) read events * se stabileste noua configuratie * se restaureaza configuratia set talk off set talk &salv nume_f = screen.Caption _screen.Caption=nume_f culoare_f=_screen.BackColor _screen.BackColor=culoare_f * se creeaza meniul set sysmenu to default
352 Informatic
Pentru a vizualiza coninutul proiectului, executai clic pe butoanele + din faa numelui obiectului:
Acionai butonul Build.... n caseta de dialog Build Options activai butonul Rebuild Project i apoi butonul OK.
nchidei fereastra aplicaiei executnd clic pe butonul de nchidere. Informaiile proiectului sunt memorate sub forma unui tabel. Deschidei acest tabel cu comanda: use \aplicatie\proiect.pjx. Vizualizai coninutul tabelului cu comanda browse. Identificai semnificaia informaiilor memorate n fiecare rnd i n fiecarea coloan a tabelului. nchidei fereastra de vizualizare. nchidei tabelul cu comanda use.
353
Deschidei proiectul fie cu opiunea de meniu Open...File (din lista ascuns Files of type alegei Project, selectai fiierul Proiect din directoul Aplicaie i executai apoi clic pe butonul Open), fie cu comanda: modify project \aplicatie\proiect n seciunea Code a ferestrei Project Manager selectai programul monitor care va fi programul principal. Selectai apoi opiunea Set MainProject. Numele programului principal va fi scris cu stilul bold. Pentru a genera aplicaia, acionai butonul Build... din fereastra Project Manager. Se deschide caseta de dialog Build Options n care din grupul de butoane radio Action activai butonul Build Application. Acionai apoi comutatorul OK i n fereastra Save As scriei numele aplicaiei: test. Lansai n execuie aplicaia cu comanda: do \aplicatie\test.app. Testai aplicaia.
Creai kitul pentru distribuirea aplicaiei
Creai un director Test n care va fi creat imaginea kitului de distribuie. Deschidei caseta de dialog a procedurii asistent alegnd opiunea de meniu Setup Wizard Tools i parcurgei urmtorii pai (folosind butonul Next):
1. Precizai locul sursei kitului- Locate Files. l comunicai n cmpul de editare Distribution files. Pentru a uura cutarea, executai clic pe butonul .... Din lista deschis alegei directorul c:\aplicatie. 2. Precizai componentele speciale folosite de aplicaie - Specify Components. Componentele pe care le putei preciza (activnd comutatorul corespunztor) sunt: Visual FoxPro runtime - versiunea pentru rulare necesar aplicaiilor (este necesar atunci cnd kitul conine o aplicaie), Microsoft Graph 5.0 runtime versiunea pentru rulare a programului Microsoft Graph 5.0 (este necesar atunci cnd n programele kitului se creeaz grafice), OLE servers (este necesar atunci cnd n programele kitului se folosete tehnologia OLE). Activai comutatorul Visual FoxPro runtime. 3. Creai directorul cu imaginea kitului - Create Disk Image Directory. Procedura asistent creeaz pe hard disc o imagine a kitului. Aceast imagine poate fi segmentat n grupuri de directoare, fiecare grup corespunznd unui disc flexibil de de 3.5 inch sau poate fi nesegmentat. Modul pe care l-ai ales pentru memorarea pe hard disc va determina tipul suportului destinaie. Alegei acest mod activnd unul dintre comutatoarele din grupul Disk Image: 1.44 MB 3.5-inch (pentru discheta de 3.5 inch) sau Netsetup (pentru CD). Locul n care va fi memorat imaginea kitului l vei comunica n caseta de text Disk Images Directory. Pentru exemplul nostru vei alege varianta discurilor de 3.5 inch i directorul pentru imagine va fi c:\Test. 4. Precizai opiunile la instalare - Specify Setup Option. Este obligatoriu s comunicai informaiile pentru caseta de text Setup dialog box caption (titlul afiat de fereastra n care ruleaz kitul de instalare; scriei de exemplu Instalare) i Copyright information (date referitoare la drepturile de copyright ale aplicaiei; scriei de exemplu Autor <nume>). Mai putei completa caseta de text Post-setup executable cu numele unui program executabil care va fi lansat n execuie la sfritul instalrii kitului. Putei folosi acest program pentru a v proteja aplicaia mpotriva copierilor ilegale sau pentru a stabili configuraia specific aplicaiei.
354 Informatic
5. Precizai directorul implicit n care se va instala aplicaia la destinaie - Specify Default Destination. Aceast informaie o comunicai n caseta de text Default Directory. Este posibil ca acest director s fie schimbat la instalarea kitului prin precizarea unui alt director de ctre persoana care instaleaz aplicaia. Scriei n caseta de text c:\produs. Mai putei s scriei n caseta de text Program Group numele grupului care va fi adugat la meniul de start (implicit este Visual FoxPro Application). Din grupul de butoane radio User can modify putei activa butonul Directory and program group (utilizatorul poate modifica la instalare i numele directorului n care va fi instalat aplicaia i numele grupului de programe) sau butonul Directory only (utilizatorul poate modifica la instalare numai numele directorului). 6. Precizai caracteristicile fiierelor care compun aplicaia - Change File Setings. Se deschide tabelul n care sunt memorate datele referitoare la fiierele incluse n kitul de instalare. Fiecare rnd reprezint un fiier, iar fiecare coloan o caracteristic a fiie-rului. Titlurile coloanelor sunt: File - numele fiierului, Target Dir - directorul n care va fi copiat fiierul la destinaie (din lista ascuns putei alege una dintre opiunile: AppDir - directorul aplicaiei, WinDir - directorul sistemului de operarea Windows, WinSysDir - directorul System al sistemului de operarea Windows), PM Item activeaz programul Program Manager cu ajutorul cruia putei stabili proprieti suplimentare ale fiierului (de exemplu pictograma), ActiveX - activeaz instalarea controlului de tip ActiveX la destinaie.
7. Terminai procesul de creare al kitului. Pentru aceasta acionai butonul Finish. Se va afia caseta de dialog Setup Progress care v informeaz despre modul n care decurge procesul de creare a kitului.
Dup ce s-a terminat procesul de creare a imaginii kitului de distribuie, deschidei directorul Test i observai c el conine un director Disk144 (imagine pe disc flexibil) i n acest director trei subdirectoare Disk1, Disk2 i Disk3. Aceste directoare vor fi copiate fiecare pe cte un disc flexibil.
Elaborarea unor strategii de modularizare i abstractizare a prelucrrii datelor Putem s testm kitul de instalare pe propriul calculator. Deschidei directorul Disk1 i lansai n execuie programul
355
setup. Vei pstra ca director pentru aplicaie directorul stabilit n kit, aa c vei aciona butonul Install all files for Instalare.
La terminarea procesului de insta-lare, pe calculatorul dumneavoastr va fi creat un director nou (Testare) i n el vor fi scrise fiierele aplicaiei. Lansai n execuie aplicaia.
Creai un program monitor folosind tehnica programrii pe obiecte Vei deschide proiectul, vei modifica programul monitor, apoi vei crea aplica-ia. Dup ce ai salvat noua versiune a aplicaiei, vei genera kitul ei de instalare. Programul monitor n aceast versiune va fi (crearea obiectului program monitor se va face pornind de la clasa Custom): * se creeaza un obiect program monitor monitor=CreateObject("clasa_m","menu_test") monitor.proc_ev Define class clasa_m as custom protected salv, nume_f, culoare_f procedure init && Evenimentul init declansat de creare obiect pm parameters meniu This.salv=set('talk') This.nume_f= screen.Caption This.culoare_f= screen.BackColor set talk off _screen.Caption = 'Test' _screen.BackColor=Rgb(120,120,120) nume_m=meniu+'.mpr' do &nume_m endproc procedure proc_ev && Metoda activeaza procesorul de evenimente read events endproc procedure destroy && Evenimentul destroy declansat de terminarea; program monitor val=This.salv set talk &val _screen.Caption=This.nume_f
356 Informatic
screen.BackColor= This.culoare_f set sysmenu to default endproc enddefine
ncercai:
Adevrat/Fals: 1. Se poate preciza cazul n care o opiune de meniu nu este disponibil. 2. n procedura Setup a meniului se dezactiveaz procesorul de evenimente. 3. ntr-o aplicaie Visual FoxPro putei crea un meniu de comenzi rapide. 4. Procedura Cleanup se execut naintea procedurii Setup. 5. Programul monitor se folosete pentru a administra proiectul. 6. Proiectul este un program care, dac este lansat n execuie, monitorizeaz aplicaia. 7. Aplicaia este independent de mediul Visual FoxPro. Completai: 1. Mesajul informativ Message se afieaz ............................................................. 2. Unei opiuni de meniu putei s-i asociai un submeniu, o comand sau..,.................... 3. Fiierul n care se memoreaz tabelul cu structura meniului are extensia .......... 4. Condiia prin care testai disponibilitatea unei opiuni de meniu este precizat prin ............. 5. Kitul de instalare conine programul ...................... care se folosete pentru instalarea aplicaiei pe alt calculator. Alegei rspunsurile corecte: 1. Pentru revenirea din meniul aplicaiei n meniul sistemului, trebuie s atribuii cu comanda set parametrului sysmenu valoarea : a) off b) automatic c) to default 2. Extensia fiierului care conine meniul executabil este: a) mnx b) mnt c) mpr d) mpx 3. Extensia fiierului care conine aplicaia este: a) prj b) api c) exe d) app spunsuri: R Adevrat/Fals: 1-A; 2-F; 3-A; 4-F; 5-F; 6-F; 7-F.
Completai: 1-bara de stare; 2-o procedur; 3-.mnx; 4-Skip For ; 5-setup.exe Alegei rspunsurile corecte: 1-c; 2- c; 3- d.