Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Structuri de programare FoxPro

Structuri de programare FoxPro

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>.

 

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:

1.      Se executa clauza WHEN a nivelului READ

2.      Se activeaza prima fereastra ce contine obiecte GET

3.      Se executa clauza ACTIVATE a nivelului READ

4.      Se executa clauza SHOW a nivelului READ

5.      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:

1.      Se executa clauza VALID a campului care este parasit

2.      Este dezactivata fereatra campului care a fost parasit

3.      Se activeaza fereastra ce contine noul camp GET

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

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

6.      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

15

Prenume

C

15

DataNast

D

8

Clasa

C

4

Romana

N

5

2

Matematica

N

5

2

Fizica

N

5

2

Chimie

N

5

2

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:

1.    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>.

2.    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.

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

4.    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.

5.    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)

255, 255, 255

W+

W*

Black (Negru)

0, 0, 0

N

N

Gray (Gri)

192, 192, 192

W

W

Dark Gray (Gri inchis)

128, 128, 128

N+

N*

Red (Rosu)

255, 0, 0

R+

R*

Dark Red (Rosu inchis)

128, 0, 0

R

R

Yellow (Galben)

255, 255, 0

GR+

GR*

Dark Yellow (Galben deschis)

128, 128, 0

GR

GR

Green (Verde)

0, 255, 0

G+

G*

Dark Green (Verde inchis)

0, 128, 0

G

G

Cyan (Cian)

0, 255, 255

BG+

BG*

Dark Cyan (Cian inchis)

0, 128, 128

BG

BG

Blue (albastru)

0, 0, 255

B+

B*

Dark Blue (Albastru inchis)

0, 0, 128

B

B

Magenta (Violet)

255, 0, 255

RB+

RB*

Dark Magenta (Violet inchis)

128, 0, 128

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

100

80

175

W

100

200

175

W+/*

33

56

45

N+/*

33

56

175

B

33

56

245

B+/*

100

100

3

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

1

Textul ferestrei/Fondul ferestrei

2

Textul ferestrei/Spatiul de lucru al aplicatiei

3

Frama ferestrei/Fondul ferestrei

4

Textul barei de titlu active/Bara de titlu activa

5

Textul barei de titlu inactive/Bara de titlu inactiva

6

Textul marcat/Marcaj

7

Textul marcat/Marcaj

8

Ne folosit

9

Textul ferestrei/Fondul ferestrei

10

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

1

User Winds

Ferestre ale utilizatorului

2

User Menus

Meniuri ale utilizatorului

3

Menu Bar

Bara meniului sistemului

4

Menu Pops

Submeniurile sistemului

5

Dialogs

Ferestre de dialog si mesaje de sistem

6

Dialog Pops

Submeniuri si liste in ferestre de dialog

7

Alerts

Mesaje de avertizare

8

Windows

Ferestre sistem

9

Windows Pops

Submeniuri si liste in ferestre

10

Browse

Fereastra Browse

11

Report

Fereastra rapoartelor

12

Alert Pos

Liste in mesaje de avertizare create cu generatorul de ecrane

13-16

Rezervate

17-24

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