Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Foxpro


Index » educatie » » informatica » Foxpro
» Programarea in limbajul FoxPro


Programarea in limbajul FoxPro


Programarea in limbajul FoxPro

Interfata sistemului FoxPro permite utilizatorilor neinformaticieni care au un minim de cunsostinte in doemniu sa administreze sa sa exploateze o baza de date.

Prin utlizarea ferestrei de comenzi si a meniului sistem se poate crea si exploata corect o baza de date, insa nu se folosesc toate facilitatile oferite de limbajul FoxPro. O modalitate completa de creare si exploatare a bazelor de date consta in realizarea unor fisiere ce contin comenzi (programe sursa), intr-o succesiune logica, pe care sistemul le va executa secvential. Unul din avantajele deosebite ale acestui mod de lucru este acela ca printr-o simpla apelare a fisierului de comenzi, se pot relua serii de comenzi, intr-un mod identic celor introduse de la tastatura, in fereastra de comenzi, la care se adauga si alte categorii de comenzi.

Secventa de comenzi specifica sistemului FoxPro, stocata intr-un fisier cu extensia .PRG, poarta numele de program sursa. Fisierul este memorat pe disc si executat de fiecare data, cand este incarcat in memorie printr-o comanda corespunzatoare.



Comenzile, incluse in fereastra de comenzi, sunt executate secvential in stil interpretor de comenzi. Cele din corpul programului sunt executate fie secvential, fie in structuri alternative sau repetitive (aceste doua structuri sunt posibile numai in cadrul unui program sursa), in compilator.

O alta facilitate oferita de programele sursa consta in aceea ca dintr-un asemenea fisier se poate apela un alt fisier de comenzi, transferand controlul executiei si, eventual, liste de parametri.

1. Crearea programelor FoxPro

Fisierele de comenzi (programele sursa) pot fi create si/sau modificate in doua moduri:

Printr-o comanda MODIFY COMMAND introdusa in fereastra de comenzi;

Prin deschiderea meniului File si selectarea optiunii New. In caseta de de dialog New se selecteaza optiunea Program si apoi se executa clic pe butonul New.

Crearea unui program folosind comanda MODIFY COMMAND

Pentru a crea un fisier de comenzi (program sursa) in fereastra Command se tasteaza o comanda MODIFY COMMAND. Efectul acestei comenzi este lansarea in executie a editorului de texte propriu sistemului FoxPro, care va permite sa creati un nou fisier de coemnzi sau sa modificati un fisier de coemnzi existent. Sintaxa comenzi este urmatoarea:

MODIFY COMMAND [<file> | ?]

[NOEDIT

[NOWAIT

[RANGE <expN1>, <expN2>]

[[WINDOW <window name1>]

IN WINDOW] <window name2> | IN SCREEN

[AS <expN3>]

[SAME

[SAVE

unde:

[<fisier> | ?]

Daca in <fisier> nu s-a specificat extensia dupa numele de fisier, se presupune procesarea unui fisier cu extensie .PRG. Comanda MODIFY COMMAND permite folosirea unu sablon de fisier care sa contina caracterele * si ? pentru a indica un grup de fisiere, caz in care se va deschide cate o fereastra de editare pentru fiecare program al carui nume de fisier corespunde sablonului precizat.

Daca se omite numele de fisier, atunci se deschide o fereastra de editare text pentru un fisier avand numele initial UNTITLED.PRG. Cand se inchide fereastra de editare puteti salva fisierul cu un nume diferit.

Daca includeti ? dupa comanda, se deschide dialogul Open, care va afisa o lista cu fiserele avand extensiile: .PRG (program), .MPR (program meniu), .SPR (program ecran) si .QPR (program interogare) din care sa-l selectati pe cel dorit.

AS <expN3>

Permite translatarea autoamata a caracterelor accentuate dintr-un fisier program creat pe o alta platforma FoxPro. <expN3> reprezinta codul de pagina al platformei FoxPro pe care a fost creat fisierul repsectiv, atunci cand folositi aceasta clauza la deschiderea unui fisier program existent. Daca clauza este folosita la crearea unui nou program, atunci <expN3> va indica codul de pagina in care va fi salvat fisierul. Salvarea fisierului cu un alt cod de pagina se poate realiza si folosind dialogul Save As (File/Save As . ).

Nota Daca un program cu un alt cod de pagina are caractere ce nu pot fi reprezentate in codul de pagina curent, ele sunt convertite la cele mai apropiate caractere ale codului de pagina curent.

NOEDIT

Includerea acestei clauze asigura vizualizarea si/sau copierea programului, dar nu permite modificarea lui..

NOWAIT

De regula, aceasta clauza se utilizeaza atunci cand comanda MODIFY COMMAND este inclusa intr-un fisier program si determina continuarea executiei programului dupa ce fereastra de editare a fost deschisa. In mod normal executia programului este intrerupta dupa deschiderea ferestrei de editare texte si este reluata la inchiderea ferestrei de editare.

RANGE <expN1>, <expN2>

Aceasta clauza determina deshiderea intr-o fereastra de editare a programului indicat avand selectate un domeniu de caractere. Selectarea incepe din pozitia <expN1> (fara a include) si se termina in pozitia <expN2>. Daca <expN1> este egal cu <expN2>, nu este selectat nici un caracter, dar cursorul este plasat in pozitia <expN1>.

WINDOW <fereastra1>

Daca se include aceasta clauza, fereastra de editare va avea caracteristicile ferstrei specificate prin <fereastra1>. Nu este necesar ca fereastra specificata prin <fereastra1> sa fie activa sau vizibila ci doar sa fie definita.

IN [WINDOW] <fereastra2>

Includerea acestei clauze determina ca fereastra de editare sa se deschida in interiorul unei ferestre parinte <fereastra2> (trebuie sa fie definita, activata si vizibila) fara insa a prelua caracteristicile acesteia. O fereastra de editare activata in interiorul unei ferestre parinte nu poate fi mutata in afara acesteia, ea se va muta impreuna cu fereastra parinte.

IN SCREEN

Includerea clauzei determina plasarea explicita a ferestrei de editare in ferastra principala a sistemului FoxPro. Este o clauza implicita.

SAME

Clauza este specifica mediului FoxPro pentru Windows, fiind ignorata de mediul FoxPro pentru MS-DOS, si asigura interzicerea activarii ferestrei de editare. Daca fereastra de editare este ascunsa, atunci ea devine vizibila dar nu poate activata.

SAVE

Clauza are efect numai intr-un fisier de comenzi, fiind ignorata daca comanda este lansata din fereastra Command. Includerea acestei clauze determina pastrarea unei imagini a ferestrei de editare in fereastra principala a mediului FoxPro. In mod normal. la inchidere ferestrele de editare sunt eliminate din fereastra principala.

Crearea unui program folosind optiunea New (din meniul File)

Pentru a crea un fisier de comenzi poate fi creat si folosind optiunea New din meniul File se executa urmatoarele operatii:

Se deschide meniul File si se selecteaza optiunea New.

In caseta de dialog New se selecteaza butonul radio Program si apoi se executa clic pe butonul New.

Se introduc comenzile dorite.

Se salveaza fisierul de comenzi. Pentru aceasta se deschide meniul File si se selecteaza optiunea Save sau Save As . . Apare caseta de dialog Save As (vezi fig. 1) in care se vor executa urmatoarele operatii:

In caseta de text Save Document As: se tasteaza numele fisierului de comenzi.

In lista derulanta Drive: se selecteaza untitatea de disc in care se gaseste directorul unde se va salva fisierul.

Folosind lista Directory: se stabileste directorul in care se va salva.

Pentru ca fisierul sa fie convertit intr-un alt cod de pagina, se activeaza caseta de validare Change Code Page.

Se executa clic pe butonul Save. Daca caseta de validare Change Code Page a fost activata, atunci se va afisa dialogul Write As (vezi fig. 2) unde dupa ce din lista Destination Code Page: se alege codul de pagina dorit se va executa clic pe butonul OK.


Pentru a fi executate comenzile (instructiunile) continute intr-un program, FoxPro apeleaza la un compilatorul propriu si nu la un interpretor. Compilatorul transforma programul sursa in cod obiect. La fiecare lansare in executie a programului, sistemul executa codul obiect. Aceasta modalitate este mai rapida decat cea oferita de un interpretor (care converteste liniile programului sursa in cod masina, la fiecare lansare in executie). In urma compilarii se creaza un fisier cu acelasi nume dar avand extensia .FXP.

Lansarea in executie a unui program se efectueaza cu comanda DO. Un program sursa poate contine la randul sau comenzi DO, fiind permise cel mult 32 de asemenea includeri. Daca nu se specifica extensia fisierului in comanda DO, sistemul FoxPro cauta si executa fisiere in urmatoarea ordine: versiuni executable (.EXE), aplicatii (.APP), versiuni compilate (.FXP) si programe sursa (.PRG).

Orice modificare efectuata cu editorul de texte FoxPro asupra unui program deja compilat, determina recompilarea lui, odata cu lansarea in executie.

Fata de programele scrise in alte limbaje de programare, un program scris in FoxPro este mult mai simplu si are urmatoarele caracteristici:

Nu are comenzi de inceput/sfarsit program;

Nu are caracter terminator de comanda;

Nu este structurat pe sectiuni, parti etc.;

Nu are o parte separata pentru instructiuni neexecutabile si alta pentru instructiuni executabile;

Pe o linie se scrie o singura comanda; o comanda se poate continua pe mai multe linii;

Permite modularizarea si structurarea totala.

Tipuri de comenzi si functii FoxPro

Comenzile, functiile si variabilele de memorie (ale sistemului FoxPro) ce se folosesc in programele FoxPro pot fi clasificate conform scopului actiunii lor in urmatoarele grupe:

Comenzi si functii ce actioneaza asupra tipurilor de date - grupa contine: functii caracter (opereaza cu date de tip caracter); functii numerice (opereaza si/sau returneaza date numerice); functii pentru data si timp (genereaza si manipuleaza informatii de tip data calensaristica si timp); comenzi si functii pentru conversii de date (transforma datele dintr-un tip in altul).

Comenzi si functii ce actioneaza asupra bazei de date - grupa cuprinde: comenzi si functii pentru manipularea campurilor din tabelele ce compun baza de date; comenzi si functii pentru manipularea tabelelor bazei de date (crearea, manipularea si monitorizarea tabelelor bazei de date); comenzi si functii pentru manipularea inregistrarilor (selectarea unor inregistrari sau pozitionarea pe anumite inregistrari); comenzi si functii pentru indexarea tabelelor; comenzi si functii pentru stabilirea sau eliminarea legaturilor dintre tabelele bazei de date.

Comenzi si functii ce actioneaza asupra programului - grupa contine: comenzi si functii pentru depanare; comenzi si functii pentru lansarea, suspendarea si incheierea programelor; comenzi si functii pentru controlul fluxului programelor; functii pentru manipularea fisierelor; comenzi si functii pentru atribuirea valorilor variabilelor de memorie; comenzi si functii pentru lucru cu masive de memorie.

Comenzi si functii pentru operatii de intrare/iesire - grupa cuprinde: comenzi si functii pentru formatarea si directionarea datelor din inregistrari sau variabile de memorie, pe ecran, imprimanta sau fisiere de iesire; comenzi si functii pentru imprimarea si afisarea datelor din inregistrari sau variabile de memorie, pe ecran, imprimanta sau fisiere de iesire; comenzi si functii pentru realizarea, deazactivarea si afisarea ferestrelor definite de utilizator; comenzi si functii pentru lucru cu tastatura si mouse-ul; comenzi si functii pentru crearea de rapoarte si etichete.

Comenzi si functii pentru configurarea sistemului FoxPro - grupa contine: comenzi si functii pentru configurarea sistemului; comenzi si functii pentru evidenta si gestionarea fisierelor de pe disc.

Comenzi si functii pentru lucru in retea - grupa contine comenzile necesare utilizarii simultane a fisierelor de catre mai multi utilizatori conectati intr-o retea de calculatoare.

2. Structuri de programare

Structurile dee programare intalnite in programarea structurata si modulara se regasesc in totalitate in sistemul FoxPro.

Limbajul nu are comenzi de salt neconditionat (de tipul GOTO) dar are comenzi specifice pentru implementarea celor trei structuri fundamentale (secventiala, alternativa si repetitiva).

Structura secventiala

Structura secventiala (liniara) de program se poate realiza in FoxPro printr-un grup oarecare de comenzi. In general, o astfel de structura este data de o secventa de comenzi care nu contine structurile alternative si structurile repetitive.

Comenzi de atribuire

Initializarea unor variabile sau atribute cu valori se realizeaza cu ajutorul comenzilor de atribuire. Valoarea de initializare poate fi o constanta sau poate proveni dintr-o expresie.

De fapt, prin initializare se realizeaza declararea si definirea variabilelor. Initializarea se face cu valori de tipul corespunzator definirii variabilei respective (numeric, caracter, logic, data calendaristica). Variabila ce urmeaza a fi initializata poate fi simpla sau tablou.

Comanda STORE

Comanda STORE permite stocarea datelor in variabile de memorie sau in tablouri si are urmatoarea sintaxa:

STORE <expr> TO <lista_var_memorie> | <nume_tablou>

unde:

<expr>

Reprezinta expresia a carei valoare va fi stocata.

<lista_var_memorie>

Este lista variabilelor de memorie sau elementelor de tablou, separate prin virgule, carora li se va atribui rezultatul expresiei <expr>.

<nume_tablou>

Reprezinta numele tabloului, uni sau bidimensional, ale carui elemente vor fi initializate cu valoarea expresiei <expr>. Eventualele valori existente anterior in elementele tabloului vor fi inlocuite cu cele specificate.

Observatie Daca variabilele ce sunt initializate cu o comanda STORE sunt de tip data calendaristica si valoarea de initializare este o constanta, atunci data calendaristica trebuie inclusa intre acolade si sa respecte formatul recunoscut de sistem.

Exemple:

STORE 0 TO x1, x2, y1, y2, a(5) && Initailizeaza cu 0 variabilele

&& x1, x2, y1, y2 si al cincilea element al tabloului a

STORE 'Sir caractere' TO sir && Stocheaza caractere dintre

&& apostrofuri in variabila sir

STORE .T. TO gasit && Initializeaza cu valoarea logica

&& TRUE (.T.) variabila gasit

STORE TO d1 && In variabila d1 se stocheaza

&& data calendaristica specificata intre acolade

Comanda =

Comanda = este atat comanda de atribuire cat si comanda de evaluare. Ea are acelasi efect ca si cel al comenzii STORE, cu deosebirea ca poate initializa doar o singura variabila si nu o lista de variabile. Sintaxa comenzi este:

<var_memorie> = <expr>

sau

<nume_tablou> <expr>

Comenzi de intrare/iesire

Perifericele standard sunt: tastatura pentru intrare si monitorul pentru iesire. Daca SET PRINTER are atribuita valoarea ON, iesirea se va face atat pe ecran cat si la imprimanta. Daca SET CONSOLE este OFF si SET PRINTER este ON, atunci iesirea se va face numai la imprimanta.

Comenzile ? si ??

Cele mai utilizate comenzi pentru afisarea pe ecran sunt comenzile si , iar sintaxa loe este urmatoarea:

<expr1>

[PICTURE <expC1>] | [FUNCTION <expC2>]

[AT <expN1>]

[FONT <expC3> [, <expN2>] [STYLE <expC4> | <expr2>]]

[, <expr3>]

unde:

<expr1>, <expr2>, <expr3> .

Expresiile ale carora rezultate vor fi afisate.

PICTURE <expC1>

Clauza PICTURE permite specificarea formatului <expC1> de afisare al rezultatului expresiei. <expC1> poate contine coduri de sablon, coduri de functie sau o combinatie a acestora.

Observatii

Codurile de sablon afecteaza doar un singur caracter din formatul de afisare si anume cel de pe aceeasi pozitie cu cea a codului in sirul de caractere <expC1>, in timp ce codurile de functie afecteaza toate caracterele din formatul de afisare.

Daca in <expc1> se folosesc coduri de functie, atunci ele trebuie sa apara inaintea codurilor de sablon si sa fie precedate de caracterul @. Dupa acest caracter pot urma mai multe coduri de functie fara a fi separate de spatii. Ultimul cod functie trebuie sa fie urmat de un spatiu, daca dupa acesta urmeaza un cod de sablon.

FUNCTION <expC2>

Daca se include aceasta clauza, atunci codurile de functie nu trebuie precedate de caracterul @.

AT <expN1>

Clauza specifica numarul coloanei (<expN1>) de unde incepe afisarea rezultatului. Daca nu este precizata aceasta clauza, afisarea incepe din pozitia curenta a cursorului. Expresia numerica <expN1> poate fi o functie definita de utilizator care returneaza o valoare numerica.

FONT <expC3>

[, <expN2>]

Expresia de tip caracter <expC3> este un nume de font, iar expresia numerica <expN2> este dimensiunea fonctului. Spre exemplu, urmatoarea comanda afiseaza data sistemului cu fontul Times New Roman de dimensiune 14:

? DATE( ) FONT 'Times New Roman',14

Observatii

Daca in clauza FONT se omite dimensiunea fontului <expN2>, se va utiliza o dimensiune de 10 puncte.

Daca in comanda ? | ?? se omite clauza FONT, atunci fontul folosit este cel al ferestrei in care se afiseaza rezultatele (fereastra principala sau fereastra definita de utilizator)

Daca fontul specificat nu este disponibil, atunci acesta va fi substituit cu un font avan caracteristici similare.

Clauza FONT este ignorata in FoxPro pentru MS-DOS.

STYLE <expC4> | <expr2>

Clauza STYLE permite specificarea unui stil al fomnctului utilizat la afisarea rezultatelor. Stilurile care sunt disponibile pentru un font sunt determinate de Windows. Daca stilul de font specificat nu este disponibil, atunci Windows il substutuie cu un stil avand caracteristici similare. Stilul de font este indicat prin caracterele folosite in expresia <expC4>. Caracterele ce se pot folosi pentru a specifica stilul de font sunt:

B Bold (aldin)

I Italic (cursiv)

N Normal (normal)

O Outline (contur)

Q Opaque (opac)

S Shadow (umbrit)

Strikeout (taiat pe mijloc)

T Transparent (transparent)

U Underline (subliniat)

In expresia <expC4> puteti include mai multe caractere pentru a indica o combinatie de stiluri de fonturi. Spre exemplu, urmatoarea comanda afiseaza data sistemului in Bold Itlaic:

? DATE() STYLE 'BI'

In FoxPro pentru MS-DOS, clauza STYLE va permite sa specificati stilul de font si deimensiunea fontului pentru rezultatele transmise catre imprimanta prin comenzile ? sau ??. Expresia numerica <expr2> inclusa in clauza STYLE este transmisa celor trei proceduri, PDOBJST, PDOBJECT si PDOBJEND, din programul curent al driver-ului de imprimanta FoxPro. Aceste proceduri se folosesc pentru a determina modul de tiparire al rezultatelor transmise. Clauza STYLE este ignorata cand rezultatele sunt transmise pe desktop sau intr-o fereastra definita de utilizator.

Codurile de sablon (coduri PICTURE) ce se pot folosi in clauza PICTURE a comenzilor ? si ?? sunt urmatoarele:

Cod

Descriere

X

Permite orice caractere.

Y

Permite numai valorile logice Y, y, N si n. Converteste y si n in Y respectiv N.

Converteste literele mici in litere mari.

Afiseaza simbolul monetar specificate prin comanda SET CURRENCY. In mod prestabilit, simbolul monetar este plasat imediat inainte sau dupa camp. Totusi, simbolul monetar si locaul sau de plasare (SET CURRENCY), caracterul de separare al grupelor de cifre la partea intreaga (SET SEPARATOR) si caracterul zecimal (SET POINT) pot fi modificate folosind comenzile specificate intre paranteze.

In fata valorilor numerice se afiseaza asterscuri. Se foloseste cu simbolul dolarului pentru protectie.

Punctul specifica pozitia caracterului ce va separa partea intreaga de cea zecimala.

Virgula indica separarea cifrelor la partea intreaga.

Codurile de functie (coduri FUNCTION) ce se pot folosi in clauza FUNCTION sau PICTURE a comenzilor ? si ?? sunt urmatoarele:

Cod

Descriere

A

Permite numai caractere alfabetice

B

Specifica alinierea la dreapta a datelor numerice.

C

Indica afisarea caracterelor CR dupa o valoare numerica pozitiva pentru a specifica un credit. Poate fi folosit numai cu date numerice.

D

Specifica folosirea formatul datei calendaristice stabilit cu SET DATE.

E

Editeaza datele calendaristice ca date de tip BRITISH.

T

Elimina spatiile din fata si din spatele rezultatului <expr>.

X

Indica afisarea caracterelor DB dupa o valoare numerica negative pentru a specifica un debit. Poate fi folosit numai cu date numerice.

Z

Afiseaza spatii daca <expr> este numerica si are valoarea zero. Numai pentru date numerice.

Numerele negative sunt incluse intre paranteze. Numai pentru date de tip numeric.

Converteste caracterele alfabetice la majuscule. Numai pentru date de tip caracter.

Afiseaza datele numerice in format stiintific. Numai pentru date numerice.

Afiseaza data in format monetar. Simbolul monetar apare inainte sau dupa valoarea campului, in functie de setarea curenta SET CURRENCY. Numai pentru date numerice.

V<n>

Este un cod de functie special ce poate fi folosit in comenzile ? si ??, asigurand ca rezultatele unei expresii de tip caracter sa se extinda pe verticala, fiecare rand avand un numar limitat de caractere (<n>). Spre exemplu, comanda:

? 'Acesta este un exemplu al modului de lucru al codului V(n).' ;

FUNCTION 'V10' AT 5

Sirul de caractere se va afisa pe ecran pe 8 randuri, incepand din coloana 5 (clauza AT 5), fiecare rand avand maximum 10 caractere (vezi fig. 3)

Figura 3. Text afisat cu codul de functie V<n>.

 

Observatii

Coemnzile ? si ?? evaluaza expresiile si transmite rezultatele pe desktop in FoxPro pentru MS-DOS, fereastrei principale in FoxPro pentru Windows, unei ferestre active definite de utilizator sau imprimantei.

Daca SET PRINTER este ON, rezultatele expresiilor sunt directionate si catre imprimanta. Daca SET PRINTER este ON si SET CONSOLE este OFF, rezultatele sunt directionate doar catre imprimanta.

Comanda ? executa trecerea la un rand nou inainte evaluarea expresiilor. Rezultatele sunt afisate pe urmatoarea linie a desktop-ului, ferestrei principale FoxPro sau a ferestrei active definita de utilizator si tipareste incepand de la marginea din stanga a paginii, in afara situatiei cand printr-un cod de functie din <expC2> sau prin variabila de memorie a sistemului _ALIGNMENT se specifica altceva.

Daca sunt omise expresiile, se tipareste o linie goala.

Intre rezultatele expresiilor se lasa un spatiu, cand in comanda ? sunt incluse mai multe expresii.

Comanda ?? afiseaza rezultatele expresiilor di pozitia curenta a cursorului de pe linia curenta a desktop-ului, ferestrei principale FoxPro, ferestrei active definita de utilizator sau a imprimantei Nu se trece la linie noua inainte de transmiterea rezultatelor.

Comanda ???

Comanda ??? se utilizeaza pentru listarea rezultatelor la imprimanta si are urmatoarea sintaxa:

<expC>

unde:

<expC>

Este expresia ce va fi evaluata si tiparita.

Tiparirea se face fara a se incrementa numarul de linie sau de coloana. Comanda este utila la transmiterea codurilor de control prin codul ASCII corespunzator inclus intre acolade sau utilizarea functiei CHR() sau a secventelor Escape catre imprimanta. Spre exemplu, comanda

??? CHR(27) + '&l10'

comuta imprimanta HP LaserJet Series II in modul "peisaj" (textul este tiparit pe latura mare a hartiei). 27 este codul ASCII pentru Escape.

Comanda @ . SAY

Comanda @ . SAY se foloseste pentru a afisa o valoare pe ecran incepand din linia si coloana precizata si are urmatoarea sintaxa:

@ <linie, coloana> SAY <expr>

[FUNCTION <expC1>]

[PICTURE <expC2>]

[SIZE <expN1>, <expN2>]

[FONT <expC3>[, <expN3]]

[STYLE <expC4>]

[COLOR SCHEME <expN4> | COLOR <lista_perechi_culori>]

unde:

<linie, coloana>

<linie> si <coloana> sunt valori numerice care determina unde se vor afisa rezultatele. Pe desktop, fereastra principala FoxPro sau fereastra definita de utilizator prima linie are numarul 0. In FoxPro pentru MS-DOS, linia 0 este linia ocupata de bara de meniu a sistemului. In FoxPro pentru Windows, linia 0 este prima linie de sub bara meniului sistemului. Liniile sunt numerotate de sus in jos. Pentru imprimante, prima linie este 1, iar dimensiunea fizica a paginii si numarul de linii per pagina determina numarul maxim de linii. Prima coloana are numarul 0 pe desktop, fereastra principala FoxPro sau fereastra definita de utilizator. Coloanele sunt numerotate de la stanga spre dreapta. Pentru imprimante, prima coloana are numarul 1, iar dimensiunea fizica a paginilor determina numarul maxim de coloane.

Cand iesirea @ SAY este directionata spre o fereastra definita de utilizator, coordonatele liniei si coloanei sunt relative la fereastra definita de utilizator si nu la desktop sau fereastra principala FoxPro.

In FoxPro pentru Windows, o pozitie din fereastra principala FoxPro sau dintr-o fereastra definita de utilizator este determinata de catre fontul ferestrei principale FoxPro sau al ferestrei definite de utilizator. Majoritatea fonturilor folosite de Microsoft Windows pot fi afisate intr-o gama larga de dimensiuni si unele sunt spatiate proportional. O linie corespunde inaltimii fontului curent; o coloana corespunde latimii medii a unei litere din fontul curent. Pentru pozitionarea precisa a iesirilor in fereastra principala FoxPro sau intr-o fereastra de finita de utilizator, puteti utiliza valori fractionare pentru coordonatele liniei si coloanei in FoxPro pentru Windows. In FoxPro pentru MS-DOS valorile fractionare folosite pentru coordonatele liniilor si coloanelor sunt rotunjite la cele mai apropiate valori intregi.

<expr>

<expr> este evaluata si afisata sau tiparita incepand de la coordonatele <linie, coloana>. Poate fi si o functie definita de utilizator.

FUNCTION <expC1>

PICTURE <expC2>

Puteti include clauza FUNCTION, clauza PICTURE sau ambele clauze pentru a controla modul de afisare sau de tiparire a valorii expresiei <expr>. Modul de utilizare al acestor doua clauze este identic cu cel prezentat la comenzile ? si ?? ( vezi pag. 6).

SIZE <expN1>, <expN2>

Clauza SIZE va permite sa controlati latimea si inaltimea zonei de afisare/tiparire pentru o comanda @ SAY. In mod prestabilit, FoxPro creaza o zona cu o inaltime de o linie. Inaltimea zonei in linii este specificata de <expN1>, iar latimea in coloane este data de <expN2>. Comanda realizeaza alinierea automata in zona delimitata.

In FoxPro pentru Windows, dimensiunea reala a zonei este influentata de fontul utilizat.

Daca lipseste clauza FONT, comanda va folosi fontul ferestrei parinte (fereastra principala FoxPro sau fereastra utilizator).

FONT <expC3>[, <expN3>]

Clauza FONT se foloseste la fel ca si in cazul comenzilor ? si ??.

STYLE <expC4>

Clauza STYLE se foloseste la fel ca si in cazul comenzilor ? si ??.

COLOR SCHEME <expN4> |

COLOR <lista_perechi_culori>

Daca nu includeti o clauza COLOR, culoarea iesirii @SAY este determinata de schema de culori a desktop-ului sau a ferestrei principale FoxPro; daca iesirea @SAY este directionata catre o fereastra utilizator, culoarea este detrminata de schema de culori a ferestrei.

Iesirea @SAY este afectata numai de prima pereche de culori dintr-o schema de culori.

Culoarea iesirii @SAY poate fi specificata precizand numarul schemei de culori in clauza COLOR SCHEME sau indicand o pereche de culori in clauza COLOR.

NOTA Utilizarea culorilor este prezentata detaliat in sectiunea "Controlul culorilor in FoxPro".

Observatii

Comanda @SAY se poate folosi pentru a afisa iesiri formatate pe desktop-ul din FoxPro pentru MS-DOS, in fereastra FoxPro principala din FoxPro pentru Windows sau intr-o fereastra definita de utilizator. De asemenea, ea se poate folosi pentru a formatarea iesirea la imprimanta.

Daca utilizati generatorul de ecrane (Screen Builder) pentru a crea ecrane de introducere date, este posibili sa nu folositi comanda @SAY. Utilitarul Screen Builder genereaza automat comenzile @SAY.

Daca a fost lansata o comanda SET DEVICE TO SCREEN, iesirea comenzilor @SAY apare pe desktop, in fereastra FoxPro principala sau in fereastra activa definita de utilizator. SET DEVICE TO SCREEN este implicita la deschiderea sesiunii FoxPro. Daca lansati o comanda SET DEVICE TO PRINTER, iesirea este directionata catre imprimanta.

Comanda ACCEPT

Comanda ACCEPT permite citirea datelei de la tastatura si atribuirea ei unei variabile de memorie sau element de tablou. Sintaxa comenzii este:

ACCEPT [<expC>] TO <var_memorie>

unde:

<expC>

Expresia de tip caracter <expC> furnizeaza textul explicativ (prompt-ul) care se afiseaza langa zona in care se va introduce valoarea dorita.

<var_memorie>

Reprezinta variabila de memorie sau elementul de tablou in care se va stoca data de tip caracter introdusa de la tastatura. Daca variabila de memorie nu a fost definita anterior, atunci ea va fi creata de catre comanda ACCEPT.

Observatii

Comanda ACCEPT a fost inclusa pentru compatibilitate cu versiunile anterioare. Pentru citirea datelor se foloseste comanda @GET.

Comanda ACCEPT va permite sa introduceti date de tip caracter direct intr-o variabila de memorie sau element de tablou fara a delimita caracterele cu ghilimele.

Comanda ACCEPT nu asigura trecerea la linie noua dupa introducerea datelor (dupa apsarea tastei Enter pentru a indica terminarea valorii).

Comanda ACCEPT difera fata de comanda INPUT din doua motive si anume:

Trateaza datele introduse ca fiind de tip caracter;

Datele de tip caracter nu trebuie incluse intre ghilimele.

Daca apasati tasta Enter fara sa introduceti o data, atunci variabila de memorie sau elementul de tablou va contine sirul nul (sirul de lungime zero). Daca apasati tasta Escape atunci cand SET ESCAPE este OFF, variabila de memorie va contine sirul nul. Daca apasati tasta Escape cand SET ESCAPE este ON, se suspenda executia programului.

Comanda INPUT

Comanda INPUT se foloseste pentru a stoca intr-o variabila de memorie sau intr-un element de tablou data introdusa de la tastaura si are urmatoarea sintaxa:

INPUT [<expC>] TO <var_memorie>

unde:

<expC>

Expresia de tip caracter <expC> furnizeaza mesajul care se afiseaza pe ecran langa zona de introducere a valorii.

<var_memorie>

Reprezinta variabila de memorie sau elementul de tablou in care se va stoca data introdusa de la tastatura. Daca variabila de memorie specificata nu exista, atunci comanda INPUT o creaza.

Observatii

Comanda INPUT, ca si ACCEPT, este inclusa pentru compatibilitatea cu versiunile anteriaoare. Pentru citirea datelor se foloseste comanda @GET.

Comanda INPUT este similara comenzii ACCEPT, insa ea poate crea orice tip de variabila de memorie.

Comanda INPUT nu asigura trecerea la linie noua dupa introducerea datelor (dupa apsarea tastei Enter pentru a indica terminarea valorii).

Tipul valorii introduse de la tastatura va determina tipul variabilei de memorie sau al elementului de tablou, indiferent de tipul pe care l-au avut anterior, respectand urmatoarele reguli:

Valorile de tip sir de caractere se introduc incadrate de ghilimele;

Valorile de tip data calendaristica se introduc incluse intre acolade;

Valorile de tip logic se introduc folosind constantele logice (.T. sau .t. pentru TRUE si .F. sau .f. pentru FALSE).

Exemplu

Urmatoare secventa de instructiuni demonstreaza modul de utilizare al comenzii INPUT, asocierea tipului de data variabilelor nedefinite si schimbarea tipului de data pentru variabilele definite

CLEAR

DIMENSION vector(4) && Se declara un tablou de 4 elemente

STORE .F. TO vector && Tabloului este initializat cu valoarea FALSE

INPUT ' Nume si prenume: ' TO nume && Sir de caractere

INPUT ' Data de nastere: ' TO data && Data calendaristica

INPUT ' Studii superiaare: ' TO studii && Data logica

INPUT ' Introduceti un intreg: ' TO vector(3) && Data numerica

? nume

? YEAR(data)

? studii

? vector(3)

Executia acestei secvente de comenzi va determina afisarea pe ecran a informatiilor respective asa cum se poate vedea in fig. 4.

Nota In exemplul prezentat s-a inclus o comanda ? dupa fiecare comanda INPUT, deoarece atat comanda INPUT cat si comanda ACCEPT nu asigura trecerea la linie noua la terminarea introducerii (dupa ce se apasa tasta Enter).

Figura 4. Rezultatele rularii exemplului prezentat.

 


Comanda @Get

Comada @GET se foloseste pentru a crea o zona de editare a unei variabile de memorie, element al unui tablou sau camp al unei tabele si are urmatoarea sintaxa:

@ <linie, coloana> GET <var_mem> | <camp>

[FUNCTION <expC1>]

[PICTURE <expC2>]

[FONT <expC3>[, <expN1>]]

[STYLE <expC4>]

[DEFAULT <expr1>]

[ENABLE DISABLE

[MESSAGE <expC5>]

[[OPEN WINDOW < nume_ferastra>]

[RANGE [<expr2>] [, <expr3>]]

[SIZE <expN2>, <expN3>]

[VALID <expL1> | <expN4> [ERROR <expC6>]]

[WHEN <expL2>]

[COLOR SCHEME <expN5> | COLOR <lista_perechi_culori>]

unde:

<linie, coloana>

Reprezinta coordonatele punctului de unde incepe zona de edtiare @GET (au aceleasi semnificatii ca si la comanda @SAY).

<var_mem> | <camp>

Indica variabila de memorie sau elementul de tablou (<var_mem>), respectiv campul (<camp>) pentru care se creaza zona de editare.

Comanda se poate folosi si la crearea zonei de editare a unui camp Memo, dar pentru acest tip de camp cea mai buna solutie este utilizarea comenzii @EDIT.

FUNCTION <expC1> |

PICTURE <expC2>

In comanda @GET, puteti include clauza FUNCTION, clauza PICTURE sau ambele clauze pentru a crea o masca de editare. Aceste clauze contin coduri speciale care controleaza modul de afisare si editare al variabilei de memorie, al elementului de tablou sau al campului.

Codurile de functie pot fi incluse in clauza PICTURE, caz in care clauza trebuie sa inceapa cu caracterul @.

O clauza PICTURE poate sa contina coduri de functie, coduri de sablon sau ambele tipuri de coduri.

Deoarece o clauza FUNCTION afecteaza intreaga expresie, aceasta poate contine doar coduri de functie.

Deoarece codurile de sablon sunt identice cu cele prezentate la comenzile ? si ??, in continuare sunt prezentate numai codurile de functie.

Codurile de functie permise in comanda @GET sunt:

A Permite numai caractere alfabetice (fara spatii sau simboluri).

B Datele numerice sunt aliniate la stanga in campul de iesire.

D Pentru datele calendaristice se foloseste formatul stabilit prin SET DATE.

E Datele calendaristice sunt editate ca date in format BRITISH.

I Centreaza textul in campul de iesire.

J Textul este aliniat la dreapta in campul de iesire.

K Selecteaza intregul camp atunci cand cursorul este mutat in campul respectiv.

L Se foloseste numai pentru datele numerice. Afiseaza zerouri in locul spatiilor din fata numarului.

M<list> Creaza o lista prestabilita cu mai multe optiuni. Lista este o colectie de elemente, separate prin virgule (elementele listei sunt numai de tip caracter si nu pot contine virgula). Daca <var_mem> sau <camp> nu este initializata cu un element al listei cand este lansata comanda READ, atunci este afisat primul element din lista.

Pentru a derula lista in vederea selectarii unui element se apasa bara de spatiu.

Pentru a selecta un element si a trece la urmatorul control se apasa tasta Enter.

R Afiseaza o masca in zona de editare. Caracterele mastii nu sunt stocate in camp atunci cand iesiti din zona de editare. Se poate utiliza numai pentru date de tip caracter sau numeric.

S<n> Limiteaza afisarea la n caractere. Derularea caracterelor se va face folosind tastele sageata. Numai pentru date de tip caracter.

T Elimina spatiile suplimentare din fata si din spate.

Z Afiseaza spatiu daca data numerica introdusa este 0. Numai pentru date numerice.

Converteste literele in majuscule. Numai pentru date de tip caracter.

Afiseaza datele numerice in format stiintific. Numai pentru date numerice.

Afiseaza simbolul monetar. Daca SET CURRENCY este LEFT, atunci codul de functie $ nu poate fi folosit. Numai pentru date numerice.

FONT <expC3>[, <expN1>]

Clauza FONT are aceeasi utilizare ca si in cazul comenzilor ? si ??.

STYLE <expC4>

Clauza STYLE are aceeasi utilizare ca si in cazul comenzilor ? si ??.

DEFAULT <expr1>

Daca pentru zona de editare se specifica o variabila de memorie care nu exista, atunci ea este creata si initializata automat atunci cand in comanda este prezenta clauza DEFAULT.

Daca intr-o comanda @GET avand clauza DEFAULT specificati un element de tablou acesta nu este creat.

Clauza DEFAULT este ignorata daca variabila deja exista sau specificati numele unui camp din tabela curent deschisa.

NOTA Daca nu este inclusa clauza DEFAULT si variabila <var_mem> nu exista, atunci se afiseaza mesajul 'Variable not found' (Variabila nu a fost gasita).

Expresia <expr1> din clauza DEFAULT determina tipul variabilei de memorie ce se va crea si valoarea ei initiala.

ENABLE DISABLE

Clauza DISABLE interzice accesul la zona de editare creata cu comanda @GET. Zona de editare este afisata in culorile de ianctivare si nu poate fi selectata.

In mod prestabilit, zonele de editare @GET sunt accesibile. Puteti include clauza ENABLE ca un indiciu ca programul contine o zona de editare care poate fi accesata.

ATENTIE Daca toate zonele de editare dintr-o fereastra definita de utilizator sun inaccesibile, atunci fereastra nu va ramane deasupra in stiva de ferestre. Daca toate zonele de editare din comanda READ curenta sunt inaccesibile, atunci comanda READ se termina

MESSAGE <expC5>

Expresia de tip caracter <expC5> a clauzei MESSAGE este afisata atunci cand este selectata zona de editare @GET.

In FoxPro pentru MS-DOS mesajul este centrat pe ultima linie a desktop-ului si anuleaza temporar orice expresie stabilita cu comanda SET MESSAGE.

In FoxPro pentru Windows, mesajul este plasat in bara de stare a ferestrei mediului FoxPro. Daca bara de stare a fost ascunsa prin comanda SET STATUS BAR OFF, mesajul este afisat pe ultima linie a ferestrei principale FoxPro.

OPEN WINDOW

<nume_fereastra>

Clauza WINDOW se foloseste pentru a edita un camp de tip Memo intr-o fereastra definita de utilizator. Fereastra definita de utilizator trebuie sa fie mai intai creata cu comanda DEFINE WINDOW. O metoda mult mai buna pentru editarea campurilor de tip Memo este utilizarea comenzii @EDIT.

Clauza este inclusa pentru compatibilitatea cu versiunile anterioeare.

RANGE [<expr2>]

[, <expr3>]

Clauza RANGE se poate folosi pentru datele de tip caracter, numeric sau data calendaristica pentru a specifica domeniul valorilor acceptabile.

Daca valoarea introdusa in zona de editare nu se incadreaza in intervalul de valori indicat, se afiseaza un mesaj care prezinta intervalul corect.

Limita inferioara a intervalului este specificata prin expresia <expr2>, iar limita superioara cu <expr3>.

Ambele expresii trebuie sa fie expresii de tip caracter, numeric sau data calendaristica care sa corespunda datei din variabila de memorie, din elementul de tablou sau din camp.

Oricare din cele doua expresii poate fi omisa, dar nu ambele.

Daca una dintre limite este omisa, data introdusa este verificata numai pentru limita respectiva.

NOTA Verificarea incadrari in intervalul specificat nu se face daca se apasa tasta Enter fara a se schimba valoarea variabilei de memorie, elementului de tablou sau campului.

SIZE <expN2>, <expN3>

Clauza SIZE are aceeasi utilizare ca si in cazul comenzii @SAY.

VALID <expL1> | <expN4>

Clauza VALID permite validarea introducerii. Cand se incearca iesirea din zona de editare, este evaluata expresia clauzai VALID.

Ca expresie a clauzei VALID se poate utiliza o functie definita de utilizator, care simplifica operatia de validare a datelor. Functia definita de utilizator trebuie sa returneze o valoare logica sau numerica.

NOTA Spre deosebire de clauza RANGE, care face verificarea numai daca s-a schimbat valoarea variabilei de memorie, elementului de tablou sau campului, clauza VALID executa verificarea intotdeauna la iesirea din zona de editare in afara cazului cand se apasa tasta Escape.

Daca in clauza VALID se foloseste expresia logica <expL1> si este evaluata la o valoare logica adevarat (.T.), introducerea este considerata corect si se iese din zona de editare. Daca rezultatul evaluarii este o valoare logica fals (.F.), valoarea introdusa este considerata incorecat si un mesaj este afisat pentru a indica reintroducerea valorii dupa apasarea tastei Spatiu. Daca se foloseste o functie definita de utilizator si ea returneaza .F., atunci se produce inlocuirea campului dar la la revenirea din functie se restaureaza valoarea anterioara a campului.

Clauza VALID care include o expresie numerica, <expN4>, se foloseste pentru a specifica ce obiect se va selecta supa isirea din zona de editare. Obiectele sunt campuri de introducere @GET, casete de validare, liste, liste derulante, casete de modificare valorica, zone de editare text si fiecare duton dintr-un set de butoane de comanda, radio sau invizibile. Expresia numerica <expN4> are una din urmatoarele trei efecte:

o        Cand <expN4> este 0, cursorul ramane in zona de editare. Efectele clauzelor MESSAGE <expC5> si ERROR <expC6> sunt suprimate. messages are suppressed.

o        Cand <expN4> este pozitiv, specifica numarul de obiecte peste care se va sari dupa iesirea din zona de editare. Daca <expN4> este mai mare decat numarul obiectelor ramase, comanda READ este terminata (in afara cazului cand se foloseste comanda READ CYCLE pentru a reactiva obiectele).

o        Cand <expN4> este negativ, specifica numarul de obiecte peste care se va sari inapoi. Daca <expN4> muta peste primul obiect, comanda READ este terminata (in afara cazului cand se foloseste comanda READ CYCLE pentru a reactiva obiectele).

ERROR <expC6>

Clauza ERROR <expC6> va permite sa specificati un mesaj de eroare propriu care va fia afisat atunci cand clauza VALID este evaluata la valoare fals (.F.). <expC6> se va afisa in locul mesajului de eroare prestabilit.

WHEN <expL2>

Clauza WHEN permite sau interzice accesul la zona de editare pe baza valorii <expL2>, care trebuie sa fie adevarata (.T.) inainte de a putea accesa zona de editare. Daca este specificata clauza WHEN si <expL2> este falsa (.F.), zona de editare nu poate fi accesata si este activat obiectul urmator.

COLOR SCHEME <expN5> | COLOR

<lista_perechi_culori>

Daca nu include o clauza COLOR, culorile zonei de editare sunt determinate de schema culorilor pentru desktop, ferestra principala FoxPro sau fereastra definita de utilizator.

Culoarea zonei de editare este afectata de a doua pereche de culori dintr-o schema de culori sau de catre perechea de culori precizata.

Culoarea zonei de editare poate fi specificata prin precizarea numarului schemei de culori in clauza COLOR SCHEME sau printr-un set al perechilor de culori din clauza COLOR.

NOTA Utilizarea culorilor este prezentata detaliat in sectiunea "Controlul culorilor in FoxPro".

Observatii

Comanda @GET permite crearea unei zone de editare a continutului unei variabile de memorie, element de tablou sau camp. Activarea zonelor de editare se realizeaza folosind o comanda READ sau READ CYCLE.

Comenzile @SAY si @GET pot fi combinate pentru a forma o singura comanda, avand un singur set de coordoante <linie, coloana>, care specifica de unde incepe iesirea @SAY output begins. Intre iesirea @SAY si inceputul zonei de editare @GET se lasa automat un spatiu. In FoxPro pentru Windows, zonele de editare @GET sunt inconjurate de o bordura neagra daca in comanda READ se include clauza BORDER.

Exemplu

Urmatoarea seceventa de instructiuni creaza o zona de editare continand o lista prestabilita de optiuni:

CLEAR

opt = SPACE(8)

@ 3, 5 SAY 'Alegeti culoarea preferata: ' GET opt ;

FUNCTION 'M Rosu, Albastru, Verde, Galben, Alb'

READ

@ 5, 5 SAY 'Culoarea preferata este: ' + opt

Comanda READ

Obiectele create cu comanda @GET sau zona de editare realizata cu comanda @EDIT pot fi activate prin intermediul comenzilor READ.

Obiectele care pot fi create prinn comanda @GET pot fi campuri de intrare, zone de editare texte, butoane de comanda, butoane radio, casete de validare, casete de modificare valorica (spinner), liste si liste derulante.

Sintaxa comenzii READ este urmatoarea:

READ

[CYCLE

[ACTIVATE <expL1>]

[DEACTIVATE <expL2>]

[MODAL

[WITH <lista_ferestre>]

[SHOW <expL3>]

[VALID <expL4 | expN1>]

[WHEN <expL5>]

[OBJECT <expN2>]

[TIMEOUT <expN3>]

[SAVE

[NOMOUSE

[LOCK NOLOCK

unde:

CYCLE

Includerea clauzei CYCLE determina neterminarea comenzii READ atunci cand cursorul depaseste primul sau ultimul obiect @GET.

Daca cursorul se afla pe ultimul obiect si se apasa tasta Tab, Enter sau sageata jos, atunci cursorul se repozitioneaza pe primul obiect.

Daca cursorul se gaseste pe primul obiect si se apasa tasta sageata sus sau se foloseste combinatia Shift + Tab, cursorul se muta pe ultimul obiect.

Terminarea comenzii READ care are inclusa clauza CYCLE se face folosind comanda CLEAR READ, tasta Escape sau CTRL+W.

ACTIVATE <expL1>

Clauza se executa atunci cand se lanseaza comanda READ sau cand se schimba fereastra curenta. Clauza ACTIVATE poate fi privita ca o clauza WHEN la nivel de fereastra.

In mod obisnuit, expresia logica <expL1> este o functie definita de utilizator, cu ajutorul careia se pot inactiva obiectele @GET din alte ferestre, ascunde ferestrele, afisa un mesaj etc.

DEACTIVATE <expL2>

Aceasta clauza se executa atunci cand se inceraca activarea altei ferestre. Clauza DEACTIVATE poate fi privita ca o clauza VALID la nivel de fereastra.

De regula, expresia logica <expL2> este o functie definita de utilizator prin intermediul careia se poate realiza validarea continutului campurilor din fereastra inainte de a trece la o alta fereastra. Daca functia utilizator returneaza valoarea fals (.F.) comanda READ nu se termina, iar daca returneaza adevarat (.T.), executia comenzii READ se termina.

MODAL

Includerea cuvantului cheie MODAL in comanda READ previne activarea celorlalte ferestre cu exceptia celor implicate in executarea comemzii READ.

WITH <lista_ferestre>

In mod prestabilit, toate ferestrele interactive (ferestrele Browse, accesorii desk si ferestre deschise cu comenzile MODIFY FILE, MODIFY REPORT) pot fi incluse intr-o comanda READ. Clauza WITH restrictioneaza ferestrele care participa in comanda READ; doar cele din <lista_ferestre>.

Includerea clauzei WITH creaza automat un READ MODAL.

Pentru a face accesibila o fereastra Browse se include in <lista_ferestre> titlul ferestrei (de regula, sinonimul tabelei).

SHOW <expL3>

Clauza SHOW se executa atunci cand este lansata o comanda SHOW GETS.

De regula <expL3> este o functie definita de utilizator, care poate fi folosita pentru a reimprospata obiectele @SAY sau pentru a activa/inactiva diferite obiecte. Valoarea returnata de functie este ignorata.

VALID <expL4> | <expN1>

Clauza VALID este evaluata atunci cand se incearca parasirea comenzii READ curente.

Clauza VALID poate specifica o expresie numerica sau logica sau o functie definita de utilizator care returneaza o valoare numerica sau logica.

Comanda READ este terminata daca <expL4> returneaza adevarat (.T.).

Daca <expL4> este evaluata la valoarea logica fals (.F.), obiectul curent ramane activ daca este posibil. Daca obiectul nu poate ramane activ (rutina VALID a dezactivat obiectul), cursorul se muta pe primul obiect.

Daca VALID returneaza un numar, cursorul se muta pe obiectul corespunzator (daca acest obiect nu exista comanda READ se termina).

O clauza VALID ce returneaza o valoare care nu este de tip logic sau numeric are acelasi efect ca si cea ce returneaza valoarea logica adevarat (.T.).

WHEN <expL5>

Clauza WHEN determina daca se executa sau nu comanda READ.

Daca <expL5> furnizeaza valoarea adevarat (.T.) cand este lansata comanda READ, atunci comanda se executa.

Comanda READ este ignorata daca <expL5> furnizeaza valoarea fals (.F.) si executia programului continua cu prima comanda ce urmeaza dupa READ.

OBJECT <expN2>

Clauza OBJECT permite sa se specifice, prin <expN2>, numarul obiectului care va fi initial selectat atunci cand este lansata in executie comanda READ.

Numerele obiectele sunt determinate de ordinea in care ele au fost create.

TIMEOUT <expN3>

Clauza TIMEOUT stabileste durata, in secunde, care se poate scurge fara ca utilizatorul sa introduca o valoare. Dupa scurgerea timpului, comanda READ se termina.

Daca comanda READ se termina datorita clauzei TIMEOUT, atunci orice modificari incepute intr-un camp sunt pierdute. Modificarile din celalte campuri sunt salvate.

SAVE

Cuvantul cheie SAVE folosit intr-o comanda READ determina salvarea obiectelor definite (in mod prestabilit obiectele se sterg la terminarea comenzii READ). Obiectele salvate pot fi parcurse cu un nou READ fara a mai fi nevoie redefinirea lor.

NOMOUSE

Includerea cuvantului cheie NOMOUSE in comanda READ interzice selectarea obiectelor cu mouse-ul. Deplasare de pe un obiect pe altul se va face numai cu tastatura. Mouse-ul se va putea folosi in interiorul campului pentru decupare, copiere, lipire si pozitionare cursor.

LOCK NOLOCK

Cuvintele cheie LOCK si NOLOCK se folosesc pentru a specfifica daca inregistrarile ale caror campuri sunt continute in obiectele prelucrate de comanda READ sunt sau nu blocate. Utilizarea acestor cuvinte cheie are sens numai in cazul lucrului in retea.

Observatii

Comanda READ are rolul de a activa toate obiectele (campurile GET, casetele de validare, casetele de modificare valorica, butoanele de comand, butoanele radio, listele, listele derulante) definite dupa ultima comanda READ sau CLEAR GETS care a fost executata.

Utilizatorul poate iesi din comanda READ folosind unul din urmatoarele procedee:

o        Mutand cursorul peste ultimul obiect sau inapoi peste primul obiect (daca nu este inclusa clauza CYCLE in comanda READ)

o        Apasand Escape, Ctrl+W sau alegand un control definit pentru terminarea comenzii READ.

O comanda READ poate manipula obiecte care se gasesc in ferestre diferite. Cand deplasati cursorul dintr-un obiect in altul, obiectele sunt parcurse in ordinea in care au fost create, indiferent de fereastra in care sunt plasate. Daca mutati cursorul pe un obiect, fereastra ce contine acel obiect devine fereastra activa. Daca apasati Tab, Enter sau sageata jos atunci cand cursorul este pe ultimul obiect al unei ferestre, cursorul se va pozitiona pe primul obiect din fereastra urmatoare. Cand sunteti pe primul obiect al unei ferestre si apastai Shift+Tab sau sageata sus, cursorul este pozitionat pe ultimul obiect al ferestrei anterioare.

Comenzile READ pot fi incluse una in alta, adica o rutina a unei comenzi READ apeleaza o alta comanda READ. Numarul maxim de nivele de includere este 5.

Ordinea in care se executa evenimentele si clauzele comenzii READ atunci cand este lansata pentru prima data este:

Se executa clauza WHEN a nivelului READ

Se activeaza prima fereastra ce contine obiecte GET

Se executa clauza ACTIVATE a nivelului READ

Se executa clauza SHOW a nivelului READ

Se executa clauza WHEN a nivelului GET al primului obiect GET

Ordinea de executie a clauzelor comenzii READ atunci cand este activata o noua fereastra este:

Se executa clauza VALID a campului care este parasit

Este dezactivata fereatra campului care a fost parasit

Se activeaza fereastra ce contine noul camp GET

Se executa clauza DEACTIVATE a nivelului READ pentru fereastra ce se dezactiveaza

Se executa clauza ACTIVATE a nivelului READ pentru fereastra care se activeaza

Se executa clauza WHEN pentru noul camp.

Structuri alternative

Limbajul FoxPro implementeaza ambele forme de structura alternativa: structura de decizie (comanda IF) si structura de selectie multipla (comanda DO CASE).

Comanda IFENDIF

Structura de decizie, a carei schema logica este prezentata in figura 5, poate fi codificata folosind comanda IFENDIF. Comanda IFENDIF permite executarea unui set de comenzi, din doua seturi posibile, pe baza rezultatului unei expresi logice. Sintaxa comenzii este urmatoarea:


Observatii

Modul de executie al acestei comenzi este urmatorul:

o        Se evalueaza expresia logica <expL>.

o        Daca rezultatul expresiei este adevarat (.T.), se executa comenzile dintre IF si ELSE sau ENDIF (care este intalnit primul). In schema logica aceste comenzi sunt reprezentate prin blocul Secventa1.

o        Daca rezultatul expresiei este fals (.F.) si daca este prezenta clauza ELSE, se executa toate comenzile dintre ELSE si ENDIF. In schema logica aceste comenzi sunt reprezentate prin blocul Secventa2. Daca rezultatul este fals (.F.) si nu exista clauza ELSE, nu se executa nimic.

o        Dupa executarea uneia dintre cele doua ramuri, controlul programului este preluat de comanda ce urmeaza dupa ENDIF.

Printre comenzile ce compun <secventa1> si/sau <secventa2> pot exista comenzi IFENDIF.

Pe aceeasi linie cu IF si ENDIF pot fi plasate comentarii precedate de caracterele &&. Comentariile sunt ignorate la compilare si executie.

Daca <secventa1> nu contine nici o comanda (ramura vida), este indicat sa se aplice operatorul logic NOT rezultatului expresiei <expL> (negarea conditiei), pentru ca ramura vida sa corespunda clauzei optionale ELSE.

Exemplu Urmatorul program determina valoarea maxima dintre doua numere introduse de la tastatura:

CLEAR

@ 2, 5 SAY 'Valoarea lui a:' GET a DEFAULT 0 PICTURE '999'

@ 3, 5 SAY 'Valoarea lui b:' GET b DEFAULT 0 PICTURE '999'

READ

IF a > b

m = a

ELSE

m = b

ENDIF

@ 5, 5 SAY 'Valoarea maxima este: ' + STR(m, 3)

Functia IIF

Daca ambele ramuri ale unei structuri de decizie, <secventa1> si <secventa2>, sunt expresii simple de tip caracter, data calendaristica, logic sau numeric, in locul comenzii IFENDIF se poate utiliza functia IIF (numita si IF imediat), a carei sintaxa este:

IIF(<expL>, <expr1>, <expr2>)

unde:

<expL>

Rezultatul expresia logice <expL> determina care din cele doua expresii, <expr1> si <expr2>, va furniza rezultatul functiei IIF.

<expr1>, <expr2>

Daca rezultatul expresiei logice <expL> este adevarat (.T.), rezultatul functie este dat de evaluarea expresiei <expr1>.

Daca rezultatul expresiei logice <expL> este fals (.F.), rezultatul functie este dat de evaluarea expresiei <expr2>.

Observatii

Principiul de executie este urmatorul:

o        Se evalueaza expresia <expL>.

o        Daca rezultatul evaluarii expresiei logice <expL> este adevarat (.T.), functia returneaza rezultatul evaluarii expresiei <expr1>.

o        Daca rezultatul evaluarii expresiei logice <expL> este fals (.F.), functia returneaza rezultatul evaluarii expresiei <expr2>.

Tinand cont de faptul ca FoxPro permite ca pe timpul executiei unui program sa se modifice tipul unei variabile de memorie, nu este obligatoriu ca cele doua expresii, <expr1> si <expr2>, sa fie de acelasi tip.

Ori de cate ori este posibil ca o comanda IFENDIF sa fie inlocuita printr-o functie IIF() este indicat sa se faca acest lucru deoarece functia IIF() se executa mult mai rapid decat comanda IFENDIF echivalenta.

Exemplu Prin folosirea functiei IIF() programul prezentat anterior poate fi simplificat:

CLEAR

@ 2, 5 SAY 'Valoarea lui a:' GET a DEFAULT 0 PICTURE '999'

@ 3, 5 SAY 'Valoarea lui b:' GET b DEFAULT 0 PICTURE '999'

READ

m = IIF(a > b, a, b)

@ 5, 5 SAY 'Valoarea maxima este: ' + STR(m, 3)

Structura de selectie multipla

De foarte multe ori in programe este necesar ca pe baza unei conditii sa se poata alege o cale de urmat din mai multe cai posibile. Acest lucru se poate rezolva prin folosirea unor comenzi IFENDIF incluse una in alta sau, mai simplu, prin utilizarea comenzii de selectie multipla DO CASE. In figura 6 este prezentata schema logica a unei structuri de selectie multipla. Sintaxa comenzii DO CASE este urmatoarea:


Observatii

Modul de executie al comenzii DO CASE este urmatorul:

o        Se evalueaza <expL1>.

o        Daca rezultatul este adevarat (.T.) sunt executate instructiunile ce urmeaza pana la intalinirea unrmatoarei clauze CASE sau pana la intalnirea cuvantului cheie ENDCASE (care este intalnit primul) , dupa care se preda controlul primei comenzi ce urmeaza dupa ENDCASE.

o        Daca rezultatul este fals (.F.), se trece la evaluarea expresiei logice <expL2>. Acest proces continua pana cand se intalneste o expresie logica a carei valoare este adevarat (.T.).

o        Daca nici una din expresiile logice din clauzele CASE nu furnizeaza valoarea adevarat (.T.), se executa secventa de comenzi asociata clauzei OTHERWISE, daca exista. Daca nu exista clauza OTHERWISE, nu se executa nimic si controlul este preluat de comanda ce urmeaza dupa DO CASE.

Pe aceeasi linie cu DO CASE si ENDCASE pot fi plasate comentarii precedate de caracterele &&. Comentariile sunt ignorate la compilare si executie.

Comanda DO CASE este indicat sa se foloseasca ori de cate ori este necesara selectarea unei alternative din mai mult de 2 alternative posibile.

Exemplu Urmatoarea secventa de comenzi solicita introducerea unui numar si in functie de valoarea tastata se executa extragerea radicalului (pentru o valoare pozitiva), majorarea cu 7 (pentru o valoare nula) sau ridicarea la patrat (pentru o valoare negativa).

CLEAR

@ 2, 5 SAY 'Introduceti un numar:' GET a DEFAULT 0 PICTURE '999'

READ

DO CASE

CASE a > 0 && Valoare pozitiva

m = SQRT(a)

CASE a = 0 && Valoare nula

m = a + 7

OTHERWISE && Valoare negativa

m = a * a

ENDCASE

@ 3, 5 SAY 'a = ' + STR(a, 3) + ' m = ' + STR(m, 5.2)

Folosind comenzile IFENDIF in locul comenzii DO CASE, secventa de comenzi anterioara ar arata astfel:

CLEAR

@ 2, 5 SAY 'Introduceti un numar:' GET a DEFAULT 0 PICTURE '999'

READ

IF a > 0 && Valoare pozitiva

m = SQRT(a)

ELSE

IF a = 0 && Valoare nula

m = a + 7

ELSE && Valoare negativa

m = a * a

ENDIF

ENDIF

@ 3, 5 SAY 'a = ' + STR(a, 3) + ' m = ' + STR(m, 5.2)

Structuri repetitive

FoxPro dispune de comenzi care asigura codificarea a doua dintre cele trei structuri repetitive, si anume:

Comanda DO WHILE pentru structura repetitiva conditionata anterior;

Comanda FOR pentru structura repetitiva cu contor.

Structura repetitiva conditionata posterior, pentru care nu exista comanda in FoxPro, poate fi simulata prin utilizarea comenzilor existente.

In plus, FoxPro pune la dispozitia programatorilor o instructiune repetitiva specifica, implementata prin comanda SCAN, care permite sa se parcurga, in mod conditionat, o tabela de la inceput pana la sfarsit.

Comanda DO WHILE

Comanda DO WHILE se foloseste pentru a implementa o structura repetitiva cu test initial (sau conditionata anterior). Schema logica a unei structuri repetitive cu test initial este prezentata in figura 7. Sintaxa comenzii DO WHILE este urmatoarea:


unde:

<expL>

Valoarea expresiei logice <expL> determina daca secventa de comenzi dintre DO WHILE si ENDDO se va executa sau nu. Daca valoarea expresiei <expL> este adevarata (.T.), se executa corpul ciclului. Daca valoarea expresiei <expL> este falsa (.F.), controlul este predat comenzii ce urmeaza dupa ENDDO.

<comenzi>

Reprezinta setul de comenzi FoxPro ce formeaza corpul ciclului DO WHILE.

LOOP

Cuvantul cheie LOOP poate fi plasat oriunde intre DO WHILE si ENDDO si se foloseste pentru a comanda reluarea ciclului fara a se mai executa comenzile ce se gasesc intre LOOP si ENDDO..

EXIT

Cuvantul cheie EXIT poate fi plasat oriunde intre DO WHILE si ENDDO si se foloseste pentru a forta iesirea din ciclu.

Observatii

Comenzile care formeaza corpul ciclului se executa atata timp cat valoarea expresiei logice <expL> este adevarata (.T.).

Daca de la inceput valoarea expresiei <expL> este fals (.F.), corpul ciclului nu se executa.

Corpul ciclului trebuie sa contina comenzi care sa determine modificarea valorii expresiei <expL> astfel ca ea sa devina fals (.F.) pentru a se incheia ciclarea sau sa exite o comanda EXIT pentru a forta iesirea din ciclu. In caz contrar, se obtine un ciclu infinit, ceea ce va duce la blocarea sistemului.

In corpul ciclului pot exista si comenzi DO WHILE.

Daca se folosesc comenzile EXIT si LOOP, ele trebuie incluse intr-o structura alternativa, de regula o comanda IFENDIF, in caz contrar comenzile dintre ele si ENDDO nu se vor executa niciodata.

Pe aceeasi linie cu DO WHILE si ENDDO pot fi plasate comentarii precedate de caracterele &&. Comentariile sunt ignorate la compilare si executie.

Exemplu Sa consideram ca exista o tabela CATALOG.DBF care are structura:

Nume camp

Tip

Lungime

Zecimale

Nume

C

Prenume

C

DataNast

D

Clasa

C

Romana

N

Matematica

N

Fizica

N

Chimie

N

Urmatorul program afiseaza numele, prenumele si media. Daca elevul are cel putin o nota sub, 5 se va afisa Restantier in locul mediei.

CLEAR

USE catalog.dbf && Deschide tabela CATALOG.DBF

linie = 2 && Controleaza linia de afisare

DO WHILE NOT EOF()    && Corpul ciclului se executa cat timp

&& nu a fost atins sfarsitul de fisier.

IF (Romana < 5) OR (Matematica < 5) OR (Fizica < 5) OR (Chimie < 5)

medie = 0

ELSE

medie = (Romana + Matematica + FizicA + Chimie) / 4

ENDIF

@ linie, 5 SAY TRIM(Nume) + ' ' + TRIM(Prenume)

IF medie > 0

@ linie, 37 SAY STR(medie, 5, 2) PICTURE '@Z 99.99'

ELSE

@ linie, 37 SAY 'Restantier'

ENDIF

SKIP && Muta indicatorul de inregistrari pe urmatoarea inregistrare

linie = linie + 1

ENDDO

USE && Inchide tabela din zona de lucru curenta

Comanda FOR

Implementarea unu ciclu cu contor se realizeaza folosind comanda FOR. Schema logica a comenzii este prezentata in figura 8. Sintaxa comenzii FOR este:


unde:

<var_mem>

Este o variabila de memorie sau un element de tablou care actioneaza ca un contor. Nu este obligatoriu ca variabila de memorie <mem_var> sa fie definita inainte de a o folosi drept contor. De regula este denumita variabila de control a ciclului.

<expN1> TO <expN2>

<expN1> este expresia care furnizeaza valoarea initiala a contorului, iar <expN2> este expresia care furnizeaza valoarea finala a contorului.

STEP <expN3>

<expN3> este expresia care furnizeaza valoarea cu care este incrementat sau decrementat contorul dupa fiecare executie a corpului ciclului. Daca <expN3> este negativ, contorul se decrementeaza. Daca lipseste clauza STEP, contorul este incrementat cu 1.

<comenzi>

Reprezinta corpul ciclului, adica comenzile ce se vor executa repetat de un numar fix de ori.

EXIT

Forteaza iesirea din ciclu. Comanda EXIT poate fi plasata oriunde intre FOR si ENDFOR.

LOOP

Comanda LOOP poate fi plasata oriunde intre FOR si ENDFOR. Se poate include pentru a relua xiclul fara a se mai executa comenzile dintre LOOP si ENDFOR; contotul este incrementat sau decrementat ca si cum s-ar fi intalnit cuvantul cheie ENDFOR.

Observatii

Modul de executie al comenzii FOR este urmatorul:

Se evalueaza expresiile <expN1> (valoarea initiala a contorului), <expN2> (valoarea finala a contorului) si <expN3> (valoarea de incrementare sau decrementare sau pasul, asa cum mai este denumita aceasta valoare). Rezultatul expresiei <expN1> este atribuit contorului <var_mem>.

Valoarea contorului este comparata cu rezultatul expresiei <expN2>. Daca valoarea curenta a contorului nu este mai mare ca valoarea finala se trece la pasul urmator, in caz contrar se termina ciclul.

Se executa comenzile ce formeaza corpul ciclului (<comenzi>).

Se incrementeaza sau se decrementeaza variabila de control a ciclului cu valoarea furnizata de expresia <expN3> daca exista clauza STEP sau se incrementeaza cu 1 daca lipseste clauza.

Se reia executia operatiilor de la pasul 2

Expresiile <expN1>, <expN2> si <expN3> sunt evaluate o singura data, la intrarea in cliclul FOR. Totusi, modificarea in interiorul ciclului a valorii contorului, <var_mem>, va afecta numarul de repatari ale ciclului.

Daca valoarea lui <expN3> si valoarea initiala <expN1> este mai mare decat valoarea finala <expN2>, contorul va fi decrementat dupa fiecare executie a corpului ciclului.

Pe aceeasi linie cu FOR si ENDFOR pot fi plasate comentarii precedate de caracterele &&. Comentariile sunt ignorate la compilare si executie.

Daca se folosesc comenzile EXIT si LOOP, ele trebuie incluse intr-o structura alternativa, de regula o comanda IFENDIF, in caz contrar comenzile dintre ele si ENDFOR nu se vor executa niciodata.

Exemplu Programul anterior poate fi rescris folosind o comanda FOR in locul comenzii DO WHILE:

CLEAR

USE catalog.dbf

nr = RECCOUNT() && Numarul de inregistrari din tabela CATALOG.DBF

linie = 2

FOR i = 1 TO nr    && Pasul de incrementare este 1

IF (Romana < 5) OR (Matematica < 5) OR (Fizica < 5) OR (Chimie < 5)

medie = 0

ELSE

medie = (Romana + Matematica + FizicA + Chimie) / 4

ENDIF

@ linie, 5 SAY TRIM(Nume) + ' ' + TRIM(Prenume)

IF medie > 0

@ linie, 37 SAY STR(medie, 5, 2) PICTURE '@Z 99.99'

ELSE

@ linie, 37 SAY 'Restantier'

ENDIF

SKIP

linie = linie + 1

ENDFOR

USE

Comanda SCAN

Structura codificata prin comanda SCANENDSCAN este specifica sistemului FoxPro si asigura parcurgerea automata a inregistrarilor din tabela deschisa in zona de lucru curenta (nu mai este necesara mutarea explicita a indicatorului de inregistrari) si executarea comenzile incluse in corpul cicluului. Sintaxa comenzii este urmatoarea:

SCAN

[NOOPTIMIZE

[<domeniu>]

[FOR <expL1>]

[WHILE <expL2>]

[<comenzi>]

[LOOP

[EXIT

ENDSCAN

unde:

NOOPTIMIZE

Includerea acestei clauze determina dezactivarea optimizarii Rushmore a comenzii SCAN. Rushmore este o tehnologie de optimizare a regasirii datelor in tabelele unei baze de date.

<domeniu>

Clauza <domeniu> se floseste pentru a indica inregistrarile care vor fi scanate. In functie de ncesitati ea se va inlocui cu una din urmatoarele constructii:

ALL Sunt prelucrate toate inregistrarile din tabela curenta.

NEXT <expN>    Sunt procesate urmatoarele <expN> inregistrari ale tabelei, incepand de la inregistrarea curenta, inclusiv.

RECORD <expN>    Este procesata numai inregistrarea cu numarul de inregistrare dat de <expN>.

REST Sunt procesate inregistrarile incepand cu cea curenta, inclusiv, si pana la sfarsitul tabelei.

Domeniul prestabilit pentru SCAN este ALL.

FOR <expL1>

Clauza FOR permite specificarea unui filtru pentru a elimina inregistrarile nedorite. Daca in comanda SCAN este inclusa clauza FOR, comenzile corpului ciclului vor procesa numai inregistrarile pentru care <expL1> returneaza adevarat (.T.).

WHILE <expL2>

Daca este inclusa clauza WHILE, corpul ciclului se va executa atata timp cat expresia <expL2> ramane adevarata. Prima inregistrare pentru care expresia <expL2> este falsa determina terminarea ciclului SCAN.

<comenzi>

Specifca comenzile ce vor prelucra inregistrarile tabelei curente. Formeaza corpul ciclului.

LOOP

Comanda LOOP poate fi plasata intre SCAN si ENDSCAN si determina reluarea ciclului fara a se mai executa instructiunile dintre ea si cuvantul cheie ENDSCAN.

EXIT

Comanda EXIT poate fi plasata oriunde intre SCAN si ENDSCAN si determina iesirea fortata din ciclu.

Observatii

Comanda SCAN avanseaza automat indicatorul de inregistrari pe urmatoarea inregistrare ce corespunde conditiilor specificate si executa comenzile corpului ciclului.

Daca se folosesc comenzile EXIT si LOOP, ele trebuie incluse intr-o structura alternativa, de regula o comanda IFENDIF, in caz contrar comenzile dintre ele si ENDDO nu se vor executa niciodata.

Pe aceeasi linie cu SCAN si ENDSCAN pot fi plasate comentarii precedate de caractere &&. Comentariile sunt ignorate la compilare si executie.

Exemplu Programul prezentat ca exemplu la comanda DO WHILE poate fi rescris folosind o comanda SCAN in locul comenzii DO WHILE astfel:

CLEAR

USE catalog.dbf

@ 1, 10 SAY 'P R O M O V A T I'

linie = 2

SCAN FOR (Romana >= 5) AND (Matematica >= 5) ;

AND (Fizica >= 5) AND (Chimie >= 5)

medie = (Romana + Matematica + FizicA + Chimie) / 4

@ linie, 5 SAY TRIM(Nume) + ' ' + TRIM(Prenume)

@ linie, 37 SAY STR(medie, 5, 2) PICTURE '@Z 99.99'

linie = linie + 1

ENDSCAN

linie = linie + 1

@ linie, 10 SAY 'R E S T A N T I E R I'

linie = linie + 1

SCAN FOR (Romana < 5) OR (Matematica < 5) ;

OR (Fizica < 5) OR (Chimie < 5)

@ linie, 5 SAY TRIM(Nume) + ' ' + TRIM(Prenume)

linie = linie + 1

ENDSCAN

USE

Controlul culorilor in FoxPro

In FoxPro pentru Windows, culorile pot fi setate prin doua procedee: folosind caseta de Display Properties din fereastra Control Panel a sistemului de operare Microsoft Windows sau utilizand comenzile SET COLOR din FoxPro. Este indicat gestionarea culorilor sa fie facuta prin intermediul sistemului de operare Windows.

Cand lansati in executie sistemul FoxPro, acesta incarca setul de culori Microsoft Windows prestabilit. Culorile meniului sistemului FoxPro, ferestrelor si castelor de dialog sunt determinate de catre parametrii culorilor din Microsoft Windows. Culorile elementelor de interfata definite de utilizator pot fi modificate in FoxPro prin programare, exceptand titlurile ferestrelor, bordurile ferestrelor si butoanele de comanda

Daca vreti sa stabiliti un set implicit de culori pentru FoxPro, puteti crea si salva propriul set de culori folosind comanda CREATE COLOR SET. Apoi specificati acest set de culori in fisierul de configurare CONFIG.FPW.

Multe comenzi ale limbajului de programare FoxPro contine clauzele COLOR SCHEME <expN> si COLOR <lista_perechi_culori>. In plus, FoxPro are si comenzi speciale, de tipul SET COLOR, care pot fi utilizate pentru a stabili culorile preferate. In continuare ne vom referi numai la modul de stabilire a culorilor folosind cele doua clauze COLOR SCHEME si COLOR.

Perechi de culori

O pereche de culori consta dintr-o culoare de text si o culoare de fond. FoxPro foloseste opt culori de baza: red (rosu), green (verde), blue (albastru), cyan (cian), magenta (magenta), yellow (galben), white (alb) si black (negru). Fiecare dintre aceste culori are doua intensitati: intunecat (dark) si stralucitor (bright). FoxPro utilizeaza o reprezentare diferita a culorilor pentru cele doua verisuni ale sale: Windows si MS-DOS. Dar ambele versiuni admit codurile RGB si codurile de tip caracter ale culorilor.

Perechile de culori RGB

Colorile pot fi specficate folosind valorile numerice ale codurilor RGB. Domeniul acestor valori este cuprins intre 0 (cea mai mica intensitate sau fara culoare) si 255 (intensitate cea mai mare sau culoare stralucitoare). Fiecare culoare (de text si de fond) necesita trei valori: una pentru rosu (Red), una pentru verde (Green) si una pentru albastru (Blue). Din acest motiv, o pereche de culori necesita sase valori, trei pentru culoarea de text si trei pentru culoarea de fond.

Exemplu

RGB(255,0,0,128,128,128) este codul RGB pentru rosu pe negru. Primele trei valori din expresia RGB stabilesc culoarea rosu pentru text, iar ultimele trei valori stabilesc culoarea negru pentru fond (in tabelul din sectiunea urmatoare se gasesc cele trei valori pentru culorile RGB).

Codurile de tip caracter pentru culori

FoxPro foloseste MS-DOS foloseste abreviatiile de tip caracter (R, G, B, W, N) pentru valorile culorilor. Fiecare culoare poate avea un atribut pentru a schimba nivelul intensitatii. Codurile de culoare care contin semnul plus (+) indica o culoare de text stralucitoare. In mod similar, codurile de culoare care contin un astersic (*) indica o culoare de fond stralucitoare. Aceste caractere (+ si/sau *) pot fi plasate in perechea de culori. Spre exemplu:

R+/N indica culoarea rosu pentru text si negru pentru fond. Aceasta pereche de culori poate fi scrisa si sub forma: +R/N, R/N+,R/+N

FoxPro pentru Windows admite coduri de tip caracter pentru culori, dar aceste coduri sunt convertite intern in sistemul RGB atunci cand programul este compilat.

Tabelul urmator prezinta coduri caracter ale culorilor si corespondentul lor RGB.

Culoare

RGB

Text

Fond

White (Alb)

W+

W*

Black (Negru)

N

N

Gray (Gri)

W

W

Dark Gray (Gri inchis)

N+

N*

Red (Rosu)

R+

R*

Dark Red (Rosu inchis)

R

R

Yellow (Galben)

GR+

GR*

Dark Yellow (Galben deschis)

GR

GR

Green (Verde)

G+

G*

Dark Green (Verde inchis)

G

G

Cyan (Cian)

BG+

BG*

Dark Cyan (Cian inchis)

BG

BG

Blue (albastru)

B+

B*

Dark Blue (Albastru inchis)

B

B

Magenta (Violet)

RB+

RB*

Dark Magenta (Violet inchis)

RB

RB

Atunci cand folositi culorile trebuie sa respectati urmatoarele reguli pentru conversia valorilor RGB in coduri caracter:

Cand toate cele trei valori ale culorilor (R, G si B) sunt sub 32, codul de tip caracter este N.

Cand toate cele trei valori ale culorilor (R, G si B) sunt intre 32 si 64, codul de tip caracter este N+.

Cand toate cele trei valori ale culorilor (R, G si B) sunt intre 65 si 191, codul de tip caracter este W.

Cand oricare din cele trei valori ale culorilor (R, G si B) este mai mare ca 191, codul de tip caracter trebuie sa fie insotit de + sau *.

Example

R

G

B

Caracter

W

W+/*

N+/*

B

B+/*

GR

Exemplu Urmatoarele doua comenzi sunt echivalente, din punct de vedere al stabilirii culorilor, dar prima foloseste codurile de tip caracter, in timp ce a doua utilizeaza codurile RGB:

@ 3, 13 SAY 'Nume:'    GET nume COLOR w+/b, r/bg*

@ 5, 13 SAY 'Prenume:' GET prenume ;

COLOR RGB(255,255,255,0,0,128), RGB(255,0,0,0,255,255)

Lista perechilor de culori

O lista a perechilor de culori este formata din una pana la 10 perechi de culori separate prin virgule. In exemplu prezentat anterior, s-a folosit o lista formata din doua perechi de culori, prima indicand culorile obiectului SAY iar a doua specifica culorile obiectului GET. Daca lista perechilor de culori poate contine mai multe perechi de culori si se doreste sa se modifice numai anumite culori, atunci culorile care nu se indicate vor fi marcate prin prezenta virgulei, care marcheaza locul acestora. Spre exemplu, daca in prima comanda a exemplului anterior dorim sa modificam doar culorile obiectului GET lasand nemodificate culorile obiectului SAY (se vor folosi culorile prestabilite), atunci comanda trebuie sa arate astfel:

@ 3, 13 SAY 'Nume:'    GET nume COLOR ,r/bg*

Scheme de culori

O schema de culori este un set de 10 perechi de culori folosite pentru a descrie in mod complet, din punct de vedere al culorilot, un element al mediului FoxPro, cum ar fi spre exemplu o caseta de dialog. Fiecare pereche de culori descrie modul de afisare a unui element al casetei (cadrul ferestrei, interiorul acesteia etc.). Lista perechilor de culori pentru o schema de culori poate fi obtinuta folosind functiile SCHEME() sau RGBSCHEME(). Spre exemplu, urmatoarele comenzi afiseaza in fereastra principala FoxPro lista perechilor de culori ale schemei 4 de culori (in figura 9 sunt prezentate codurile de tip caracter, cat si codurile RGB obtinute prin inlouirea functiei SCHEME cu functia RGBSCHEME):


Fiecare obiect defnit de utilizator foloseste in mod prestabilit o anumita schema. Spre exemplu, obiectele de tip GET, castetele de validare, listele si butoanele de comanda folosesc schema de culori a ferestrei in care sunt plasate. Meniurile definite de utilizator folosesc in mod prestabilit schema de culori 2. Modificarea schemei prestabilite pentru un obiect definit de utilizator se realizeaza folosind clauza COLOR SCHEME <expN>, unde <expN> este numarul schemei de culori ce se va folosi. Spre exemplu, urmatoarea comanda va folosi culorile schemei 4 in locul schemei prestabilite:

@ 3, 13 SAY 'Nume:'    GET nume COLOR SCHEME 4

In tabelul urmator este prezentata schema de culori 1 (User Wind - ferestre definite de utilizator):

Perechea de culori

Elementul controlat din fereastra

Textul ferestrei/Fondul ferestrei

Textul ferestrei/Spatiul de lucru al aplicatiei

Frama ferestrei/Fondul ferestrei

Textul barei de titlu active/Bara de titlu activa

Textul barei de titlu inactive/Bara de titlu inactiva

Textul marcat/Marcaj

Textul marcat/Marcaj

Ne folosit

Textul ferestrei/Fondul ferestrei

Text dezactivat/Fondul ferestrei

Setul de culori

Un set de culori consta din 24 de scheme de culori. Contextul complet al culorilor paote fi salvat intr-un set de culori. Seturile de culori, la fel ca si macrocomenzile si variabilele de memorie, pot fi salvate pentru a fi folosite ulterior. Unui set de culori i se asociaza un nume, avand cel mult 10 caractere (litere, cifre si liniuta de subliniere, insa primul caracter nu poate fi o cifra). Crearea unui set de culori contextul de culori curent se realizeaza cu comanda CREATE COLOR SET. Seturile de culori sunt stocate in fisierul resurselor FOXUSER.DBF. La un moment dat in memorie este incarcat un singur set de culori, cel curent, chiar daca pe disc pot exista si alte seturi de culori.Incarcarea unui set de culori se realizeaza cu comanda SET COLOR SET.

In tabelul urmator este prezentat setul de culori prestabilit pentru FoxPro.

Schema

Denumire

Elementele controlate

User Winds

Ferestre ale utilizatorului

User Menus

Meniuri ale utilizatorului

Menu Bar

Bara meniului sistemului

Menu Pops

Submeniurile sistemului

Dialogs

Ferestre de dialog si mesaje de sistem

Dialog Pops

Submeniuri si liste in ferestre de dialog

Alerts

Mesaje de avertizare

Windows

Ferestre sistem

Windows Pops

Submeniuri si liste in ferestre

Browse

Fereastra Browse

Report

Fereastra rapoartelor

Alert Pos

Liste in mesaje de avertizare create cu generatorul de ecrane

Rezervate

Disponibile pentru utilizator

Din cele prezentate rezulta ca tot mecanismul de lucru cu culori al mediului FoxPro se rezuma la urmatoarea schema:

culoare >> pereche de culori >> schema de culori >> set de culori

pereche de culori = 2 culori (text si fond)

schema de culori = 10 perechi de culori

set de culori = 24 scheme de culori

3. Proceduri si functii definite de utilizator

Comanda DO

Lansarea in executia a unui program se face cu comanda DO, a carei sintaxa este urmatoare:

DO <fisier>

[WITH <lista_parm>]

[IN <fisier_proc>]

unde:

<fisier>

Reprezinta numele fisierului ce se va executa. Daca nu includeti o extensie la numele fisierului, FoxPro va cauta fisierele cu numele specificat, in urmatoarea ordine:

versiune executabila a programului (.EXE)

aplicatia (.APP)

versiunea compilata a programului (.FXP)

programul sursa (.PRG)

Pentru a executa programul specific unui meniu, ecran sau interogare folosind comanda DO, trebuie sa precizati extensiile acestora impreuna cu numele fisierului (.MPR, .SPR sau .QPR).

WITH <lista_param>

Clauza WITH permite transmiterea parametrilor programului ce se executa.

Parametrii din <lista_param> pot fi expresii, variabile de memorie, literali (constante), campuri sau functii definite de utilizator.

In mod prestabilit, transmiterea parametrilor se face prin referinta (prin adresa). Pentru a transmite un oarametru prin valoare, se plaseaza parametrul respectiv intre paranteze.

Numarul maxim de parametrii ce pot fi transmisi unui program este 24.

IN <fisier_proc>

Iclauza IN se foloseste atunci cand se apeleaza o procedura (cu numele <fisier>) din programul sursa specificat prin <fisier_proc>.

Observatii

Un fisier program poate contine comenzi DO suplimentare pentru a lansa in executie alte programe. Imbricarea comenzilor DO este limitata la 32.

Cand un program este lansat in executie folosind comanda DO, comenzile existente in programul sursa sunt executate pana cand se When you use DO to run a program, the commands contained in the program file are executed until one of the following occurs:

o        s-a intalnit comanda RETURN.

o        s-a executat comanda CANCEL.

o        s-a lansat o alta comanda DO.

o        sa- intalnit sfarsitul fisierului sursa.

o        s-a executat comanda QUIT.

Cand s-a terminat executia programului, controlul este returnat programului apelant, ferestrei Command, sistemului de operare MS-DOS in FoxPro pentru MS-DOS sau sistemului de operare Windows in FoxPro pentru Windows.

Daca folositi optiunea Do din meniul Program pentru a lansa in executie un program dintr-un director si/sau unitate de disc diferita fata de directorul si unitatea implicita, FoxPro schimba directorul si unitatea implicita la directorul si unitatea ce contine programul.

Definirea procedurilor si functiilor

Lansarea in executie a unui program din interiorul altui program, folosind comanda DO, reprezinta un pas important in structurarea aplicatiilor complexe. Pe masura ce numarul liniilor de program ale unei aplicatii creste, testarea si depanarea acesteia devine din ce in ce mai dificila, in principal datorita numarului mare de variabile utilizate, a numarului mare de instructiuni si a legaturilor dintre acestea.

In asemenea situatii este indicat ca aplicatia sa fie impartita in module separate, care rezolva o anumita parte a problemei; modulele fiind independente intre ele. Comunicarea cu celelalte module se face prin intermediul unor parametrii, variabile de comunicare, carea realizeaza interfatarea modulului cu exteriorul.

Sa presupunem ca pe disc exista trei programe sursa: monitor.prg, combin.prg si fact.prg. Continutul acestor trei fisiere este urmatorul:

MONITOR.PRG

opt = ' '

DO WHILE .T.

CLEAR

@ 3, 7 SAY 'O P T I U N I L E P R O G R A M U L U I'

@ 5, 10 SAY ' 1 - Calcul factoria'

@ 6, 10 SAY ' 2 - Calcul combinari de N cate K'

@ 7, 10 SAY ' 0 - Terminare program'

@ 9, 17 SAY ' Optiunea dorita: ' GET opt PICTURE 'X'

READ

DO CASE

CASE opt = '1'

DO fact

CASE opt = '2'

DO combin

CASE opt = '0'

CANCEL

ENDCASE

WAIT 'Apasati orice tasta' WINDOW

ENDDO

FACT.PRG (Calculeaza factorialului unui numar intreg dat - n! = 1*2*3 . * n)

CLEAR

n = 0

@ 5, 10 SAY 'Introduceti un intreg: ' GET n PICTURE '99'

READ

fact = 1

FOR i = 1 TO n

fact = fact * i

NEXT

@ 7, 10 SAY 'n! = ' + STR(fact)

COMBIN.PRG (Calculeaza combinari de n luate cate k cu relatia n! / k! / (n - k)!)

CLEAR

n = 0

k = 0

@ 3, 10 SAY 'n =' GET n PICTURE '99'

@ 4, 10 SAY 'K =' GET k PICTURE '99'

READ

f1 = 1

FOR i = 1 TO n

f1 = f1 * i

NEXT

f2 = 1

FOR i = 1 TO k

f2 = f2 * i

NEXT

f3 = 1

FOR i = 1 TO n - k

f3 = f3 * i

NEXT

sir = 'Combinari de ' + STR(n, 2) + ' luate cate '

sir = sir + STR(k, 2) + ' = ' + STR(f1 / f2 / f3, 13, 0)

@ 6, 10 SAY sir

Programele FACT.PRG si COMBIN.PRG reprezinta de fapr niste module relativ la programul MONITOR.PRG, care este programul principal. Modulele de acest tip pot fi create si in interiorul fisierului ce contine programul principal, formand asa numitele "proceduri si functii definite de utilizator" (in engleza se foloseste prescurtarea UDF - User Defined Function).

O functie definita de utilizator reprezinta un grup de instructiuni, care primeste sau nu un set de parametrii de la programul apelant si returneaza acestuia o valoare ca rezultat al prelucrarilor efectuate. O functie definita de utilizator poate intra ca operand in componenta unei expresii, analog functiilor standard din FoxPro. Definire unei functii se realizeaza utilizand comanda FUNCTION a carei sintaxa este:

FUNCTION <nume_functie>

O procedura definita de utilizator reprezinta de asemenea un grup de instructiuni ce primeste de la programul apelant un grup de parametrii, realizeaza prelucrarile specificate dupa care se revine in programul apelant. O procedura nu poate intra in compunerea unei expresii ca operand. Pentru definirea unei proceduri se foloseste comanda PROCEDURE, care are sintaxa:

PROCEDURE <nume_procedura>

unde <nume_functie> si <nume_procedura> reprezinta numele functiei procedurii si respectiv numele procedurii definite de utilizator, pe cre le vom denumi in continuare rutine, poate fi format din maximum 10 caractere, incepand cu o litera sau liniuta de subliniere si continand litere, liniuta de subliniere si cifre.

Structura unei rutine este urmatoarea:

FUNCTION PROCEDURE <nume_rutina>

[PARAMETERS <lista_parametri_fictivi>]

<comenzi>

RETURN

Trebuie sa se faca distinctie intre definitia unei rutine si apelul acesteia. La definirea unei rutine se stabilesc parametrii care se primesc, prelucrarile ce se vor efectua si rezultatele ce se vor transmite dupa prelucrare.

Apelul unei functii se face prin numele acesteia, urmat, intre paranteze rotunde, de lista parametrilor efectivi (reali, actuali) care se transmit. La executarea programului care contine o functie, in locul constructiei respective (apelul de functie) se va introduce valoarea returnata de functie, ca rezultat al prelucrarilor executate asupra datelor.

O procedura definita de utilizator se lanseaza in executie la fel ca un program, folosind comanda DO, cu deosebirea ca in loculu unui nume de fisier se precizeaza numele procedurii respective, iar parametrii reali ce se transmit acesteia se indica prin intermediul clauzei WITH a comenzii DO.

Procedurile si functiile unui program se introduc, de regula dupa ultima instructiune a programului, in acelasi fisier cu acesta. Dar rutinele se pot introduce si intr-un fisier separat care va fi asociat programului apelant prin comanda SET PROCEDURE a carei sintaxa este:

SET PROCEDURE TO [<fisier>]

unde <fisier> reprezinta numele unui fisier cu extensia implicit .PRG, ce contine rutinele care nu se gasesc in programul apelant.

Comanda SET PROCEDURE TO, fara parametri, determina inchiderea fisierului de proceduri curent asociat programului. Un program poate avea la un moment dat un singur fisier de proceduri deschis.

La apelarea unei proceduri folosind comanda DO, cautarea acesteia se face in ordinea urmatoare:

in fisierul care contine comanda DO;

in fisierul de proceduri deschis prin comanda SET PROCEDURE;

in programele in curs de executie, pe diferite nivele, pana la programul de nivel 1 (primul lansat in executie);

in directorul si unitatea curenta, considerand ca numele specificat in comanda DO reprezinta un program sursa si nu o procedura.

Pentru ca operatia de cautarea a unei proceduri sa se faca numai intr-un anumit fisier, numele acestui fisier se va include in clauza IN a comenzii DO.

Variabile globale si variabile locale

Variabilele unui program sunt definite prin diferite comenzi FoxPro (STORE, @GET etc.) si ele exista in memorie atata timp cat programul este in curs de executie, fiind automat eliminate la terminarea programului.

Probleme speciale apar atunci cand un modul (program, functie, procedura) este apelat din interiorul altui program. Variabilele din programul apelant sunt cunoscute in cel apelant si invers? Ce se intampla cand in modulul apelat se folosesc variabile cu nume identice cu cele din programul apelant? Raspunsurile la aceste intrebari vor fi date pe parcursul acetui paragraf.

Intr-un modul pot fi referite doua tipuri de variabile: variabile globale si variabile locale.

Variabilele globale (publice) pot fi accesate si modificate in orice modul in curs de executie, de pe un nivel inferior, egal sau superior nivelului modulului curent. Variabilele globale sunt create cu comanda PUBLIC care are 2 forme, una pentru variabilele simple si alta pentru variabilele structurate de tip tablou:

PUBLIC <lista_variabile>

PUBLIC ARRAY] <tablou1>(<expN1[,<expN2>])

[, <tablou2>(<expN3> [, <expN4>])]

Variabilele de memorie si tablourile create cu PUBLIC sunt initializate cu valoarea logica fals (.F.).

Variabilele locale (private) pot fi accesate si modificate doar in modulul in care au fost declarate si in cele subordonate acestuia. Variabilele private se declara folosind comanda PRIVATE care are 2 forme, una pentru variabilele simple si alta pentru variabilele structurate de tip tablou:

PRIVATE <lista_variabile>

PRIVATE ALL LIKE <masca> | EXCEPT <masca>]

Prin forma a comenzii PRIVATE declara ca fiind locale (private) variabilele din <lista_variabile>. A doua forma a comenzii PRIVATE declara ca fiind locale (private) fie toate variabilele (forma PRIVATE ALL), fie toate variabilele care se potrivesc cu <masca> (forma PRIVATE ALL LIKE <masca>) fie toate variabilele cu exceptia celor care se potrivesc cu <masca> (forma PRIVATE ALL EXECEPT <masca>).

NOTA Comanda PRIVATE nu creaza variabile, ci doar le declara ca fiind locale (private).

Transferul parametrilor

Pentru dezvoltarea aplicatiilor mai complexe, care include mai multe module (programe, functii, proceduri), este indicat ca in cadrul acestor module sa se foloseasca numai (sau cat mai mult) variabile locale, comunicarea cu celelalte module realizandu-se prin intermediul unor variabile speciale, numite parametri fictivi

In FoxPro sunt implementate doua metode de transmitere a parametrilor:

prin referinta (adresa), in care variabila transmisa este afectata de eventualele modificari aduse in subprogram;

prin valoare, cand o eventuala modificare a variabilei in subprogram nu afecteaza valoarea acesteia in programul (modulul) apelant.

Atunci cand comunicarea intre programul (modulul) apelant si subprogramul apelat se realizeaza prin intermediul parametrilor trebuie sa avem in vedere faptul ca, corespondenta dintre variabilele listei parametrilor reali si variabilele din lista parametrilor fictivi se face prin pozitie si nu prin nume.

Lista variabilelor transmise ca parametrii reali este stabilita fie prin clauza WITH a comenzii DO, in cazul apelului unui subprogram sau a unei proceduri, fie prin lista dintre parantezele rotunde ce urmeaza numelui functiei, cand avem un apel de functie.

Pentru stabili in subprogram care sunt variabilele locale in care se incarca parametrii transmisi se foloseste comanda PARAMETERS, a carei sintaxa este:

PARAMETERS <lista_variabile_locale>

Aceasta comanda, care trebuie sa fie prima comanda a unui modul (in cazul cand aceasta exista) defineste lista de variabile locale care vor prelua parametrii transmisi de la programul apelant.

Lista variabilelor locale (<lista_variabile_locale>) trebuie sa aiba totdeauna un numar de elemente mai mare sau cel putin egal cu numarul de elemente din lista parametrilor transmisi, pentru ca fiecare sa aiba un corespondent in subprogram.

In mod prestabilit, transmiterea parametrilor unui subprogram se realizeaza prin referinte (adrese). Adica subprogramului i se transmit adresele zonelor de memorie in care se gasesc valorile parametrilor reali. Schimbarea metodei implicite de transmitere a parametrilor se face folosind comanda SET UDFPARMS, a carei sintaxa este:

SET UDFPARMS TO VALUE | REFERENCE

Comanda SET UDFPARMS TO VALUE stabileste transmiterea prin valoare a parametrilor, ca metoda implicita, iar comanda SET UDFPARMS TO REFERENCE face ca transmiterea sa se faca implicit prin referinta.

Pentru ca un parametru sa fie transmis prin valoare atunci cand transmiterea implicita este prin referinta se include intre paranteze rotunde variabila respectiva in lista parametrilor reali. Daca vrem ca un parametru sa fie transmis prin referinta atunci cand transmiterea implicita este prin valoare, in lista parametrilor reali se precede variabila respectiva de caracterul @.

Revenirea in programul apelant

Executia unui subprogram (modul, functie, procedura) se termina atunci cand se produce una din urmatoarele:

s-a intalnit sfarsitul de fisier;

s-a executat comanda RETURN;

s-a executat comanda CANCEL.

Dupa terminarea executiei subprogramului apelat, controlul este preluat de prima instructiune din programul apelant care urmeaza apelului de subprogram (in cazul primelor doua situatii) sau ferestrei Command (in cazul executarii comenzii CANCEL).

Comanda RETURN

Comanda RETURN are rolul de a termina executia programului si de a preda controlul programului apelant, programului de cel mai inalt nivel sau unui alt program. Sintaxa comenzii este urmatoarea:

RETURN [<expr> | TO MASTER TO <nume_program>]

unde:

<expr>

Reprezinta expresia care furnizeaza valoarea ce va fi returnata programului apelant. Daca este omisa expresia <expr> sau lipseste comanda RETURN, programului apelat returneaza in mod automat valoarea logica adevarat (.T.).

TO MASTER

Clauza TO MASTER preda controlul programului apelant de cel mai inalt nivel.

TO <nume_program>

Clauza TO preda controlul programului specificat prin <nume_program>.

Observatii

Dupa executarea comenzii RETURN controlul este preluat de programul apelant, de programul de cel mai inalt nivel, de un alt program sau de fereastra Command.

Variabilele locale, declarate cu comanda PRIVATE, sunt eliminate din memorie dupa executarea comenzii RETURN.

De regula, comanda RETURN se plaseaza la sfarsitul unui program, proceduri sau functii.

Daca comanda RETURN lipseste dintrun program, functie sau procedura, se executa o comanda RETURN implicita.

Un program, procedura sau functie poate avea mai multe comenzi RETURN, daca este necesar.

Exemplu de utilizare proceduri si functii

Programul prezentat la inceputul acestui capitol (pag. 33) poate fi rescris prin utilizarea unei functii pentru calculul factorialului si a unei proceduri pentru calculul combinarilor. Programul sursa astfel modificat ar putea arata astfel:

opt = ' '

DO WHILE .T.

CLEAR

@ 3, 7 SAY 'O P T I U N I L E P R O G R A M U L U I'

@ 5, 10 SAY ' 1 - Calcul factorial'

@ 6, 10 SAY ' 2 - Calcul combinari de N cate K'

@ 7, 10 SAY ' 0 - Terminare program'

@ 9, 17 SAY ' Optiunea dorita: ' GET opt PICTURE 'X'

READ

DO CASE

CASE opt = '1'

CLEAR

n = 0

@ 5, 10 SAY 'Introduceti un intreg: ' GET n PICTURE '99'

READ

@ 7, 10 SAY 'n! = ' + STR(Factorial(n))

CASE opt = '2'

DO Combinari

CASE opt = '0'

CANCEL

ENDCASE

WAIT 'Apasati orice tasta' WINDOW

ENDDO

FUNCTION Factorial

PARAMETERS m

fact = 1

FOR i = 1 TO m

fact = fact * i

NEXT

RETURN fact

PROCEDURE Combinari

CLEAR

n = 0

k = 0

@ 3, 10 SAY 'N =' GET n PICTURE '99'

@ 4, 10 SAY 'K =' GET k PICTURE '99'

READ

sir = 'Combinari de ' + STR(n, 2) + ' luate cate '+ STR(k, 2)

IF (n = 0 ) OR (n = k)

comb = 1

sir1 = '= 1'

ELSE

IF k > n

sir1 = ' nu se poate calcula'

ELSE

comb = factorial(n) / Factorial(k) / Factorial(n - k)

sir1 = '= ' + STR(comb, 13, 0)

ENDIF

ENDIF

@ 6, 10 SAY sir + sir1

RETURN

Analizand programul, se poate constata ca functia Factorial are un singur parametru fictiv (m), transferul se realizeaza prin referinta (modul implicit de transmitere) si contine doua instructiuni RETURN, iar procedura Combinari nu are parametrii si apelaza functia Factorial pentru a calcula combinarile de N luate cate K.

Tinand cont de faptul ca pentru caclulul factorialului unui numar exista urmatoarele relatii de recurenta:

1 pentru n = 0 si n = 1

n! =

n * (n - 1)! pentru n = 2, 3,

functia Factorial poate fi rescrisa ca o functie recursiva (se autoapeleaza) astfel:

FUNCTION Factorial

PARAMETERS m

IF (m = 0) OR (m = 1)

fact = 1

ELSE

fact = m * Factorial(m -1)

ENDIF

RETURN fact





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate