joi, 27 iunie 2013

FoxProW pentrui incepatori Cap. 5

 5. INTRARE - IEŞIRE
Un program, de multe ori are nevoie de introducerea unor date, de vizualizarea altora pentru a informa utilizatorul şi a decide executia în continuare ca şi de afişarea unor rezultate !a încheierea execuţiei. Comunicarea între utilizator şi program se face prin intermediul tastaturii, al ecranului şi al imprimantei.
       1. Formatul de afişare şi citire
Pentru a lămuri modul cum se pot realiza aceste lucruri să analizăm următoarea comandă:
        @ 10,5 say 'Cum te numeşti ?' get nume
        @ 12,5 say nume
        @ 12,25 say ',Bine ai venit in lumea FoxPro!'
        Aceste comenzi vor cere un nume, vor aştepta introducerea lui şi apoi vor afişa de exemplu mesajul (dacă numete introdus este Andrei);
        Andrei, Bine ai venit in lumea FoxPro!
        Pentru aceasta, ecranul este împărtit în linii şi coloane, începând cu coloana 0 linia 0 aşezate în poziţia din stânga sus a ecranului.
        O comandă de afişare SAY este urmată de două cifre care reprezintă linia şi coloana. Dacă cifrele sunt fracţionare atunci tipărirea se face la intervalele respective fraictionate, de exemplu linia 10,7 va reprezenta a zecea linie plus 70% din înâlţimea unei linii (în FoxPro sub DOS nu sunt permise decât cifre întregi). Aşa se află coordonatele primului pixe! ce trebuie afişat.
        În FoxPro este posibilă afişarea folosind o serie de culori. Se recomandă folosirea culorilor implicite care sunt relativ bune însă ele pot fi schimbate.
         Codificarea culorilor este;
negru
N
blanc
X
albastru
B
maro
GR
albastru deschis
BG
verde
G
violet
RB
roşu
R
alb
W
galben
GR+
PENTRU MONITOARE
A/N
alb
W
subliniat
U
in video invers
I
            Adăugarea unui asterisc la codul culorii face ca aceasta să fie strălucitoare sau sclipitoare, în cazu! culorilor de fond (pentru hârtie), iar adăugarea unui + indică o nuanţă mai strălucitoare a ei (pentru codul cernelii).
            Afişarea unui caracter pe ecran presupune specificarea a două culori pentru caracteru! propriu-zis, numită culoare a cernelii şi alta pentru fondu! pe care se afişează, numită culoare a hârtiei. Cele două culori se grupează într-o pereche de formatul fiind:
culoare cerneală / culoare hârrie
            Culorile pot fi indicate şi printr-un set de şase valori indicând componentele în RGB (roşu, green, blue) de exemplu:
            ALB=255,255,255
            RGB (255,0,0,0,255,255) echivaient cu R+ / BG+
            O succesiune de maxim zece perechi de culori reprezintă o listă de perechi de culori. Un set de 24 liste de perechi de culori reprezintă un set de culori adică un mod complet de descriere a unui element FoxPro de exempiu o fereastră de dialog.
            În total avem 2 (perechi de culori)*10 (schemă de culori)*24 seturi de culori = 480 culori care identifică o schemă de culori.
           La un moment dat în memorie este încărcat un singur set de culori, cel curent. Modificarea culorilor într-o schemă de culori se realizează cu comanda:
            SET COLOR OF SCHEME expn1 TO
            [listă perechi culori | SCHEME expn2]

           Comanda modifică culorile schemei expn1 a setului de culori curent, noile culori fiind date prin enumerare în listă sau prin copierea culorilor dintr-o altă schemă specificată prin numărui său expn2 (vechiul continut expn1 se va pierde).
          Comanda: SET COLOR OF SCHEME expn1 TO
determină încărcarea schemei expn1 în ultimul set de culori încărcat sau salvat, un set de culori definit prin SET COLOR SET TO, un set de culori încărcat din CONFIG.FP un set de culori implicit FoxPro.
         Salvarea şi încărcarea unui set de culori se realizează astfel:
         CREATE COLOR SET nume set culori
         SET COLOR SET TO [nume set culori]
         Prin aceste comenzi se salvează toate culorile setului curent în memorie cu numele "nume set cutori", respectiv se încarcă un nou set de culori din memorie.
         Clauzele următoare apar într-o serie de comenzi:
         COLOR SCHEME expn
         COLOR listă perechi culori
         Aceste clauze au semnificaţia:
         - în absenţa clauzelor de afişare se folosesc culorile din setul de culori curent;
        - dacă se doreşte afişarea cu alte culori se va folosi una din aceste clauze (în al doilea caz tipărirea se va face numai pentru elementul în care se precizează clauza, apoi revenindu-se).
         Folosirea setului curent nu este modificată de aceste clauze.
         În varianta sub DOS, afişarea caracterelor se face la nivel de linie şi coloană, care au o dimensiune fixă existând un singur tip de caractere. În varianta sub Windows unde listarea se face la nivel de pixel, există mai multe tipuri de caractere (fonturi) şi mai multe dimensiuni a!e caracterelor. În această variantă, pentru a afişa un text pe ecran, trebuie să se specifice:
        - setul de caractere folosit (Arial, Roman, Times etc);
        - stilul de afişare (Bold, Italic,...);
        - dimensiunea caracterelor;
        - poziţia de afişare pe ecran:
        - eventual culorile folosite.
       Pentru a putea vedea şi alege seturile de caractere disponibile, se utilizează comanda:
        ? GETFONT()
care determină apariţia unei ferestre (Font) în care utilizatorul poate specifica un set de caractere, un stil de afişare şi o dimensiune ca în cele ce urmează:
                          

       După alegerea opţiunilor dorite şi acţionarea declanşatorului OK pe ecran va apărea aişată o linie conţinând enumirea setului de caractere, dimensiunea şi stilul de afişare, de exemplu:
       Arial,9,N
      În tabelul următor sunt indicate denumirea seturilor de caractere, stilurilor de asfişare şi mnemonicele lor:

SET CARACTERE
SET CARACTERE
STIL
semificaţie
MN
Arial
MS Serif
Bold
îngroşat
B
Courir
Roman
Italic
înclinat
I
Courir New
Script
Normal
normal
N
Fixedsys
Small Fonts
Outline
conturat
O
FoxFont
Symbol
Opaque
opac
Q
FoxPrint
System
Shadow
umbrit
S
FoxProWindow
Terminal
Strikeout
tăiat
-
Modern Times
New Roman
Transparent
transpar.
T
MS Sans Serif
Wingdings
Subliniat
subliniat
U
        Aceste stiluri pot fi cumulate. Bl- indică un stil îngroşat, înclinat şi tăiat cu o linie orizontală şi se va indica astfel;
        @ 10,10 SAY ' ACESTA ESTE STILUL' FONT 'Arial',9 style 'BI-'
        Întro serie de comenzi apar clauze cu privire la specificarea stilului caracterelor şi a fonturilor şi dimensiunii acestora:
        [ FONT expc [ ,expn ] ] şi [ STYLE expc ]

5.2 Comenzile @SAY şi @ GET
        
          Afişarea pe ecran a diverselor date se poate realiza cu comanda:
         @ lin,col SAY expr [FUNCTION expcl ] [PICTURE expc2]
         [SIZE expn1,expn2] [FONT expc3 [,expn3] ]
         [STYLE expc4] [COLOR SCHEME expn4]
         COLOR listă perechi culori]

         Acestă comandă va evalua expresia "expr" şi va afişa rezultatul la coordonatele lin şi col (linie,coloană) pe ecranul calculatorului,
        Dimensiunea zonei de afişare va fi controlată de clauza SIZE, în care expn1 reprezintă numărul de linii iar expn2 numărul de coloane al zonei de afişare. Valoarea implicită pentru expn1 este 1 (adică o linie).
       Setul de caractere folosit şi stilul de afişare se specifică prin clauzele FONT şi STYLE. în absenţa lor se va folosi setul şi stilul implicit al ferestrei.
Indicarea culorilor de afişare se face prin clauzele COLOR SCHEME şi COLOR sau cu culorile implicite dacă culorile nu se indică.
       Codurile FUNCTION stabilesc o serie de condiţii de afişare iar codul PICTURE stabilesc dimensiunea zonei (număru! de caractere) şi eventual alte condiţii de afişare după cum se vede în tabelele următoare:

a). Pentru codurile FUNCTION:
Semnificaţie
Cod
Permite numai caractere alfabetice
A
Aliniază la stânga datele numerice
B
După un număr pozitiv afişează CR
C
Format dată calendaristică stabilit prin SET DATE
D
Tipăreşte datele calendaristice în format EUROPEAN
E
Centrează textul
I
Aliniază la dreapta textul
J
Selectează întregul câmp de editare la mutarea în câmp
K
Afişeză zerouri în faţa punctului zecimal în locul spaţiilor
L
Permite selectarea unui element al listei (prima literă sau folosind tasta space)
M
Terminarea editării cu ENTER. (utiliz. GET)
Listă
Pentru şir de caractere la date ce conţin alte date decât cod. PIC
R
Limitează lăţimea de afişare la n caractere
S(n)
Elimină blancurile de la început şi sfârşit
T
Se afişează DB !a cifre negative
X
Se afişează spaţii în loc de zero nesemnificativ
Z
Numerele negative sunt incluse între paranteze
{
Toate caracterele sunt convertite în majuscule
!
Afişează semnul monetar (stabiiit cu SET CURRENCY) la sfîrşitui cifrei
$

b) Pentru codurile PICTURE:

Semnificaţie
Cod
Permite doar introducerea caracterelor alfabetice
A
Permite doar date de tip logic
W
Permite doar litere şi cifre
N
Permite orice caractere
X
Permite doar Y,y, N,n (Yes, No) trecândule la majuscule
Y
Permite doar date numerice, cifre şi semne (indică numărul lor)
9
Permite cifre, blancuri şi semne (numărul lor)
#
Afişează simbolul monetar (SET CURRENCY)
$
Afişează asterisc în faţa numerelor
*
Specifică poziţia punctului zecimal
.
Delitator separând poziţia cifrelor din stânga punctului zecimal
,

         Lăţimea câmpului de afişare sau de cifre citite este dată de lungimea şirului de caractere din clauza PICTURE. Codurile FUNCTION pot fi incluse în clauza FUNCTION sau pot fi incluse în clauza PICTURE precedând codurile PICTURE şi fiind obligatoriu precedate de caracterul "@".
         Exemplu:
@ 1,1 say 'altemativ' FUNCTION '!x!x!x!x!x'
 AITeRnAtIv
@ 3,3 SAY 555.45 pict '@Z 999999.99'
____555.45
(liniuţele din faţa cifrei semnifică cele trei zerouri înlocuite cu spaţii).

AFIŞAREA IMAGINILOR PE ECRAN

Pentru afişarea imaginilor se foloseşte o comandă SAY puţin modificată faţă de cea anterioară:
@ lin,col SAY fişier BITMAP | câmp general
[STYLE expc1] [CENTER] [ISOMETRIC | STRECH]
[SYZE expn1,expn2]
Imaginile pot fi depozitate fie în fişiere, fie în câmpuri de tip general.
Exemplu: Fişierul LIVES.BMP din directorul Windows:
        @ 1,1 SAY 'C: \WINDOWS\LEAVES.BMP' BITMAP
        Clauza S!ZE indică zona şi dimensiunile de afişare în care expn1 reprezintă numărul de linii iar expn2 numărul de coloane. Dacă imaginea este mai mare, ea va fi decupată şi se va afişa doar ceea ce încape în zona respectivă. Dacă zona decupoată este prea mare, imaginea va fi afişată în colţul din stânga sus al zonei.
        Clauza CENTER centrează imaginea atât pe orizontală cât şi pe verticală, iar clauza STRECH umple zona cu imaginea respectivă (eventual distorsionată). Clauza ISOMETRIC umple de asemenea zona de afişare dar este modificată astfel incât să-şi păstreze proporţiile.
        Clauza STYLE modifică modul de afişare:
        - opac – eventualele texte sau alte imagini situate sub imaginea respectivă nu sunt vizibile (Q);
        - transparent – vechiul conţinut al zonei de afişare se vede şi el (T).
        Dacă în timul execuţiei unui program sunt necesare date de la utilizaor, programul va trebui să oprească execuţia şi să solicite aceste date utilizatorului. Aceata se realizează în felul următor:
        - mai întâi se definesc zonele de introducere a datelor (numite câmpuri de editare);
        - apoi se da comanda de citire (READ);
        - se continuă execuţia programului.
       Comanda de definire a câmpurilor de editare este:
      
       @ lin,col GET var | câmp
       [FUNCTION expc1] [PICTURE expc2]
       [SIZE expn1, expn2] [FONT expc3 [;expn3]]
       [STYLE expc4] [DEFAULT expr1]
       [ENABLE] [DISABLE] [MESSAGE expc5]
       [[OPEN] WINDOW ferestră] [RANGE [expr2] [,expr3]]
       [SIZE expn2, expn3] [VALID expl1 | expn4]
       [ERROR expc6] [WHEN expl2]
       [COLOR SCHEME expn4 | COLOR listă perechi culori]

       Comanda defineşte un câmp de editare în poziţia lin,col unde va fi citită o valoare care va fi introdusă în variabila "var" sau în câmpul de date "câmp". Tipul variabilei sau al câmpului va fi dat de tipul valorii citite.
      Clauzele FUNCTION, PICTURE au fost prezentate Ia comanda SAY şi sunt Ia fel ca aceleaşi ca şi clauzele STYLE şi FONT. Clauza ENABLE permite accesul la câmpul citit iar clauza DISABLE nu, opţiunea implicită fiind ENABLE. Accesarea câmpului este controlată de clauza WHEN care nu va permite accesul decât dacă expl2 este evaluată .T. Evaluarea expresiel are loc Ia execuţia comenzii READ.
      Clauza WINDOW permite editarea câmpurllor memo într-o fereastră de editere care a fost definită anterior prin cornanda DEFINE WINDOW.
      Clauza RANGE permite veficarea condiţiei impuse ca valoarea editată în câmp sa fie mai mare sau egală decât expr2 şi mai mica sau egală cu expr3. Dacă una din condiţii Iipseşte, valoarea nu va mai fi limitatä (inferior, respectiv superior) dar nu pot fi omise ambele limite.
      Clauza SIZE determină dimensiunile câmpului de editare. Expn1 reprezintă înălţimea iar expn2 Iăţimea în coloane. Efectul ei este influentat de claza PICTURE în modul următor:
     - Ia editarea unui camp cu o lungime mai mică decât clauza data prin SIZE, lăţimea regiunii va fi dată de lungimea câmpului;
     - Ia editarea unei variabile cu lungime mai mică decât expn2, lăţimea regiunii va fi egaIă cu acestă expresie;
     - în cazul în care expn2 este mai mica decât lungimea vahabilei sau a câmpuIui, se va realiza defilarea acesteia sub regiunea stabilită prin clauza SIZE.
     Dacá se foIosete clauza SIZE şi PICTURE concomitent, atunci:
     - dacă dimensiunea stabilitä prin PICTURE este mai mica decât cea din SIZE dimensiunea de editare este data de PICTURE;
     - daca dimensiunea data prin clauza PICTURE este mai mare decât cea dată prin SIZE, campul get va defila în regiunea de editare.
     Clauza SIZE se foIoseşte în general pentru câmpurile tip memo.
     Clauza VALID este o clauză cu importanţă deosebitä deoarece cu ajutorul ei se poate veritica introducerea şi nu se permite decât introducerea (in bazele de date a acelor valori care satisfac anumite condiţii impuse datelor din baze de date .respective.
    CIauza VALID acceptă ca parametru o expresie care poate fi de tip logic sau numeric. În cazul unei expresii de tip logic se verillcă expresia şi valoarea introdusă este validată (admisă) numai dacă exprersia logică are valoarea .T. Altfel se va afişa mesaj de eroare şi se va reveni în câmpul de editare.
    O facilitate deosebită a clauzei VALID este faptul că în alcătuirea expresiei se admit funcţii definte utilizator.
Exemplu:
CLEAR
SET TALK OFF
         STORE 0 to a,b,c
         @ 10,10 SAY 'lntroduceţi numerele'
         @ 10,32 GET a picture '@Z 99999'
         @ 10,40 GET b picture '@Z 99999' VALID b<a
         NOTE se admit doar numere mai mici decât cele anterioare
         @ 10,50 GET c picture '9' valid CONTROL(b)
         NOTE se admite doar cifra de control a lui b
         READ
         @ 12,10 SAY 'Numărul cu cifră de control este:'
         @ 12,50 say b
         @ 12,55 say c
         return
         FUNCTiON CONTROL
         NOTE se defineşte procedura control
         ....................
         Return
         În cazul în care nu se validează introducerea şi dorim un alt mesaj decât cel afişat de sistem, atunci putem folosi clauza ERROR după care se indică mesajul (care-l va înlocui pe cel standard -mesajul este un şir de caractere).
        Clauzele COLOR şi COLOR SCHEME determină culorile utilizate pentru introducerea datelor.
        Comenzite SAY şi GET pot fi grupate într-o singură comandă în următoarea formă:
        @ lin,col SAY expr.......... GET var .......
        Exemplu:
        @ 10,10 SAY 'lntroduceţi numele' get nume pict '@!';
        DEFAULT " "
5.3 Obiecte de control

       Interfaţa FoxProW este prevăzută cu o serie de obiecte de control (ma simplu controle) care fac conversaţia sistem – utilizator mai plăcută şi mai eficientă, mai comodă.
Există 8 tipuri de controale în FoxPro şi anume:
       - câmpuri de editare cu butoane de incrementare-decrementare – aceste obiecte sunt de fapt câmpuri de editare a unor valori numerice, cărora li se atribuie două butoane cu funcţia de incrementare şi decrementare a valorii numerice editate.
       - comutatoare - utilizate pentru a selecta dintre două valori posibile, adevărat sau fals. Apar pe ecran ca nişte căsuţe cu explicaţii în dreapta lor şi cu căsuţă asociată care are două valori posibile:spaţiu sau x şi în care "x" indică starea activată a comutatorului.

|   |   ALL files

             | x |   Read Only

              |   |    Environment

          |   |    Other Code Page

- liste – permit alegerea unui element dintr-o mulţime finită, afişată pe ecran în interiorul unui cadru care are ataşată o bară de defilare.
             


- lista ascunsă – este asemănătoare cu lista, cu deosebirea că pe ecran se vede doar elementul curent al listei. La activare (elegere) lista ascunsă este expandată în vederea alegerii de către utilizator a elementului dorit:

List Files of Type

| Table/DBF |
- declanşatoarele - apar pe ecran sub forma unor butoane şi sunt utilizate pentru a declanşa anumite acţiuni. Operaţia declanşată este afişată pe ecran:
|   New     | |  Open    |
- declanşatoarele invizibile - sunt nişte declanşatoare care pot fi acoperite de text (invizibiie) dar nu îşi pierd calitatea de declanşator.
- butoanele radio - un singur buton (dintr-un grup) poate fi activ la un moment dat. Starea activată este anunţată de un punct ce apare în interiorui butonului. La activarea unui buton se dezactivează un altul:
1. Câmpurile numerice cu butoane

Editarea câmpurilor numerice se poate face cu ajutorul comenzilor GET. În varianta sub Windows se pot folosi câmpurile de editare cu butoane de incrementare decrementare care se crează cu comanda:
@ lin,col GET var | câmp
SPINNER expn1 [,expn2] [,expn3]
[FUNCTION expc1] [PICTURE expc2]
[SYZE expn1,expn2] [FONT expc3 [;expn3] ]
[STYLE expc4] [DEFAULT expr1]
[ENABLE] [DISABLE] [MESSAGE expc5]
[[OPEN] WINDOW fereastră] [RANGE [expr2] [,expr3] ]
[SIZE expn2,expn3] [VALID expl1| expn4]
[ERROR expc6] [WHEN expl2]
[COLOR SCHEME expn4 [ COLOR listă perechi culori]
Comanda diferă de editarea câmpurilor GET simple prin clauza SPINNER în care: expn1 reprezintă valoarea cu care se va incrementa respectiv decrementa valoarea numerică în curs de editare, expn2 reprezintă limita inferioară a valorii de editare iar expn3 iimita superioară.
Exemplu:
@ 10,10 GET b DEFAULT 0 picture '@Z 999999'
SPINNER 100,0,50

           2. Comutatoarele

        Comutatorul permite citirea datelor care au două valori posibile (masculin sau feminin de exemplu). Pe ecran apare printr-o căsuţă patrată conţinând caracterul x sau blanc şi în dreapta un text explicativ.
        Pentru crearea unui comutator se utilizează comanda GET obişnuită, dar în variabila "var" sau câmpul de editare, trebuie să fie un câmp numeric sau logic. În cazul tipului numeric valoarea 0 indică comutator neactivat, iar una diferită de 0 indică comutator activat respectiv .F. neactivat şi .T. activat.
       Pentru a specifica că este vorba de un comutator, în clauza FUNCTION sau PICTURE codul specific va fi "*C" urmat, la distanţă de un spaţiu de textul explicativ al comutatorului.
       Exemplu:
       CLEAR
       select=.T.
       @ 10,10 GET select FUNCTION '*C Selectat'
       linia a treia poate fi înlocuită cu una din următoarele două:
       @ 10,10 GET select PICTURE '@*C Selectat'
       @ 10,10 GET select FUNCTION '*C' PICTURE 'Selectat'
       Activarea unui comutator poate determina terminarea comenzii READ curente. Pentru aceasta sunt utilizate codurile FUNCTION "N" şi "T", primul ducând la terminarea comenzii READ (implicit), iar 'T' determinând terminarea comenzii READ în cazul activării comutatorului.
      O altă facilitate implementată pentru acest obiect este tasta directă de alegere. Aceasta este o tastă care permite alegerea comutatorului respectiv, imediat ce a fost aleasă. Pentru acesta în clauza PICTURE sau FUNCTION se vor folosi caracterele "\<".
Exemplu:
CLEAR
STORE .F. to terminat,corectat,selectat
@ 10,10 GET terminat FUNCTION '*C \<Terminat'
@ 10,10 GET corectat FUNCTION '*C \<Corectat'
@ 10,10 GET selectat FUNCTION '*C \<Selectat'
READ
Tastele directe de alegere sunt T,C,S care sunt afişate distinct (cu altă culoare).
Pentru dezactivarea accesului la un comutator se pot folosi două caractere succesive "\\"
Exemplu:
alfa=.T.
@ 10,10 GET alfa FUNCTiON '*C \\<Pozitiv'
READ
      La specificarea culorilor comutatorului folosind clauzele COLOR SCHEME şi COLOR, vom avea următoarea semnificaţie a culorilor în cadrul unei scheme de culori:

      La specificarea culorilor comutatorului folosit clauzele COLOR SCHEME şi COLOR, vom avea următoarea semnificaţie a culorilor în cadrul unei scheme de culori:             


Număr pereche
Elementul controlat
1-4
Nefolosite de comutator
5
Mesajul clauzei MESSAGE
6
Comutatorul selectat
7
Tastele directe de alegere
8
Nefolosită de comutator
9
Comutator cu acces activat
10
Comutator cu acces dezactivat
       Exemplu:
       color=1
       @ 10,10 GET color FUNCTION '*C \<Colorat';
       COLOR ,,,,W+/Rb,W/R,GR+/B„W+/B,W/B
       READ

              3. Lista

       Pentru a alege un element dintr-o listă ce este afişată pe ecran se folosesc tastele direcţionale după care se apasă tasta ENTER. Dacă lista este doar parţial afişată pe ecran, în dreapta cadrului va apărea o bară de defilare prin care se va indica porţiunea listei care este afişată curent pe ecran.
       Sintaxa comenzii GET cuprinde o nouă clauză şi anume:
       FROM masiv [RANGE expn1 [,expn2]] | POPUP submeniu
      Selecţia este memorată într-un masiv (cu variabila var) sau într-o bază de date desemnată prin câmp. Var sau câmp trebuie să fie numerice sau şir de caractere. Dacă var sau câmp sunt numerice, ea memorează poziţia din listă a elementului selectat, iar dacă ele sunt şiruri de caractere, se va memora chiar elementul respectiv în listă.
      Elementele listei pot fi preluate dintr-un masiv, când se foloseşte clauza FROM sau dintr-un submeniu la folosirea clauzei POPUP.
      - dacă masivul este unidimensional, elementele listei vor fi încărcate în ordine din masiv. ,
      - dacă masivul este bidimensional, elementele vor fi preluate din prima coloană a masivului, următoarele fiind ignorate.
     Pentru a alege doar elementele dintr-o portiune a masivului ca elemente ale listei, se utilizează clauza RANGE în care expn1 desemnează elementui de masiv ce se va încărca în primul element al listei, iar expn2 numărul de elemente ale listei care vor fi preluate din masiv.
     Dacă masivul este bidimensional, clauza RANGE functionează astfel: se selectează în listă elementele masivului începând cu al expn1-lea element inclusiv (numerotarea începând cu linia 1 col 1 până la linia 1 col n urmând în continuare linia 2 col 1 fiind numerotat cu n+1 şamd) şi continuând cu elementete de sub acesta pe coloană până se selectează expn2 elemente sau până la sfârşitul coloanei, dacă expn2 lipseşte.
     Exemplu: presupunem masivul:

          a1,    a2,   a3,   a4          Clauza RANGE 7,2 va avea ca efect selecta-
          a5,    a6,   a7,   a8          rea elementelor a7,a11,a15.
          a9,  a10, a11,  a12          Prin modificarea masivului sau a structurii
          a13,a14, a15,  a16          sale, se va modifica şi lista corespunzătoare.

    Codul FUNCTION al acestui obiect este caracterul "&", acesta indicând faptul că respectiva comandă GET declară o listă şi nu un GET simplu.
    Pentru a preciza că obiectul este unul terminal (celelalte obiecte nu vor mai fi citite la ieşirea din READ) se foloseşte codul FUNCTION "'T" ("N" pentru element neterminal). Deci FUNCTION '&T' sau PICTURE "@&T' indică un obiect terminal iar FUNCTION '&N' sau PICTURE '@&N' indică un obiect neterminal.
    Clauza SIZE determină porţiunea de pe ecran ocupată de listă în care expn3 dă număru! de !inii ocupate, iar expn4 numărul de coloane. Dacă în listă sunt mai multe elemente decât permite regiunea definită, atunci în latura dreaptă va apărea o bară de defilare.
    Culorile folosite pentru afişarea listei sunt precizate prin clauzele cunoscute, în care corespondenţa dintre lista de perechi de culori şi elementele listei controlate de acestea este dată mai jos:

Număr pereche
Elementul controlat
1
Opţiune neactivată
2
Opţiune activată
3
Chenarul şi bara de defilare
4
Neutilizat în listă
5
Mesajul
6
Elementul selectat al listei
7-8
Neutilizat în listă
9
Listă cu acces permis
10
Listă cu acces nepermis
         Restul clauzelor sunt cele obişnuite.
         Exemplu:
         CLEAR
         DIMENSION CUL(8)
         CUL(1)='Negru'
         CUL(2)='Albastru'
         CUL(3)='Verde'
         CUL(4)='Albastru deschis'
         CUL(5)='Roşu'
         CUL(6)='Violet'
         CUL(7)='Maro'
         CUL(8)='Gri'
         cul='Negru'
         @ 10,10 SAY' Alegeti culoarea dorită' Get cul ;
         FUNCTION '&' FROM culoare SIZE 5,20 MESSAGE ;
         'Culori 'VALID cul # 'Gri'
         READ
         Clear
         @ 10,10 SAY 'Culoarea aleasă este '
         ??cul

                4. Lista ascunsă

        Utilizarea listei ascunse se face mutând cursorul din câmp în câmp (folosind TAB sau SHIFT până la selectarea listei ascunse când se apasa ENTER sau SPACE lista fiind astfel expandată. Se folosesc săgeţile direcţionale, după care se apasă ENTER sau SPACE pentru alegere. Comanda este cea standard diferind codul FUNCTION care este "^". În comandă var este o variabilă sau un element de masiv iar câmp este un câmp al unei baze de date care este folosit pentru a memora opţiunea utilizatorului, la alegerea unui element din listă şi el, trebuie să fie de tip numeric sau un şir de caractere.
       Dacă este un câmp numeric, va memora poziţia elementului ales, iar dacă este un şir, în variabilă se va memora chiar elementu! solicitat. Valoarea iniţială a variabilei va determina poziţia iniţială a cursorului în cadrul listei (elementul curent).
       În clauzele FUNCTION sau PICTURE se precizează lista ascunsă în care elementele sunt separate prin ";" şi codul FUNCTION.
       Exemplu:
       CLEAR
       cul=1
       SET TALK OFF
       @ 10,10 GET cul FUNCTION '^T AIb;Verde;Rosu;Negru'
       NOTE listă ascunsă terminală
       b=1
       @ 10,10 GET b FUNCTION '^N Satisfăcător;Bine;Foarte bine'
       Note listă ascunsă neterminală
       READ
       Pentru a specifica o listă ascunsă se pot folosi următoarele combinatii:
       FUNCTION '^' PICTURE 'Satisfacator;Bine;Foarte bine'
       FUNCTION '^ Satisfacator;Bine;Foarte bine'
       PICTURE '@^ Satisfăcător;Bine;Foarte bine'
       FUNCTION ' Satisfăcător;Bine;Foarte bine ' PICTURE '@^'
       De asemenea se pot introduce codurile T şi N pentru liste terminale şi respectiv liste neterminale. Dacă se foloseşte codul N sau nu se utilizează un astfel de cod, atunci lista nu va fi terminală şi după alegerea elementului dorit se va continua cu citirea următoarelor câmpuri GET,
      Selectarea unui taste directe se poate face prin includerea în faţa elementului în şiru! de caractere FUNCTION sau PICTURE a caracterului backslash, Exemplu:
      FUNCTION '^ \<Alb; \<Verde;AI\<bastru'
      Selectarea în acestă listă ascunsă se poate face apăsând A,V,b.
      Codul backslash introdus înaintea unui element, dezactivează accesul la acel element.  Acest element va apărea pe ecran cu alte culori decât celelalte
      FUNCTION '^\<Alb; \<Verde;\\Albastru'
      Din listă se pot selecta doar elementele Alb şi Verde.
     Clauza FROM determină ca elementele din listă să fie preluate dintr-un masiv (asemănător cu cele prezentate la listă în secţiunea anterioară).
      Clauza COLOR şi COLOR SCHEME pot de desemna două scheme de culori, prima controlează afişarea listei ascunse în starea selecatată şi a mesajului, iar a doua, afişarea opţiunilor listei şi a chenarului. Diferitele perechi de culori au următoarele semnificaţii:

per
Elementul controlat
1
Opţiune cu acces nepermis (în schema a doua – expn8)
2
Opţiune cu acces permis (expn8)
3
Chenarul (expn8)
4
Neutilizat
5
Mesaj dat prin MESSAGE
6
Elementul selectat (expn8) Liastă ascunsă selec (expn7)
7
Tastă directă
8
Nefolosit
9
Listă ascunsă cu acces permis (expn7)
10
Listă ascunsă cu acces nepermis (expn7)
                         5. Declanşatoarele

Declanşarea unui declanşator are ca efect o anumită acţiune iar ca efect grafic, schimbarea culorilor acestuia.
Comanda de definire a declanşatoarelor este cea obişnuită (GET) prin care se pot defini mai multe declanşatoare.
     Memorarea opţiunii utilizatorului se face în elementul de masiv sau variabila var, sau într-un câmp a! unei baze de date. Valoarea dacă este de tip numeric, va memora numărul de ordine al declanşatorului iar dacă este de tip şir de caractere va memora textul declanşatorului. Codul FUNCTION specific este asteriscul care indică comenzii GET că obiectul respectiv este un declanşator. Definirea se face clauzele FUNCTION sau PICTURE:
       FUNCTION '*' sau PICTURE '@* '
      În cadrul şirului de caractere introdus după clauza FUNCTION sau PICTURE se introduc şi textele asociate declanşatoarelor definite, separate prin ";". Lista declanşatoarelor se plasează la sfârşitul şirului de caractere al codului FUNCTION sau PICTURE şi este separată prin spaţiu de restul codurilor. Numărul declanşatoarelor va fi acelaşi cu numărul elementelor introduse în clauza FUNCTION.
       Exemplu:
       CLEAR
       d='Pornit'
      @ 10,10 GET d FUNCTION '* Pornit;Oprit;Pauza'
      NOTE defineşte trei declanşatoare Porinit, Oprit, Pauza
      READ
      Declanşatoarelor li se pot atribui şi caracteristici speciale prin codurile T sau N (terminal sau nu), codurile H (poziţie orizointală a declanşatoarelor) sau V (verticală) sau codurile \< (pentru taste directe de acţionare) şi \\ (pentru dezactivarea declanşatorului).
       Se pot stabili de asemenea două declanşatoare care să aibă caracterisl speciale:
- declanşatorul implicit – este ales automat la apăsarea tastelor CTRL + ENTER. Acest declanşator este afişat deosebit de celelalte. El se poate selecta folosind combinaţia "\!" plasată înainte de textul declanşatorului;
          - declanşatorul ESCAPE – care este acxţionat la apăsarea tastelor ESC şi nu apare afişat distinct pe ecran. El se semnalează prin combinaţia "\?" în faţa textului declanşatorului.
         Exemplu:
         CLEAR
         d=1
         @ 10,10 get d FUNCTION '*\!\<Pornit; \<Oprit; \?\ <Anulat'
         READ
         Sunt definite trei declanşatoare ce pot fi activate cu tastele directe P, O şi A primul fiind declanşator implicit, iar ultimul fiind declanşator ESCAPE.
         Clauza SIZE a comenzii GET pentru declanşatoare se foloseşte astfel:
         Expn1 – nu se foloseşte (dar este obligatoriu, valoarea nu interesează);
        Expn2 – determină lăţimea de afişare a declanşatoarelor, dacă lungimea textului este mai mare decât expn2, lăţimea este dată de lungimea textului;
        Expn3 – se foloseşte pentru a indica spaţiul dintre declanşatoare în cadrul unui grup, expn3 reprezentând numărul de linii (coloane la delanşatoarele aşezate pe verticală) dintre două declanşatoare.
       Clauza COLOR sau COLOR SCHEME stabileşte culorile acestor obiecte după următoarele reguli:

Număr pereche
Elementul controlat
1-4
Nefolosite de declanşator
5
Mesaj dat prin MESSAGE
6
Declaşator selectat
7
Tastă directă de selecţie
8
Nefolosit
9
Declanşator cu acces permis
10
Declanşator cu acces nepermis

                      6. Declanşatoare invizibile

        Acest declanşator se aseamănă cu cel anterior în continuare se vor prezenta doar clauzele care diferă.
Clauzele FUNCTION şi PICTURE vor conţine codul specific care este "*I". Exemplu:
        CLEAR
        d=1
        @ 10,10 GET d FUNCTION '*IH ;;; ' SIZE 4,4,4
       NOTE Se definesc patru declanşatoaree invizibile, primul este poziţionat la oordonatele 10,10. Variabila d va memora numărul declanşatorului invizibil selectat.
       READ
       Următoarele clauze pot fi folosite exclusiv în definirea acestor declanşatoare:
       PICTURE '@*I;;;'
       FUNCTION '*l' PICTURE ;;;'
       FUNCTION ';;;' PICTURE '@*l'
       De asemenea se pot utiliza codurile T şi N, H şi V.

                   7. Butoane Radio

       Acest tip de obiect este specific peraţiei de selectare a unui element dintr-o mulţime, astfel încât numai unul din ele să fie selectat la un moment dat.
       Butoanele radio se prezintă pe ecran prin cercuri, la dreapta cărora există texte explicative. În interiorul unuia din cercuri este poziţionat un punct ceea ce arată că el este selectat.
       Comanda GET care defineşte butoane este cea standard precizată înainte. Selecţia utilizatorului va fi memorată în "var" care trebuie să fie numerică sau şir de caractere. În cazul unei valori numerice, aceasta indică numărul d ordine al butonului selectat, iar dacă ea este un şir de caractere, acesta va memora textul explicativ asociat.
      Specificarea acestui tip de obiect se face folosind codul specific în clauzele FUNCTION şi PICTURE care este "*R" sau "*R" în clauza PICTURE.
       Specificarea textului explicativ pentru fiecare buton radio se face printr-o lisă care conţine textele respective, separate prin caracterul ";" care este separată de codul FUNCTION printr-un blanc.
      Ca şi la comutatoare, se pot folosi următoarele coduri cu clauzele FUNCTION şi PICTURE:
- "N" - butoane radio neterminale;
- "T" - butoane radio îerminale;
- "H" - butoane radio plasate orizontal (unul lîngă altul);
- "V" - butoane radio verticale (unul sub altul);
- "\<" - se introduce înaintea unuia din caracterele textului explicativ, specificând tasta directă de selectare a butonului radio;
- "\ \" - se introduce în acelaşi mod ca cel precedent, pentru ca butonul să.nu poată fi accesat (dezafectează butonul).
Exemplu:
          CLEAR
          A = 'luni' @ 10,10 GET a FUNCTION '*RTV \ <Luni;\ <Marti;M\<iercu'+;
ri;\<Joi;\<Vineri;\\<Sambata;\\<Duminica'
READ
          În exemplu sunt definite şapte butoane radio, reprezentând zilele săptămânii şi pentru fiecare se defineşte o tastă de selectare, ultimele două butoane fiind dezactivate. Clauza DEFAULT permite crearea variabilei "var" şi iniţializarea sa. Clauza SIZE controlează lăţimea butoanelor (înălţimea fiind 1), cât şi distanţa dintre ele. Accesul este permis sau oprit prin clauza ENABLE respectiv DISABLE. Pentru a afişa un text explicativ în cadrul unui grup, va fi folosită clauza MESSAGE.
         Culorile de afişare pot fi definite prin clauzele COLOR şi COLOR SCHEME aşa cum se vede în tabelul următor:

           Număr pereche Elementul controlat
               1-4                Nefolosite de declanşator
                 5                 Mesajele clauz. MESSAGE
                 6                 Buton radio selectat
                 7                 Tastă directă de selecţie
                 8                 Nefolosit
                 9                 Buton radio acces permis
      10                Buton radio acces nepermis

          Clauzele ce nu au fost descrise, au aceeaşi semnificaţie aşa cum a fost prezentată la celelalte obiecte din câmpurile GET.

                            8. Regiunile de editare text

         Acest obioect permite editarea textelor dintr-o anumită porţiune a ecranului special destinată acestui scop. În această regiune a ecranului se pot folosi toate comenzile de editare FoxPro, inclusiv cele referitoare la blocuri de text (selectarea unor zone, copierea lor, mutarea, depunerea acestor zone text).
Comanda cu care se definesc aceste zone de editare text este:
@ lin,col EDIT var | câmp
[SIZE expn1,expn2] [,expn3]
[FUNCTION expc1] [FONT expc2] [,expn4]
[STYLE expc3] [DEFAULT expr]
[ENABLE] [DISABLE] [MESSAGE expc4]
[VALID expl1| expn5] [ERROR expc5]
[WHEN expl2] [NOMODIFY] [SCROOL] (TAB]
[COLOR SCHEME expn6COLOR listă perechi culori]
Pentru a termina editarea şi a trece la următorul câmp GET se foloseşte tasta TAB sau combinaţia de taste CTRL+TAB pentru a salva noul conţinut al textului, sau tasta ESC pentru a părăsi câmpul de editare fără salvare.
Memorarea textului ce se editează se face în variabila "var" o variabilă, un element de masiv sau un câmp al unei baze de date. Acestea trebuie să fie de tip şir sau de tip memo.
Regiunea de editare începe în linia lin şi coloana col, clauza SIZE specificând dimensiunea zonei, expn1 determinând înălţimea iar expn2 lătimea zonei de editare exprimată în linii respectiv coloane.
În cazul în care expn1 = 1 se obţine o zonă de o linie ce are caracteristici speciale; se poate defila textul pe direcţia orizontală, iar apăsarea tastei ENTER are ca efect terminarea editării şi trecerea la următorul câmp GET.
În dauza S!ZE se poate introduce expresia expn3 care indică numărul maxim de caractere ce se pot edita în această regiune.
Exemplu:
CLEAR
Text = 'Text editat cu comanda EDIT'
@ 10,10 ED!T text SIZE 4,24
READ
Clauza FUNCTION poate conţine două coduri, referitoare la aliniere: "I" secifică centrarea textului, "J" specifică alinierea la dreapta a textului. Implicit alinierea este la stânga, acest tip de cod neexistând.
Clauza DEFAULT permite crearea unei variabite care va memora textul introdus de utilizator, în cazul când aceasta nu exista anterior execuţiei comenzii EDIT. De asemenea cu această clauză se iniţializează variabila nou creată valoarea ei va fi dată de "expr". Clauza este ignorată dacă variabila exista anterior.
Clauza ENABLE (implicită) şi DISABLE se folosesc pentru a activa respectiv dezactiva accesul la obiect iar clauza MESSAGE, pentru a afişa unele informaţii în tipul editării textului.
Clauza VALID permite verificarea anumitor condiţii impuse textului editat dacă este o expresie logică, iar dacă este o expresie numerică valoarea 0 indică rămânerea în zona de editare pe când o valoare diferită de 0 produce saltul la câmpul get indicat de valoare (înainte sau înapoi după cum valoarea este pozitivă sau negativă).
         Testările complexe asupra textului introdus pot fi făcute prin una sau mai multe funcţii definite de utilizator.
         Evaluarea expresiei logice a clauzei VALID se face la ieşirea din zona de editare text. în cazul în care valoarea expresiei este .T., se execută salvarea după care se trece la următorul câmp GET. Dacă valoarea expresiei este .F. se afişează un mesaj de eroare, urmând să se continiie editatea pentru corectarea introducerii. Dacă imediat după afişarea mesajului se apasă tasta ESC se execută salvarea noului conţinut (chiar dacă aceasta nu corespunde). Apăsarea tastei ESC în zona de editare text (exceptând cazul anterior) are ca efect renunţarea la noul conţinut adică textul introdus nu se salvează în variabila "var",
        Clauza ERROR permite modificarea mesajului de eroare. Clauza WHEN permite sau opreşte accesul la regiunea de editare text, funcţie de anumite condiţii prevăzute în expl2. Dacă expl2 este evaluată ca .T. se permite accesul la regiunea de editare, altfel nu, sărindu-se la următoml câmp GET. În expresia expl2 (ce urmează clauzei WHEN) este de asemenea posibilă utilizarea unor funcţii definite utilizator.
       Pentru a vedea conţinutu! unei variabile, câmp sau element de masiv într-o regiune de editare text, fără ca acesta să poată fi modificat se indude clauza NOMODIFY.
       Clauza SCROOL se foloseşte pentru plasarea în dreapta regiunii de editare a unei bare de defilare cu ajutorul căreia se poate defila de-a lungul paginii de text mai mari decât regiunea de editare.
      Clauza TAB se foloseşte pentru a introduce caractere TAB în textul editat. Acesta face ca apăsarea tastei TAB să nu determine ieşirea din zona de editare ci să introducă un TAB (chr(9)) în cadrul textului. Pentru ieşire în acest caz se va utiliza CTRL+TAB.
      Clauzele COLOR şi COLOR SCHEME precizează culorile conform tabelul următor:
                      Număr pereche Elementul controlat

                          1,4,7-9            Nefolosite de declanşator
                               2                Regiune de edit. accesibilă
                               3                Bară de defilare
                               5                Mesaj clauză MESSAGE
                               6                Regiune de edit. selectată
  10               Regiune de edit. inaccesib.
5.4 Comanda READ

Comenzile GET şi EDIT doar definesc câmpurile, nu declanşează citirea lor, aceasta urmând să se facă prin comanda READ.
Citirea câmpurilor se face printr-o zonă de memorie cu organizare FIFO (First in First out - primul intrat, primul ieşit) simbolizată prin exemplul următor:
Presupunem trei câmpuri get citite printr-o comandă READ
@... GET câmp1
@... GET câmp2
@... GET câmp3
READ

                  GET 1                                                      | G1 |
                  GET 2                                  | G2 |
                  GET 3           | G3 |

Citirea propriuzisă se realizează cu comanda READ care preia cele trei câmpuri din zona de memorie definită, câmpurile GET unul câte unul în ordinea definirii respectând organizarea FIFO. Saltul la câmpul următor se realizează când câmpul a fost complectat sau prin tastarea tastei ENTER, iar saltul la cel anterior prin tastarea SHIFT+TAB sau a tastei direcţionale ­.
Comanda READ are următoarea sintaxă:
READ [CYCLE] [ACTIVATE expl1] [DEACTIVATE expl2]
[MODAL] [WITH listă ferestre] [SHOW expl3]
[VALID expl4 | expn1] [WHEN expl5]
[OBJECT expn2] [TIMEOUT expn3] [SAVE] [NOMOUSE]
[LOCK | NOLOCK] [COLOR listă | COLOR SCHEME expn4]
Ieşirea din câmpul GET se face odată cu complectarea ultimului câmp GET (dacă nu este precizată clauza CYCLE) sau la apăsarea tastei ESC sau CTRL/W. Clauza CYCLE determină continuarea comenzii READ după ieşirea din ultimul câmp GET cu primul câmp (reluarea în ciclu a citirii). Terminarea în acest caz se va face la apăsarea tastei ESC şi CTRL/W sau la terminarea limitei de timp din clauza TIMEOUT.
Clauza VALID este urmată de o expresie numerică sau logică care este evaluată la ieşirea din comenda READ astfel:
  • valoarea expresiei este .T. – comanda READ se încheie;
  • valoarea este .F. - nu se permite ieşirea şi cursorul rămâne în câmpul get care rămâne câmp curent.
         Dacă expresia este numerică cursorul se poziţionează pe câmpul care are numărul egal cu valorea expresiei dacă el există, iar dacă nu comanda read se încheie. În cazul în care expresia clauzei valid este de a!t tip, comanda se încheie.
         Exemplu: Se citesc două cifre strict pozitive de maxim două cifre, primul număr fiind mai mic decât al doilea iar suma egală cu 11.
SET TALK OFF
CLEAR
store 0 to a,b
@ 10,10 say 'lntroduceti primul număr' get a picture '99' valid a>0
          @ 12,10 say 'lntroduceti al doilea număr' get b;
          picture '99' valid a<b .and. a+b=11 and b>0
          READ
          ?a, '<' ,b ,' si', a,'+', b ,'=', a+b
           sau se poate folosi varianta:
          SET TALK OFF
          CLEAR
          store 0 to a,b
          @ 10,10 say 'lntroduceti primul număr' get a picture '99' valid a>0
          @ 12,10 say 'introduceti al doilea număr' get b;
          picture'99'valid b>0
          READ VALID a<b.and.a+b=11
          ?a,' <' ,b,' si', a,' +', b,' =,' a+b
         O clauză VALID a unei comenzi READ poate conţine o funcţie utilizator (sau mai multe) în care s-a indus o comandă READ. În acest caz obţinem două nivele de READ (READ-uri imbricate), prima comandă având nivelul 1 iar cea de a doua nivelul2.
         Clauza WHEN este folosită pentru ca o comandă READ să fie executată numai în anumite condiţii prevăzute în expresia logică ce urmează acestei clauze. Comanda read va fi executată dacă condiţia este evaluată ca .T.
         Clauza OBJECT dacă este prezentă face ca să poată fi citit un alt câmp decât primul definit (dacă este absentă clauza se citesc câmpurile în ordinea definirii). Câmpul citit va fi cel care are numărul de ordine egal cu expn2 (expresia ce urmează clauzei).
          NOMOUSE - nu permite utilizarea mouse-ului
          TIMEOUT expn3 - limitează timpul şi termină comanda în timpul specificat.
Câmpurile editate în acest timp sunt salvate, restul nu.
         Clauzele ACTIVATE, DEACTIVATE, MODAL, şi WITH se referă la lucrul cu ferestre, iar clauza SHOW va fi prezentată şi ea în paginile următoae.
Pentru a afla cum s-a încheiat ultima comandă READ şi în general orice comandă de editare se poate utiliza funcţia READKEY() cu sintaxa:
READKEY [expn]
Funcţia returnează o valoare numerică ce corespunde tastei apăsate pentru ieşirea dintr-o comandă de editare (APPEND, BROWSE, CHANGE, CREATE, EDIT, INSRERT.MODIFY şi READ).

Tabelul de mai jos dă codurile retumate şi tasta ce determină aceasta:
Tasta de terminare

Valoare retur
S-au    Nu s-a
modif.  modif.
Sernnificaţie

Backspace, săgeată stânga, CTRL+H, CTRL+S

0

256

inapoi un caracter

Săgeată dreapta, CTRL+D, CTRL+LCTRL+L

1

257

Inainte un caracter

Home, CTRL+A

2

258

Inapoi un cuvânt

End, CTRL+F

3

259

Inainte un cuvânt

Săgeată sus, Ctrl+End, Shift+Tab, Ctrl+K

4

260

Inapoi un câmp

Săgeată jos,Ctrl+X, Tab, Ctrl+Enter, Ctri+I, Ctrl+J

5

261

Inainte un câmp

PgUp, Ctrl+R

6

262

Inapoi un ecran

PgDn, Ctrl+C

7

263

Inainte un ecran

Ctrl+săgetă stânga

8

264

Umplut

Ctrl+Q, Escape

12

268

leşire fără salvare

Ctrl+End, + Ctrl+W

14

270

ieşire cu salvare

Enter,Ctrl+săgetă dreapta, Ctrl+M

15

271

Enter sau umplut

TIMEOUT

20

276

Timeout

Ctrl+HOME, Ctrl+

33

289

-

Ctrl+PgUp
++PgUp

34

290

,

Ctrl+PgDn

35

291

-

F1

36

292

Tasta Help

Dacă se introduce ca parametm al funcţiei expresia numerică expn, acesta va lua o valoare corespunzătoare modului în care s-a terminat omanda READ anterioară.
        Vom avea următoarele semnificaţii:

Valoare
Tipul terminării
2
Com. CLEAR READ
3
un obiect terminal
4
dat. închiderii ferestrei
5
val .T. returnată de clauza DEACTIVATE
6
Datorită TIMEOUT
1
Nici unul din caz. anter.
Prin funcţia READKEY se poate vedea modul de terminare al comenzii READ şi felul în care s-a terminat această comandă.
       Una din facilităţile importante ale citirii de date prin comenale GET - READ o reprezintă clauza VALID şi clauza WHEN ce pot conţine funcţii definite de utilizator. În continuare vom da un exemp!u de comezi READ imbricate pentru a lămuri acestă problemă:
CLEAR
@ 10,10 SAY 'Nume' GET nume DEFAULT space(15);
VALID NOT EMPTY(nume)
@ 11,10 SAY 'Prenume' GET pren DEFAULT space(20);
VALID NOT EMPTY(pren)
@ 12,10 SAY 'Sex' GET sex DEFAULT .F.
@ 13,10 SAY 'lnaltime' GET inalt DEFAULT 0 Pict '9.99';
WHEN sex = .T. VALID NOT EMPTY (inalt)
@ 14,10 SAY 'Greutate' GET greu ' DEFAULT 0 PICT '9999';
WHEN sex=.F. VALID NOT EMPTY (greu)
READ
Acesta este o metodă de rezolvare. Vom da în continuare o altă metodă în care se introduc comenzile READ imbricate;
CLEAR
@ 12,10 SAY 'Sex' GET sex DEFAULT .F. VALID test
         read
            FUNCTION TEST
        @ 10,10 SAY 'Nume' GET nume DEFAULT space(15)
        @ 11,10 SAY 'Prenume' GET pren DEFAULT space(20)
        @ 13,10 SAY 'lnaltime' GET inalt DEFAULT 0 PICT '9.99';
        WHEN sex=.T.
        @ 14.10 SAY 'Greutate' GET greu DEFAULT 0 P!CT '999';
        WHEN sex=.F.
        READ
        IF EMPTY(nume) .or. EMPTY(pren) .or. (EMPTY(inalt) .and.;
         sex=.T.) .or. (EMPTY(greu).and. sex=.F.)
        RETURN .F.
          ELSE
        RETURN .T.
        ENDIF

          Cele două exemple realizează acelaşi lucru şi anume citirea celor cinci câmpuri GET. Primul are o structură clasică, cel de al doilea având o structurâ mai complicată conţinând un read imbricat.
În ceea dea a doua comandă din ultimul program este citit câmpul GET sex ce va fi citit cu comanda READ din linia următoare. Următoarele linii definesc o funcţie utiiizator numită TEST. Trirniterea în acestă procedură se face la citirea datei din câmpul sex (prin clauza VALID) care pentru a încheia comanda READ are nevoie de rezultatul funcţiei TEST deci va efectua această funcţie prin care se fac restul citirilor şi este validată sau nu valoarea citită (sex) în ultimele linii ale functiei aceasta returnând .F. sau .T. după caz (câmp sex invalid sau respectiv valid).
Valoarea .F. sau .T. este returnată prin comanda RETURN,
În scopul aflării nivelului de READ curent se foloseşte funcţia RDLEVEL () care nu are parametrii şi care returnează o valoare naturală (0, - indică lipsa unei comenzi READ active, iar 1 şi aşa mai departe indică nivelul de READ activ).
Comanda cu sintaxa:
CLEAR READ [ALL]
termină read-ul de pe nivelul curent şi trece !a READ-ul de la nivelul anterior după ce a executat comenzile dintre READ-uri (dacă există). Folosind clauza ALL se vor termina toate READ-urile de pe toate nivelele.

 5.5 Comenzi şi funcţii pentru controlul câmpurilor GET

Număru! câmpuiui GET curent (care se af!ă în curs de editare} este depozitat în variabila sistem _CUROBJ. Această variabilă poate fi folosită atât pentru aflarea câmpului GET curent, cât şi pentru trecerea la citirea unui nou câmp GET, modificând valoarea variabitei pnntr-o instrucţiune de atribuire de forma:
_curobj = expn (unde expn este o expresie numerică întreagă)

Pentru aflarea numelui câmpului GET curent se utilizează functia VARREAD() (fara parametrii) care retumează un şir de caractere coţinând numele câmpului GET curent (în fereastra BROWSE, CHANGE, sau EDIT) sau al variabilei, elementului de masiv sau câmpului din baza de date (pentru un câmp GET simplu).
Acestă funcţie (VARREAD()) are o valoare identică cu funcţia SYS(18) care se poate folosi în acelaşi scop.
Exemplu:
@ 10,10 GET beta default 0 valid VARREAD()= 'beta'
READ
Cum VARREAD va lua valoarea 'beta' imediat ce se va introduce o valoare în această variabilă, introducerea prin READ se va încheia şi expresia clauzei VALID va lua valoarea .T..
Pentru a obţine numărul de ordine a! unui câmp GET se foloseşte functia:
OBJNUM(var ,expn])
Acestă funcţie retumează o valoare numerică reprezentând numărul de ordine al câmpului GET cu care se realizează citirea lui "var", care poate fi o variabilă, un element de masiv sau un câmp al unei baze de date. Dacă se include şi expresia expn, aceasta va avea semnificaţia nivelu!ui de READ în care se caută câmpu! GET respectiv.
Când un câmp GET a fost completat în întregime, se iese din editarea câmpului acestă acţiune fiind însoţită de un sunet scurt (BELL) dacă SET BELL este ON. Dacă SET CONFIRM este ON atunci se va aştepta (la completarea câmpului get) apăsarea tastei ENTER înainte de ieşirea din câmpul GET. Pentru setarea acestei confirmări se foloseşte comanda:
SET CONFIRM ON | OFF
care duce la confirmarea prin ENTER a introducerii (ON) respectiv nu (OFF când se va ieşi automat din câmpul GET la completarea câmpului.
Comanda: CLEAR GETS se foloseşte pentru a elimina din memorie toate câmpurile GET care urmează celui curent. Astfel citirea acestor câmpuri nu se mai face.
Comenzile SHOW GETS şi SHOW OBJECT se folosesc când se doreşte reafişarea unuia sau mai multor câmpuri GET, în urma modificării conţinutului sau a caracteristicilor acestora:
SHOW GET var [,expn1 [PROMPT expc] ]
[ENABLE | DISABLE] [LEVEL expn2]
[COLOR listă perechi | COLOR SCHEME expn3]
         Comanda reafişează câmpul GET identificat prin "var" care poate fi un câmp de editare simplu sau un obiect de control.
         Dacă se doreşte schimbarea textului explicativ sau a imaginii obiectului reafişat, se foloseşte clauza PROMPT urmată de şirul expc ce reprezintă noul text explicativ sau noua imagine asociată obiectului. Prin "expn1" se selectează numărul curent al obiectului din mulţimea definită cu comanda GET.
         Schimbarea stării elementului (activat, dezactivat) se realizează cu clauza ENABLE, DISABLE iar căutarea eiementului pe un alt nivel READ decât cel curent se specifică prin expresia "expn2". Culorile folosite se stabilesc prin clauzele COLOR sau COLOR SCHEME.
         O comandă asemănătoare este:
         SHOW OBJECT expn1 [PROMPT expc]
         [ENABLE | DISABLE] [LEVELexpn2]
         [COLOR listă perechi | COLOR SCHEME expn3]
         Această comandă selectează obiectul ce se reafişează prin numărui curent obiectului dorit, "expn1". Celelalte clauze au aceeaşi semnificaţie ca la comanda anterioară.

         Pentru reafişarea tuturor obiectelor se foloseste comanda:
         [ENABLE JDISABLE] [LEVELEXPNL] [OFF| ONLY]
         [WINDOW nume fereastră] [LOCK]
         [COLOR listă perechi | COLOR SHEME expn2]
Clauzele ENABLE şi DISABLE se folosesc pentru schimbarea caracteristicilor de acces ale tuturor obiectele care vor deveni toate accesibile (ENABLE) sau doar se vor vizualiza (DISABLE).
Clauza WINDOW se referă la lucrul cu ferestre fiind tratată în capitolul respectiv, iar LOCK intervine la lucrul în reţea.
Exemplu:
CLEAR
SET TALK OFF
DIMENSION den(2)
den(1)='!nversoare1
den(2)='Neinversoare'
@ 10,10 GET opt DEFAULT 'lnversoare' FROM den;
FUNCTION '&' SIZE 4,16
READ VAUD TEST()
FUNCTION TEST
IF opt='Inversoare'
a=den(1)
den(1)=den{2)
den(2)=a
ENDIF
SHOW GETS
RETURN .T.
Comanda READ poate fi prevăzută cu o clauză SHOW GETS (ca în exemplu) care este urmată de o expresie logică care poate fi o funcţie definită utilizator. La execuţia comenzii SHOW GETS, înainte de reafişarea obiectelor respective se va evalua expresia logică şi, dacă este .T. se va face reafişarea.
Valoarea rezultată în urma evaluării expresiei logice a clauzei SHOW nu este luată în considerare de FoxProW.
5.6 Comenzile ? şi ??

        Aceste comenzi sunt alte comenzi de afişare a datelor pe ecran sau imprimantă. Comanda calculează poziţia de afişare funcţie de poziţia curentă cursorului. Sintaxa comenzii este:
? | ?? [expr1] [PICTURE expc1] [FUNCTION EXPC2]
[at expn1] [FONT expc3 [,expn2]]
[STYLE expc4 [expr2] [,expr3....]
Comenzile afişează pe ecran rezultatul evaluării expresiilor "expr1", expr3 ...., cele două comenzi diferind doar prin modul de calcul al poziţiei de afişare a acestor valori şi anume comanda ? afişează acestă valoare începând cu prima coloană a următoarei linii în care se află cursorul în acel moment, iar comanda ?? în poziţia din care se află cursorul în acel moment.
Clauzele PICTURE şi FUNCTION stabilesc formatul de afişare al datelor iar clauza AT, indică coloana din care se va face tipărirea datei respective. Clauza FONT şi STYLE sunt utilizate pentru specificarea tipului de caractere şi a stilului de afişare utilizat.
Dacă se doreşte afişarea mai multor valori prin aceeaşi comandă se vor preciza variabilele de tipărit, separate printr-o virgulă (care vor fi afişate la un interval de un spatiu între ele, pe aceeaşi linie. Dacă nu se doreşte un spaţiu între acestea se poate folosi comanda;
SET SPACE OFF | ON în care OFF duce la absenţa spaţiului opţiunea implicită fiind ON
Pentru afişarea la imprimantă se vor folosi comenzile:
SET PRINTER ON | OFF în care ON determină ca ieşirile să se facă şi la imprimantă.
5.7 Comenzile *,&&, şi \,\\. TEXT... ENDTEXT

             Comenzile * şi && se folosesc pentru a introduce în programe comentarii iar comenzile \,\\, TEXT şi ENDTEXT sunt folosite pentru a introduce texte în programe, texte care sunt tipărite pe sistemul standard de ieşire.
            Dacă într-o linie, pe primui caracter diferit de spaţiu apare caracterui "*", atunci linia respectivă va fi considerată comentariu şi nu va fi interpretată de către compilator.
            Exemplu:
            CLEAR
            * Această linie este considerată comentariu
            RETURN
           Această metodă se poate folosi şi pentru a "şterge" din program anumite linii nenecesare fără ca ele să fie şterse efectiv.
           Dacă într-o linie FoxPro apar caracterele "&&" indiferent în ce poziţie, atunci toate comenzile care urmează acestor caractere se consideră comentariu şi nu vor fi luate în considerare de compilator. Acestă metodă este utilizată pentru a introduce comentarii care lămuresc funcţionarea comenzii aflate pe !inia respectivă.
           Exempiu:
           CLEAR && comanda şterge ecranul
           USE MFIXE INDE MFIXE && deschide baza de date
           RETURN && încheie executia programului,
           Comenzile \ şi \\ realizează tipărirea liniilor de text ce le urmează.
           \ linii de text \\ linii de text
          Exemplu:
          CLEAR
  \ Bun venit in lumea
  \ \ calculatoaretor!
          Bun venit in lumea calculatoarelor!
Observăm că şirurile de caractere nu trebuie să fie introduse între ghilimele sau apostroafe şi că se tipăresc inclusiv spaţiile. Comanda SET TEXTMERGE cu sintaxa:

SET TEXTMERGE [ON | OFF] [TO [fisier] [ADDITIVE] ]
[WINDOW nume fereastră] [SHOW | NOSHOW]

Când se specifică clauza ON expresiile încadrate între delimitatorii "«" şi "»" vor fi evaluate înainte de afişarea textului iar în caz contrar (implicit) acestea vor fi afişate exact aşa cum sunt în text fără evaluare.
Opţiunea TO permite specificarea unui fişier unde vor fi introduse textele respective.
Delimitatorii folosiţi pentru încadrarea expresiilor de evaluat pot fi modificaţi cu ajutorul următoarei comenzi:
SET TEXT MERGE DELIMITERS TO [expc1 [,expc2] ]
Dacă în comandă se specifică un singur delimitator, acesta va fi folosit înaintea şi după expresia de evaluat, iar dacă sunt introduşi doi delimitatori, primul va fi folosit înaintea, iar al doilea în spatele expesiei.
Cu comanda:
SET TEXTMERGE DELIMITERS TO
se revine la delimitatorii standard ("«" şi"»"),
O comandă asemănătoare cu aceastea este cea cu structura:
         TEXT
linii de text (una sau mai multe)
ENDTEXT
Exemplu:
TEXT
Aceste linii de text sunt asemănătoare comenzilor \ şi \ \ şi are exact aceleaşi regului de funcţionare cu cele expuse pentru aceasta.
ENDTEXT
Comanda (ca şi \ şi \\) este influenţată de comanda SET PRINTER TO
(Privitor la locul de afişare a textului). De asemenea comanda TEXT ... ENDTEXT poate utiliza expresii delimitate după cum s-a arătat la comanda anterioară.
5.8 Lucrul cu ecranul. Elemente semigrafice

            Caracterele ce pot fi afişate într-o anumită poziţie pe ecran nu sunt numai litere şi cifre ci şi anumite elemente semigrafice care sunt puse la dispoziţia utiiizatorului prin submeniul File pe optiunea Character Map în care sunt furnizate o serie de caractere şi semne ce pot fi utilizate,
De asemenea există şi o serie de comenzi care fac posibilă afişarea pe ecran a unor chenare, simple sau trase cu linie dublă, cu anumite culori, în scopu! obţinerii unor imagini cât mai plăcute.
Comanda cu sintaxa:
@ lin1,col1, lin2,col2 BOX [expc]
         Acestă comandă permite trasarea unui chenar (eventual plin cu diferite tipuri de caractere, de la coordonatele lin1,col1 stânga sus şi până la lin2,col2 (dreapta jos), caracterul de umplere fiind precizat prin expc.
         Comanda:
         @ lin1,col1, TO lin2,col2 [DOUBLE | PANEL | listă chenar]
[PATTERN expn1] [PEN expn2 [,expn3]] [STYLE expc]
[COLOR listă perechi culori | COLOR SCHEME expn4]
se fo!oseşte în acelaşi scop. Comanda trasează un dreptunghi din lin1,col1 (stânga sus) până în iin2,coi2 (dreapta jos) unde opţiunile semnifică:
         - DOUBLE - chenarul este trasat cu linie dublă (sub DOS)
         - PATTERN - trasează un chenar simplu cu o singură linie. Chenarul va fi plin dacă se precizează clauza PANEL
         - STYLE expc - şirul de caractere conţine un număr 0-99 care indică procentul din latura chenarulu! care va fi rotunjită (0 -dreptunghi, 99 - elipsă sau cerc).
         - PATTERN indică modul de umplere conform tabelului:
expn
Mod de umplere

0 Fără umplere (gol, transparent)
1 Plin (interior culoarea fond)
2 Cu linii orizontale
3 Cu linii verticale
4 Cu diagonale spre înainte
5 Cu diagonale spre înapoi
6 Model special
   7 Model special

PEN expn2 controlează trasarea liniei delimitatoare a figurii (peniţă) conform tabelului:
              
Expn2
Grosimea
0
Fără
1
1 punct
2
2 puncte
3
3 puncte
4
4 puncte
5
5 puncte
6
8 puncte
Expn3
Tipul penitei
0
Fără
1
cu linie punctată deasă
2
cu linie punctată rară
3
cu linie punct
4
cu linie punt punct
Culorite se pot preciza prin clauzele COLOR sau COLOR STYLE. Folosirea clauzelor PATTERN, PEN şi STYLE elimină efectul clauzetor DOUBLE, PANEL şi listă chenar.
Exemplu:
@ 10,10 to 20,70 PATTERN 2 PEN 2 style '0'
@ 5,40 to 22,50 PATTERN 3 PEN 1 style '99'
@ 7,20 to 15,30 PATTERN 0 PEN 0 styte '5'
Ştergerea ecranului se realizează cu comenzile:
CLEAR - care şterge tot ecranul
şi
@ lin,col [CLEAR | CLEAR TO lin2,col2]
Această a doua comandă şterge o portiune de ecran care începe în !in,col (stânga sus) până în lin2,col2 (dreapta jos) în cazul folosirii clauzei CLEAR TO, respectiv lin,co! (stânga sus) şi colţul din stânga jos al ecraniilui (care este definit de funcţiile SROWS() şi SCOLS().
Se şterge doar linia specificată până la sfârşitul ei dacă nu se specifică nici clauza CLEAR nici CLEAR TO.
Exemplu:
@ 10,10 TO 20,20 PATTERN 1 COLOR w/r
@ 12,20 CLEAR TO 20,50
Comanda @... FILL se foloseşte pentru a modifica culorile dintr-o anumită porţiune a ecranului fară a afecta conţinutul său:
@ lin,col FILL TO lin2,col2
[COLOR listă perechi culori|COLOR SCHEME expn]
        În care lin,col reprezintă colţul din stânga sus iar lin2,col2 colţul din stânga jos.
        Exemplu:
         @ 0,0 to 24,79 PEN 4
         @ 12,20 FILL TO 14,60 COLOR r/b
         @ 16,20 FILL TO 20,60 COLOR w+/n
5.9 Ferestre

           Fereastra este o porţiune a ecranului, tratată ca un tot unic şi care pot fi create de către utifizator pentru a face tipărirea curentă (fereastra devine ecranul curent).
         Există ferestre sistem (despre care s-a vorbit anterior) şi ferestre ce pot fi definite de către utilizatori. Lucrul cu ferestre este următorul:
         - ferestrele trebuie definite iniţial prin comenzi specifice;
         - apoi ferestrele se afişează pe ecran (se activează);
         - se pot afişa texte sau diferite obiecte în ferestre;
         - ferestrele se pot minimiza, muta, redimensiona etc;
         - apoi, la terminarea lucrului ferestrele se îniătură din memorie şi de pe ecran. Definirea unei ferestre se face cu comanda:
DEFINE WINDOW nume FROM lin,col TO lin2,col2
I AT lin3,col3 SIZE lin4,col4 [IN [WINDOW] nume1
I IN SCREEN | IN DESKTOP] [FONT expc1 [,expn1]]
[STYLE expc2] [FOOTER expc3] [TITLE expc4]
[HALFHEIGHT] [DOUBLE | PANEL | NONE | SYSTEM
| şir chenar] [CLOSE | NOCLOSE] [FLOAT | NOFLOAT]
[GROW | NOGROW] [MDI | NOMDI] [MINIMIZE]
[SHADOW] [ZOOM | NOZOOM] [ICON FILE expc5]
[FILL expc6] [FILL FILE fisier bmp] [COLOR listă perechi | COLOR SCHEME expn]
         Nume - reprezintă numele de identificare a ferestrei (maxim 10 caractere). Ferestrelor definite li se asociază o structură arborescentă pe nivele, o ferestră putând fi subordonată altei ferestre (clauza IN WINDOW).
          Relaţia părinte - copil dintre două ferestre determină anumite caracteristici pentru fereastra copil:
          - mutarea ferestrei părinte determină corespunzător mutarea ferestrei copil;
          - fereastra copil nu poate fi mutată în afara ferestrei părinte;
          - coordonatele ferestrei copil sunt relative la fereastra părinte.
          Dacă nu se doreşte asocierea unei ferestre alteia, se poate folosi clauza SCRREN care defineşte fereatra pe ecran (opţiune implicită) sau clauza IN DESKTOP:
         Această fereastră va fi asemănătoare rădăcinii directorului (directorul curent), ei putândui fi asociate alte ferestre (copil).
         lin,col defineşte colţul din dreapta sus al ferestrei, iar lin2,col2 defineşte colţul ei din stânga jos. Coordonatele sunt relative la ecranul calculatorului sau la fereastra părinte şi pot fi atât întregi cât şi fracţionare.
         Clauzele AT şi SIZE prin lin3,lin4 respectiv lin4,col4 pot şi ele indica poziţia ferestrei, exprimată în caractere.
         Exemplu:
         DEFINE WINDOW fer1 FROM 5,10 TO 15,70 IN SCREEN
         DEFINE WINDOW fer2 AT 2,10.5 SIZE 2,40.5 IN fer1
         Afişarea textelor în fereastră se face folosind un font şi un stil implicit (FoxFont) cu dimensiunea de 10 puncte stilul Normal. Orice comandă ce va afişa un text în fereastră va folosi acest font şi stil.
        Dacă se doreşte schimbarea fontului şi al stilului se folosesc clauzele FONT şi STYLE unde prin expc1 se pot indica noul font ('Roman' 'Arial' etc) respectiv prin expn1 dimensiunea sa iar prin expc2 stilul de afişare (bold, Italic etc).
         Clauzele FOOTER şi TITLE sunt urmate de un şir de caractere reprezentând un text ce va fi afişat pe linia de jos a ferestrei (FOOTER) respectiv pe prima sa linie (TITLE) în centrul acesteia,
         Clauza HALFHEIGHT se foloseşte pentru a crea o bază de titlu de "jumătate de înălţime" pentru compatibilitate între versiunile DOS şi WINDOWS ale FoxPro.
        Clauzele DOUBLE, PANEL, NONE, SYSTEM şi listă chenar se referă la tipul chenarului ferestrei. Incluzând în comandă clauza PANEL vom obţine un chenar plin, cu clauza DOUBLE se va obţine un chenar trasat cu linie dublă (versiunea sub DOS, sub WlNDOWS chenarul va fi plin). Clauza NONE indică lipsa completă a chenarului, iar clauza SYSTEM crează un chenar asemănător cu ferestrele sistemului. Dacă nu se specifică nici o dauză referitoare !a chenar, se crează un chenar tras cu o linie simp!ă.
        Clauza FILL stabileşte fondul ferestrei (varianta sub DOS, altfel nu se utilizează).        
         Clauza FILL FILE urmată de numele unui fişier imagine (bmp) indică imaginea cu care se va umpte fundalul ferestrei.
          Clauza CLOSE sau NOCLOSE indică posibilitatea închiderii sau imposibilitatea de a închide fereastra, prin selectarea opţiunii CLOSE din meniul FILE sau prin apăsarea butonului stâng al mouse-ului, când cursorul acestuia se află pe coltul din stânga sus al ferestrei.
         Dacă este prezentă clauza NOCLOSE fereastra nu poate fi astfel închisă ci închiderea sa se poate face numai prin comenzi FoxProW.
          Clauzele FLOAT / NOFLOAT permite (respectiv nu) mutarea ferestrei. Mutarea se poate face astfel:
- selectând opţiunea Move din submeniul Windows sau tastând combinaţia CTRL+F7 şi acţionând apoi tastele direcţionale după care mutarea se încheie tastând ENTER.
- poziţionând mouse-ul pe latura superioară a chenarului şi "trăgând" de fereastră (metoda drag and drow) adică ţinând apăsat butonul stâng al mouse-ului se mută mouse-ul. Când este eliberat se încheie mutarea.
        Clauza NOGROW nu permite schimbarea dimensiunilor ferestrei, iar micşorarea dimensiunilor ferestrei !a o icoană este permisă de clauza MINIMIZE,
Folosind tastele CTRL+F9 se realizează de asemenea minimizarea sau selectând opţiunea ZOOM din submeniul Windows, sau cu ajutorul mouse-ului prin dublu clic pe butonul de minimizare.
Clauza ZOOM / NOZOOM permite sau nu extinderea ferestrei la întreg ecranul sau întrega zonă părinte. Repetând operaţia de maximizare, fereastra va fi readusă la dimensiunile originale.
În FoxProW există un tip de ferestre predefinit numit MDI (Multiple Document Interface) care permite lucrul cu ferestre multiple. Caracteristicile specifice ale ferestrelor MDI sunt:
- o fereastră MDI se maximizează la fereastra principală (ecran);
- dispar obiectele de control ale ferestrei (maximizare, reducere);
- butonul de activare a meniului asociat se include în baza meniului sistem FoxPro;
- titlul ferestrei este inclus în zona titlu a ferestrei sistem;
          - activarea altei ferestre MDI determină maximizarea automată a ferestrei MDI.
         Clauza MDI / NOMDI specifică faptul că este definită (sau nu) o feresiră de tipul MDI.
          Opţiunile implicite sunt:
          NOCLOSE, NOFLOAT, NOGROW, NOZOOM fără MINIMIZE.
         Culorile folosite la afişarea ferestrei pot fi precizate prin clauzele COLOR sau COLOR SCHEME.
          Comanda:
          SET BORDER TO [SINGLE | DOUBLE | PANEL | NONE
          listă chenar1] [,listă chear2]
          modifică forma chenarului definit pentru fereastră.
          Opţiunea implicită este SINGLE, Schimbarea tipului chenarului cu aceasţă comandă nu influenţează ferestrele care au fost deja definite până la această comandă în schimb ea influenţează chenarul meniurilor.
          Comanda:
          ACTIVATE WINDOW [nume1, [nume2...]] | ALL
          [IN [WINDOW] nume3 | IN SCREEN] BOTTOM |
          TOP | SAME] [NOSHOW]
         realizează afişarea ferestrei nume1 (eventual nume2 ... ) sau a tuturor ferestrelor (ALL) pe ecran, eventual în alte ferestre (lN WINDOW nume3). Dacă pe ectran există alte ferestre, afişarea se face peste acestea.
         Vom avea două aspecte referitoare la acestă comandă: unul cu privire la afişarea propriuzisă şi altul cu privire la locul de afişare (faţă de fereastra curentă sau faţă de ecran în ansamblu).
Astfel dacă se doreşte o altă poziţie pentru fereastra de activat relativ la celelalte se vor folosi clauzele:
- BOTTOM - amplasarea ferestrei se face în spatele celorlalte;
- TOP - amplasarea se va face în faţă;
- SAME - în poziţia normală (cea în care este deja activată).
Clauza NOSHOW - activează fereastra dar nu o afişează pe ecran (fereastra este completată în memorie, după care ea va fi afişată prontr-o comandă SHOW WINDOW).
Comanda:
SHOW WINDOW nume [,nume2...] |ALL
          [IN [WINDOW] nume3 IN [WINDOW] SCREEN]
          [REFRESH] [TOP | BOTTOM | SAME] [SAVE]
Clauzele care nu au fost prezentate sunt:
REFRESH - se foloseşte pentru reîmprospătarea ferestrei BROWSE fiind utilă la lucrul în reţea,
SAVE - se foloseşte pentru a păstra o imagine a ferestrei respective pe ecran sau într-o altă ferastră (părinte) şi după ce fereastra a fost ascunsă. Imaginea este eliminată prin utilizarea comenzii CLEAR. Nu se poate ap!ica clauza SAVE asupra ferestrei curente,
Exemplu:
SET TALK OFF
CLEAR
DEFINE WINDOW f1 FROM 1,10 to 20,60
DEFINE WINDOW f2 FROM 2,10 to 8,40
ACTIVATE WINDOW F1
CLEAR
@ 1,1 SAY 'Cemaifaci?'
SHOW WIND f2
@ 6,1 SAY 'Andrei'
NOTE fereastra curentă este tot f1 (nu s-a schimbat)
SHOW WIND f1
CLEAR
Comanda opusă lui ACTIVATE WINDOW şi SHOW WINDOW este HIDE WINDOW sau DEACTIVATE WINDOW care elimină de pe ecran una sau mai multe ferestre fără a le înlătura din memorie:
HIDE WINDOW [nume1 [,nume2]... ] |ALL
[IN [WINDOW nume3 | [IN [WINDOW] SCREEN]
[BOTTOM |SAME |TOP] [SAVE]
       Ferestrele cu numele "nume1", "nume2", "nume3" vor fi ascunse dar nu vor fi îndepărtate din memorie. Specificând clauza ALL vor fi ascunse toate ferestrele existente pe ecran în acel moment, Ascunderea ferestrelor se poate face pe ecran (SCREEN) sau într-o altă fereastră părinte (nume3, IN WINDOW).
       Clauza SAVE se foloseşte pentru a păstra în memorie imaginea ferestrelor după ascunderea lor. Imaginea se şterge cu comanda CLEAR.
        Comanda HIDE WINDOW nu afectează locul în care se trimit ieşirile comenzilor FoxPro. Fereastra ascunsă cu acestă comandă rămâne fereastră curentă în continuare.
         Pentru a modifica fereastra curentă se pot folosi comenzile ACTIVATE WINDOW sau DEACTIVATE WINDOW (care ascunde fereastra dar ea nu rămâne fereastră curentă):
         DEACTIVATE WINDOW nume [,nume2] | ALL
        Dacă sunt mai multe ferestre active, cealaltă fereastră activă (nu cea care a fost dezactivată) va deveni fereastră activă dar comanda nu înlătură fereastra din memorie.
Înlăturarea ferestrelor din memorie se poate realiza cu comanda:
         RELEASE WINDOWS [listă ferestre]
         Lista ferestrelor ce sunt înlăturate din memorie poate conţine ferestre utilizator dar şi ferestre sistem.
         Comanda:
         CLEAR WINDOWS
înlătură toate ferestrele atât de pe ecran cât şi din memorie.
         Comanda:
         SAVE WINDOWS listă | ALL TO fişier | TO MEMO câmp
salvează caracteristicile ferestrelor într-un fişier în vederea refacerii lor ulterioare.
         Dacă la numele fişierului în care sunt salvate ferestrele prezente în listă (sau toate în cazul clauzei ALL) nu se specifică o extensie, sistemu! va atribui automat extensia ,WIN

          În fişierul specificat sau în câmpul memo se vor specifica şi stările momentane ale ferestrelor respective, deci dacă sunt active sau ascunse. Refacerea ferestrelor se realizează cu comanda:
         RESTORE WiNDOW listă | ALL FROM fişier
         I FROM MEMO câmp memo
        Dacă este refăcută sau definită o fereastră cu acelaşi nume cu al uneia existente în memorie, cea din memorie se pierde fiind înlocuită cu noua fereatră. O dată cu refacerea se reface şi starea ei (activă sau ascunsă).
        Exemplu:
        CLEAR
        DEFINE WIND f1 FROM 6,10 T016,40 DOUBLE SHADOW
        ACTIVATE WIND f1
        @ 1,1 SAY ' Fereastra de testare'
        SAVE W!ND f1 TO f1
        NOTE se salvează ferestra f1 în fişierul f1.win
        CLEAR WINDOWS
        NOTE se eiiberează memoria de toate ferestrele
        RESTORE WINDOWS f1 from f1
        NOTE Se reface fereastra f1
        @ 1,1 SAY I Fereastra de testare'
         Retu
         Functie de prezenţa sau absenţa clauzei FLOAT sau NOFLOAT în comanda DEFINE WINDOW fereastra poate fi mutată în altă poziţie sau nu. Pentru mutarea unei ferestre se foloseşte comanda:
         MOVE WINDOW nume TO ln,col | BY expn1,expn2
         [CENTER]
        în comandă noua poziţie este desemnată prin lin,col sau se calculează relativ la pozitia curentă a ferestrei în funcţie de expresiile expn1 şi expn2. Clauza TO se referă la fereastra părinte dacă există sau la ecranul FoxPro şi semnifică număru! de linii şi coloane ca şi expn1 (numărul de linii -plus sau minus -expn1) sau riumărul de coloane. Clauza CENTER dirijează ferestra în poziţie centrală faţă de fereastra părinte sau fată de ecranul FoxPro.
Fereastra de mutat trebuie să fie activă în momentul lansării comenzii MOVE.
Exemplu:
CLEAR
DEFINE WIND f1 PROM 1,2 TO 6,22
ACTIVATE WINDOW f1 NOSHOW
@ 1,1 SAY ' Fereastra de testare'
SHOW WIND f1
FOR i=1 to16
Wait TIMEOUT O.2
MOVE WINDOW f1 by 1,3
ENDFOR
retu
În exemplu se va defini fereastra f1 în colţul din stânga sus al ecranului după care fereastra va fi mutată câte o linie în jos şi trei coloane în dreapta până când ea ajunge în colţul din dreapta jos.
Comanda WAIT este introdusă pentru a încetini mutarea ferestrei. O extensie a acestei comenzi este:
ZOOM WINDOW nume MIN | [AUTO] | MAX | NORM
[AT Iin1,col1 | FROM lin1,col1
[SIZE lin2,col2 | TO Iin2,col2 ]]
        Cu ajutorul acestei comenzi se poate maximiza (extinde la tot ecranui sau fereastra părinte), minimiza (reducere la dimensiuni minime, acestă formă putând fi plasată în orice poziţie pe ecran sau fereastra părinte) sau redimensionarea ferestrei respective.
       Clauzeie MIN (minimizare), MAX (rriaximizare) NORM (aducerea ferestrei la dimensiuni normale) pot fi folosite atât pentru ferestre utilizator cât şi ferestre sistem.   
        Aceste clauze pot fi folosite numai dacă s-au prevăzut anumite clauze la definirea ferestrelor (MIN dacă s-a prevăzut clauza MINIMIZE la definirea ferestrei etc).
         FUNCŢII REFERITOARE LA FERESTRE
         WEXIST (nume) - returnează .T. dacă există fereastra "nume".
         WBORDER [ (nume]) - returnează .T.dacă fereastra are chenar
         WMAXIMUM ([nume]) - returnează .T. dacă starea ferestrei este maximizată.
         WMINIMUM ([nume]) - idem dacă este minimizată
         WVIZIBLE (nume) - returnează .T. dacă fereastra este visibilă Dacă nu se precizează numele ferestrei în comenzite WBORDER, WMAXIMUM şi WMINIMUM, atunci funcţia respectivă se referă la ferestra curentă.
Informaţii privitoare la poziţia pe ecran a unei ferestre se pot obţine cu funcţiile:
WLROW ([nume]) - indică linia de pe latura superioară
WLCOL ([nume]) - indică coloana laturii din stânga
WROWS ([nume]) - indică numărul de linii ai ferestrei
WCOLS ([nume]) - indică numărul de coloane ale ferestrei
Deci primele funcţii indică colţul din stânga sus al ferestrei, iar următoarele două ferestre indică mărimea ferestrei. Dacă nu se specifică numele ferestrei, atunci informaţiile se referă la fereastra curentă, iar dacă numele este " (ghilimele) sau "" atunci informaţiile se referă la ecranul FoxPro.
WTITLE ([numc]) - afişează numele ferestrei
Trebuie făcută distincţie între numele unei ferestre şi titlul său (deşi ele pot fi identice). Numeie ferestrei este cel indicat în comanda define window iar titlul este cel prezent în clauza TITLE.
wparent ([nume]) - returnează un şir de caractere conţinând numele ferestrei părinte a ferestrei nume (sau a ferestrei curente).
WCHILD ([nume] [,expn]) - returnează numărul de ferestre copil ale unei ferestre date sau ale ferestrei curente. Dacă este prezentă "expn" atunci funcţia este de tip şir de caractere şi este returnat numele ferestrei copil indicat prin expn: dacă expn este 0, se obţine numele primei ferestre copil. Cu alte valori se obţine numele celorlalte ferestre copil (a doua cu 1, a treia cu 2 şamd până se returnează şirul nul).
WOUTPUT ([nume]) - afişează într-un şir de caractere numele ferestrei curente (dacă nume lipseşte) şi .T. dacă funcţia curentă este cea precizată ("nume") şi F, dacă nu este curentă dacă "nume" este prezent.
WLAST ([nume]) - funcţia va returna valoarea .T. dacă fereastra "nume" coincide cu fereastra anterior activată (înaintea ferestrei active în prezent) şi ,F. dacă nu ea este aceasta. Funcţia activată fără parametru returnează numele ferestrei curente anterioare (fereastra care va deveni curentă dacă se foloseşte comanda DEACTIVATE WIND).
WONTOP ([nume]) - returnează nume!e ferestrei din faţă (când pe ecran sunt mai multe ferestre), când este apelată fără parametru iar în caz contrar va retuma .T. dacă "nume" este fereastra cel mai din faţă.
COMENZI ÎN CARE INTERVIN FERESTRE
Comanda READ determină citirea obiectelor, câmpurilor definite anterior cu comanda GET. Citirea acestor obiecte se poate desfăşura în mai multe ferestre toate fiind coordonate de comanda READ.
Pentru a utiliza acest procedeu vom folosi următoarea metodă de lucru:
- vom defini mai întâi ferestrele;
- se va activa fereastra ce va conţine câmpu! GET ce urmează a fi citit realizându-se corespondenţa dintre câmpurile GET şi ferestreie ce le conţin;
- în final se va executa comanda READ care va declanşa citirea câmpurilor definite anterior.
Exemplu:
         SET TALK OFF
         CLEAR
         DEFINE WIND f1 FROM 2,6 TO 8,20 DUBLE SHADOW
         DEFINE WIND f2 FROM 6,24 TO 20,60 DUBLE SHADOW
         DEFINE WIND f3 FROM 10,20 TO 18,70 DUBLE SHADOW
         ACTIVATE WIND f1
         @ 1,1 GET a DEFA 0 PICT '9999.99'
         ACTI WIND f2
         @ 2,4 GET b DEFA 0 PICT '9999.99'
         ACTI WIND f3
         @ 2,4 GET c DEFA 0 PICT '9999.99'
         ACTI WIND f2
         @ 4,4 GET d DEFA 0 PICT '9999.99'
         HIDE WIND ALL
         READ
         clea all
         retu
         În sintaxa comenzii READ sunt prevăzute clauze referitoare la ferestre anume:
          READ
          ..........
[ACTIVATE expl1 ] [DEACTIVATE expl2] [MODAL]
[WITH Iistă ferestre]
         Clauza ACTIVATE - la citirea comenzii READ este evaluată expresia ogică expl1 pentru schimbarea ferestrei curente. Acestă expresie poate conţine o functie definită utilizator.
         Clauza DEACTIVATE - este urmată de o expresie logică care este evaluata când se aduce o altă fereastră pe ecran (deoarece se dezactivează o fereastră).
         Exemplu:
         SET TALK OFF
         CLEAR DEFINE WIND f1 FROM 2,2 TO 10,36 DUBLE SHADOW
         DEFINE WIND f2 FROM 4,32 TO18,76 DUBLE SHADOW
         DEFINE WIND f3 FROM 12,10 TO 20,70 DUBLE SHADOW
         ACTIVATE WIND f1
         @ 5,4 GET a DEFA 0 PICT '9999.99'
         ACTI WIND f2
         @ 5,4 GET b DEFA 0 P!CT '9999.99'
          ACTI WIND f3
         @ 5,4 GET c DEFA 0 PICT '9999.99'
         ACTI WIND f2
         @ 5,4 GET d DEFA 0 PICT '9999.99'
          READ ACTIVATE test1() DEACTIVATE test2() CYCLE
         CLEAR WINDOWS
         FUNCTION test1
         @ 0,1 SAY 'Fereastra curenta este:'
         ?? WOUTPUT()
         @ 1,1 SAY 'Fereastra curentă a fost'
         ?? WLAST ()
          RETURN .F.
          FUNCTON test2
         @ 2,1 SAY' Ferestra din fata este:'
         ?? WONTOP()
         RETURN .F.
         În acest exemplu sunt citite patru valori numerice a,b,c, şi d în trei ferestre f1,f2 şi f3. Cu ajutorul clauzelor ACTIVATE şi DEACTIVATE se afişează în fiecare fereastră următoarele informaţii:
         - ferestra curentă;
         - fereastra curentă anterioară;
         - fereastra din faţă, foiosind funcţiiie WOUTPUT() ,WLAST() şi WONTOP().
         Evaluarea clauzei ACTIVATE presupune evaluarea functiei test1(), aceasta făcându-se de fiecare dată când se schimbă fereastra curentă, la intrarea în noua fereastră.
        Clauza DEACTIVATE presupune evaluarea funcţiei test2(), de fiecare dată când peste fereastră se aduce o alta, în cazul nostru la fiecare schimbare a câmpului GET deoarece toate trei ferestrele sunt suprapuse şi oricare două câmpuri GET consecutive sunt citite în ferestre diferite.
        Într-o comandă READ pot interveni ferestre ce nu conţin câmpuri GET ale comenzii READ curente. Acest lucru se realizează la evaluarea unor expresii apartinând unor clauze ca WHEN, VALID, ACTIVATE etc, Pentru a nu permite accesarea altor ferestre decât a celei implicate în comanda READ se adaugă clauza MODAL la comanda READ.
       Acelaşi tip de limitare se obţine şi prin clauza WITH cu deosebire că ferestrele ce vor putea fi accesate vor fi specificate în lista ce urmează acestei clauze. Ferestrele pot fi utilizator sau sistem.
        Pentru a testa dacă o fereastră participă sau nu la comanda READ curentă, se va folosi funcţia WREADQ cu sintaxa:
       WREAD ([nume]) - retumează .T. dacă fereastra specificată participă la comanda READ curentă.
        O fereastră participă la comanda READ dacă:
        - un câmp READ este în acestă fereastră;
        - numele ferestrei este inclus în clauza WITH a comenzii READ. Dacă nu se specifică parametrul funcţiei, acesta se va referi la fereastra din faţă (cea retumată de WONTOP()).
        Comanda SHOW GETS conţine şi ea clauze cu ferestre:
        SHOW GETS
        . . . . . . .
        [WINDOW nume fereastră]
        . . . . . . .
       Dacă în comandă se include această clauză, vor fi reafişate doar obiectele câmpurilor GET din această fereastră fără să afecteze celelalte câmpuri GET, din celelalte ferestre.
      Editarea câmpurilor MEMO se poate face într-o fereastră definită utilizator cu o comandă GET cu clauza OPEN:
       @ . . . GET . . . [OPEN] WINDOW nume fereastră . . .
       Pentru a intra în editarea câmpului memo, se tastează combinaţia CTRL+HOME, CTRL+PgUp sau CTRL+PgDn, iar ieşirea din editare se face cu CTRL+W, CTRL+End, CTRL+Q sau ESC. Cu clauza OPEN fereastra va fi deschis automat când cursorul va ajunge în câmpu! memo respectiv.
        Editarea câmpurilor memo se poate realiza şi prin intermediul comenzii;
        MODIFY MEMO
        . . . . . . . . . .
        [WINDOW nume1 [IN [WINDOW nume2 | IN SCREEN] ]

         Incluzând clauza WiNDOW nume - fereastra de editare va avea aceleaşi caracteristici cu cele ale ferestrei specificate în acestă clauză. Pentru a specifica o ferestră părinte se foloseşte caluza IN WINDOW în care nume2 va desemna fereastra părinte. Fereastra părinte trebuie să fie vizibilă pe ecran.
        Cu clauza IN SCREEN fereastra este deschisă pe ecran.
        Pentru a specifica o fereastră definită utilizator unde vor apărea câmpurile memo (prin comenzi ca @ ... SAY/GET, APPEND, BROWSE, CHANGE, EDIT sau MODIDY MEMO) se foloseşte comanda:
         SET WINDOW OF MEMO TO nume
în care "nume" va desemna fereastra folosită la editarea câmpurilor memo respective.
        Comenzile \,\\, TEXT... ENDTEXT pot şi ele să afişeze textui respectiv într-o fereastră caz în care trebuie inclusă în comanda SET TEXTMERGE clauza WINDOWS:
         SET TEXTMET ... [WINDOW nume] ..,
unde "nume" este numele ferestrei unde se direcţionează ieşirea.

5.10 Meniuri

        Meniul reprezintă un element de interfaţă prin care se oferă utilizatorului posibilitatea selectării unei anumite opţiuni dintr-o mulţime, afişată pe ecran, integral sau parţial, urmâmd ca funcţie de alegerea făcută să fie declanşate anumite acţiuni.
        Un exemlu este meniul sistem al FoxProW-ului dar este posibilă crearea unor astfel de menuiri pentru lucrări proprii (meniurile vor lansa diverse prograne în execuţie),

         Un rneniu este format dintr-o "bară a meniului" (orizontaiă) şi mai multe "submeniuri". Bara meniului conţine mai multe opţiuni fiecărei dintre opţiuni i se ataşează de obicei submeniuri. Fiecare submeniu poate şi e! să fie format din mai mu!te opţiuni.
Modul de lucru cu meniurile utilizator este următorul:
       - se defineşte meniul în următoarele etape:
       - se definesc opţiunile;
       - se definesc acţiunile pentru fiecare opţiune (adică programele care sunt
lansate de fiecare opţiune);
       - se activează meniul;
       - se efectuează diferitete operaţii (afişare, ascundere etc.);
       - în final se elimină din mernorie meniul odată cu terminarea lucrului. Comanda pentru definirea meniului este:
DEFINE MENU nume [BAR [at LINE expn1] ]
[IN [WINDOW] nume fer | IN SCREEN]
[KEY eticheta] [MARK expc1] [MESSAGE expc2]
[NOMARGIN] [COLOR listă | COLOR SCHEME expn2]
Barei meniului i se atribuie un nume urmând ca în continuare acest element să fie identificat prin acest nume. Clauza BAR se foloseşte cu scopul de a prelua caracteristicile noii bare a meniului de la cea a meniului sistem FoxPro. Următoarele aspecte sunt caracieristice meniuiui sistem:
- după alegerea meniului bara meniu este dezactivată;
- bara meniu acoperă o singură linie a ecranului sau a ferestrei;
- poziţia submeniurilor va fi stabilită automat de sistem;
- dacă bara are o dimensiune mai mare decât ecranul sau fereastra în care a fost definită, se va foiosi metoda defilării pentru accesarea opţiuniior bară.
Clauza AT LINE determină afişarea barei meniului pe linia cu numărul expn1 a ecranului (sau ferestrei). Clauzele IN WINDOW şi IN SCREEN specifică locul plasării barei (în fereastră sau ecran).
Clauza KEY etichetă precizează o tastă care prin actionare duce la activarea meniului.
         Clauza MESSAGE determină afişarea pe ultima linie (în centrul ei) a mesajului expc2 care de obicei lămureşte utilitatea meniului. Clauza este influenţată de comanda MESSAGE. Optiunile bară vor fi aşezate una după alta pe bara meniului şi vor fi separate prin spatii. Eliminarea spaţiilor separatoare se poate face introducând clauza MARGIN în comanda DEFINE MENU,
Clauzele COLOR şi COLOR SCHEME controlează culorile de afişare. Implicit sunt uiilizate culorile schemei 2 de culori,
După definirea unei bare a meniului trebuie definite optiunile bară care vor aparţine fiecărei bare a meniului cu comanda:
DEFINE PAD opt OF nume PROMPT exc1 [AT lin,col]
[BEFORE opt baraôAFTER opt bara]
[KEY etich [ ,expc2]] [MARK expc1] [ SKIP [ FOR expl ]
[MESSAGE] [COLOR listă | COLOR SCHEME expn]
        Numele opţiunii bară va fi dat de "opt" iar bara meniu de care va aparţine este cea din comanda anterioară şi egală cu "nume". Textul ce va fi afişat pe bara meniului va fi cel dat în clauza PROMPT, adică şirul de caractere expc1. Stabilirea unei taste directe de alegere a opţiunii bară respective se realizează prin plasarea combinaţiei "\<" înaintea caracterului de selecţie desemnat.
        Exemplu: ... PROMPT \<Salvare'...
va defini un text al unei opţiuni bară, 'Salvare' în care tasta directă de alegere va fi "s",          
        Dacă caracterul respectiv apare de mai multe ori în cadrul textului atunci primul astfel de caracter va fi caracterul ce va fi selectat indiferent de modul de selectare în clauza PROMPT. Exemplu:
        PROMPT'Alb\<astru';..
        În acest caz tasta directă de alegere va fi A din Albastru şi nu a din Albastru.
        Clauza AT determină poziţia de pe ecran sau fereastră unde va fi afişată opţiunea bară respectivă: linia va fi desemnată prin lin, coloana prin col. Se pot obtin astfel meniuri verticate, orizontale sau neregulate.
        Dacă această clauză lipseşte, afişarea optiunilor bară se va face începând cu linia 0 coloana 0, una după alta, pe direcţie orizontală.
        Ordinea de apariţie şi selectare a opţiunilor bară ale unui meniu este dată de ordinea definirii acestora prin comenzile DEFINE PAD corespunzătoare.
        Dacă se doreşte inserarea unei opţiuni bară între opţiunile definite se folosesc clauzele BEFORE (inserare în faţă) sau after (inserare în spate).
        Exemplu:
        DEFINE MENU test
        DEFINE PAD opt1 OF test PROMPT' Opt\<1'
        DEFINE PAD opt2 OF test PROMPT' Opt\<2'
        DEFINE PAD opt3 OF test PROMPT' Opt\<3'
se poate realiza acelaşi lucru cu:
        DEFINE MENU test
        DEFINE PAD opt1 OF test PROMPT' Opt\<1'
        DEFINE PAD opt2 OF test PROMPT1 Opt\<3'
        DEFINE PAD opt3 OF test PROMPT' Opt\<2' BEFORE opt:
        Un astfel de meniu va arăta ca mai jos:

                  | Opt 1     | Opt 2   | Opt 3   |

       Clauza KEY se foloseşte pentru definirea unei căi directe de alegere a opţiunii bară respective (Combinaţie de taste care acţionate determină alegerea opţiunii respective.
      Clauza MESSAGE determină afişarea textului din şirul expc4 cât timp opţiunea bară respectivă este selectată pe ultima linie şi de obicei are ca scop lămurirea selectării opţiunii respective. Comanda este influenţată de comanda SET MESSAGE.
      Clauza SKIP face ca respectiva bară să nu poată fi accesată. Clauza folosită fără FOR face ca bara respectivă să fie doar afişată şi nu seiectată iar cu FOR să poată fi accesată în anumite condiţii.
      De asemenea dezactivarea unei opţiuni bară se poate face prin plasarea caracterului "\" înaintea textului clauzei PROMPT.
      Exemplu: Comenzile următoare sunt echivalente (bară inaccesibilă):
      DEFINE PAD opt1 OF test PROMPT ' \Salvare'
      DEFINE PAD opt1 OF test PROMPT ' Salvare' SKIP
      Clauzele COLOR şi COLOR SCHEME specifică culorile utilizate pentru tipărirea opţiunilor şi implicit ele sunt cele ale schemei 2 de culori. Submeniurite sunt definite prin comanda DEFINE POPUP:
       DEFINE POPUP nume [FROM lin.col] [TO lin2,col2]
       [IN [WINDOW] nume fer | IN SCREEN] [FOOTER expc1 ]
       [TITLE expc2] [KEYetich] [MARGIN] MARKexpc3]
       [MESSAGE expc4] [MOVER] [MULTISELECT]
       [PROMPT FIELD expr | PROMPTFILES [LIKE mască] ]
       PROMPT STRUCTURE] [RELATIVE] [SCROOL]
       [SHADOW] [COLOR listă | COLOR SCHEME expn]
       Un submeniu reprezintă o listă de opţiuni care pot fi de următoarele tipuri:
       - opţiuni definite de utilizator prin comenzi de tip DEFINE BAR;
       - opţiuni calculate pe baza continutului unor înregistrări ale unei baze de date (PROMPT FIELD);
        - câmpuri dintr-o bază de date (PROMPT STRUCTURE);
o listă de fişiere dintr-un director (PROPT FILES).
        Numele submeniului va fi "nume" iar pozitia sa pe ecran sau într-o fereastră va fi dat de clauza FROM în care lin,col indică poziţia colţului din stânga sus a submeniului.
       Dacă aceasză clauză lipseşte, submeniul va fi plasat în colţul din stânga sus al ecranului sau al ferestrei active (poziţia 0,0). Clauza TO precizează colţul din stânga jos al
meniului. Dacă această clauză lipseşte, sistemul va calcula dimensiunile submeniului (din numărul barelor şi considerând grosimea uneia cu 1 adică o linie).
       Pentru ca submeniul să fie plasat într-o fereastră definită de utilizator, numele acesteia va fl inclus în clauza IN WINDOW. Altfel meniul va fi introdus într-o fereastră dacă există o fereastră activă în momentul definirii meniului.
Clauza TITLE se foloseşte pentru afişarea unui text (expc2) în centrul laturii superioare a chenarului submeniului, iar clauza FOOTER permite afişarea textului expc1 pe latura inferioară a meniului.
Clauza KEY se foloseşte cu scopu! de a specifica o cale directă pentru activarea submeniului, cale dată de "etich" care este o etichetă de tastă,
Clauza MESSAGE afişează în subsoiui ecranului un mesaj lămuritor (expc4) clauză ce este influenţată de comanda SET MESSAGE,
Clauza MARGIN se include în comandă pentru ca opţiunile să fie separate de chenar printr-un spaţiu suplimentar la dreapta şi la stânga acestora.
Clauza MOVER permite rearanjarea opţiunilor în meniu când acesta este activat. Opţiunile au în dreapta un caracter ce indică posibilitatea de mutare a acestuia, Pentru mutare se procedează ca mai jos:
          - se selectează opţiunea (cu tastele direcţionale) şi cu tastele CTRL+↑ şi CTRL+↓ se deplasează opţiunea respectivă în noua poziţie.
         - cu mouse-ul: se pozitionează cursorul pe caracterul suplimentar (de mutare) şi după accea se apasă butonul stâng şi ţinându-l apăsat se mută în noua poziţie.
         Clauza MOVER nu are efect în cazul meniurilor create cu PROMPT.
         O altă faciiitate este aceea că dacă este prevăzută clauza MULTiSELECT se pot selecta concomitent mai multe opţiuni. Fiecare opţiune selectată este marcată în stânga ei.
         Comanda SET KEYCOMP poate fi poziţionată pe DOS sau pe WiNDOWS, în prima variantă:
        - cu tastatura se acţionează tasta SHIFT împreună cu ENTER sau SPACE când cursorul este pe o opţiune setectată. Ţinerea tastei SHIFT apăsată şi deplasarea cursorului deasupra altor opţiuni (folosind tastele direcţionale) determină selectarea opţiunilor.
        - cu mouse-ul: se apasă butonul stâng al mouse-ului în timp ce cursorul se află pe o opţiune selectată în timp ce tasta SHIFT este apăsată. Deplasarea cursorui deasupra altor opţiuni cu tasta SHIFT apăsată determină selectarea acestor opţiuni.
        Dacă KEYCOMP este pe WINDOWS atunci dacă se apasă tasta SHIFT şi se parcurg mai multe opţiuni ele sunt selectate.
        Folosind mouse-ul se selectează opţiunile printr-un click când tasta CTRL este apăsată
         Clauza MULTISELECT nu poate fi folosită în acelaşi timp cu clauza PROMPT. După selectarea mai multor opţiuni, testarea în program a selectării se testează cu funcţia MRKBAR()
       Tipul de submeniu este determinat de clauza PROMPT. Dacă această clauză lipseşte, opţiunile meniului urmează să fie definite cu comenzi DEFINE BAR.
În cazul clauzei PROMPT FIELD opţiunile submeniului vor fi preluate dintr-o bază de date deschisă în una din zonele de lucru pentru fiecare înregistrare câte o opţiune. La activarea submeniului se va selecta automat zona de lucru respectivă.
Expresia "expr" va determina modul de obţinere a unei opţiuni din înregistrarea corespunzătoare. Această expresie poate conţine câmpuri ale bazei de date curente sau ale unei baze de date deschisă în altă zonă de lucru, între care se poate aplica operatorul de concatenare. Numărul maxim de opţiuni ale unui submeniu creat dinr-o bază de date este nelimitat în versiunea sub WINDOWS a FoxPro-ului.
Exemplu:
CLEAR
USE agenda
DEFINE POPUP ag FROM 10,10 MARGIN PROMPT FIELD;
SUBSTR(nume,1,4)+' '+SUBSTR(prenume,1,4)
ACTIVATE popup ag
CLEAR POPU
USE
         În exemplu este definit un submeniu numit "ag" ale cărui opţiuni se obtin din primele patru caratere ale câmpurilor NUME şi PRENUME concatenate şi între care este intercalat un spaţiu.
Pentru ca opţiunile submeniului să fie reprezentate de fişierele existente pe disc într-un anumit director, se utilizează clauza PROMPT FILES. Acestă clauză folosită fără LIKE determină ca opţiunile să fie reprezentate de toate fişierele existente în directorul curent pe disc. Dacă se utilizează clauza LIKE atunci se poate preciza inaintea fişierelor o cale şi se pot utiliza caracterele se selecţie multiplă din DOS (ca * şi ? exemplu: *.prg sau d:a???????.dbf) în cadrul măştii precizate după clauză).
Se poate folosi şi structura unei baze de date ca sursă pentru opţiunile unui submeniu fotosind clauza PROMPT STRUCTURE.
Exemplu:
DEFINE POPUP pop FROM 2,10 MARGIN PROMPT;
FILES LIKE A:\*,dbf
ACTIVATE POPUP pop
CLEAR POPUPS
O altă variantă a acestei comenzi este cea în care opţiunile sunt alese din structura unei baze de date active. Acesta este opţiunea PROMPT STRUCTURE:
Exemplu:
DEFINE POPUP pop FROM 2,10 MARG PROMTER STRU
Submeniurile pot fi definite şi cu comanda:
Clauza RELATIVE poziţia unei opţiuni va fi dată de numărul opţiunii din comanda DEFINE BAR , pentru opţiunile nedefinite lăsându-se spaţii libere în absenţa acestei opţiuni. Dacă este prezentă opţiunea, atunci nu se lasă spaţii.
Clauza SCROOL are ca obiect afişarea unei bare verticale de defilare pe latura dreaptă a chenarului, când nu pot fi afişate toate opţiunile submeniului.
         Clauza SHADOW nu este disponibilă în FoxProW, referindu-se la o umbră ce este creată în varianta sub DOS.
Comanda de definire a opţiunilor unui submeniu este:
           DEFINE BAR expn1│nume opt_sis OF nume submen
[PROMPT expc1] [BEFORE expn2] [AFTERexpn3]
[KEY etich [ ,expc2 ] ] [ MARK expc3 ]
[MESSAGE expc4] [SKIP [FOR expl ] ]
[COLOR Iistă |COLOR SCHEME expn]
Comenzile DEFINE BAR şi DEFINE PAD sunt foarte asemănătoare. Pentru fiecare opţiune a submeniului se introduce o comandă DEFINE BAR. Referirea la o opţiune se face prin expn1 care desemnează opţiunea cu numărul de ordine expn1 a submeniului "nume submen".
Clauza PROMPT specifică un text (expc1) ce este afişat pe poziţia opţiunii în submeniu. În şirul de caractere expc1 se pot introduce combinaţiiie "\<" pentru desemnarea tastei de alegere directă, sau "\" pentru a indica opţiunile dezactivate,
Când şirul de caractere expc1 este "\-" aceasta indică faptul că se crează o
linie separatoare în cadrul submeniului, pentru separarea opţiunilor.
          Clauzele BEFORE şi AFTER sunt urmate de expresii numerice indicând "înaintea sau în urma" cărei opţiuni va fi aşezată opţiunea respectivă. Aceste opţiuni pot fi folosite numai în prezenţa opţiunii RELATIVE în comanda de creare a submeniului.
          Celelalte clauze au aceeaşi semnificaţie ca şi cea din comanda DEFINE PAD.
          Exemplu: Se doreşte crearea următorului submeniu:
                    
DEFINE POPUP culori FROM 6,10 TO 14,21 MARQIN MULTI
DEFINE BAR 1 OF culori PROMPT 'Al.\<bastru'
DEFINE BAR 2 OF culori PROMPT \<Verde' SKIP
DEFINE BAR 3 OF culori PROMPT \<Roşu'
DEFINE BAR 4 OF culori PROMPT '\-'
         DEFINE BAR 5 OF culori PROMPT \<Alb'
         DEFINE BAR 6 OF culori PROMPT \<Galben' 
ACTIVATE POPUP culori
Pentru a putea lucra cu aceste meniuri nu este suficient să fie definite meniurile ci ele trebuie şi să fie activate. Activarea se realizează cli comanda:
ACTIVATE MENU nume [NOWAIT] [PAD nume opt]
Comanda afişează şi activează bara "nume" care este meniul propriuzis, selectând iniţial prima opţiune bară a meniului (dacă nu este folosită clauza PAD caz în care opţiunea precizată aici este selectată). Operatorul poate selecta o altă bară cu tastele direcţionale, tastele directe de selecţie sau cu mouse-ul.
Clauza NOWAIT determină continuarea execuţiei programului după afişarea meniului şi activarea sa.
Exemplu:
CLEAR
DEFINE MENU mainmenu
DEFINE PAD fiz OF mainmenu PROMPT '\<Fizica'
DEFINE PAD chi OF mainmenu PROMPT '\<Chimie'
DEFINE PAD lit OF mainmenu PROMPT '\<Literatura'
DEFINE PAD spo OF mainmenu PROMPT \<Sport'
ACTiVATE MENU mainmenu PAD sport NOWAIT
@ 10,10 SAY 'domeniu' GET dom DEFA'
READ
DEACTIVATE MENU mainmenu
           --------------------------------------------------------------------------
           |  Fizică            Chimie             Literatură               Sport  |
           --------------------------------------------------------------------------


                                              Domeniu                     

          ---------------------------------------------------------------------------

Analog activării barei de meniu se face şi afişarea şi activarea submeniului cu comanda:
         ACTIVATE POPUP nume [AT Iin,col] [BAR expn
         [NOWAIT] [REST]
        Comanda activează submeniul "nume" la coordonatele lin.col în ferestra activă (sau pe ecran), selectând iniţial opţiunea expn. Dacă nu se include clauza AT submeniul va fi afişat la coordonatele prevăzute la definirea lui, iar dacă nu apare opţiunea BAR
prima opţiune a submeniului va fi selectată.
        Clauza NOWAIT nu opreşte execuţia programului, iar clauza REST se foloseşte pentru submeniurile definite cu clauza PROMPT FIELD şi determină selectarea iniţială a opţiunii corespunzătoare indicatorului de înregistrări din baza de date. În lipsa acestei clauze va fi selectată prima opţiune. ^
         Exemplu:
         DEFINE POPUP popmenu
         DEFINE BAR 1 OF popmenu PROMPT '\<Fizica'
         DEFINE BAR 2 OF popmenu PROMPT \<Chimie'
         DEFINE BAR 3 OF popmenu PROMPT \<Literatura'
         DEFINE BAR 4 OF popmenu PROMPT \<Sport'
         ACTIVATE POPUP popmenu BAR 4 NOWAIT AT 2,5
         @ 10,10 SAY 'domeniu' GET dom DEFA ' '
         READ
         DEACTIVATE MENU mainmenu
                           

            Practic prin cele două exemple se realizează acelaşi lucru.
            Afişarea pe ecran (fereastră) a barelor de meniu şi submeniu fără activarea lor
se poate realiza cu comanda:
            SHOW MENU nume [,nume1...] | ALL
            [PAD nume opt] [SAVE]
            - comandă prin care se afişează barele de meniu enumerate (nume, nume1 ...), sau al tuturor barelor meniu definite dacă se foloseşte clauza ALL.
           Pentru afişarea unei opţiuni bară ca fiind selectată, acesta se specifică prin clauza PAD, iar pentru reţinerea imaginii barei de meniu fără activarea ei vom folosi clauza SAVE. 
           Această imagine reţinută în memorie poate fi ştearsă cu comanda CLEAR.
           Pentru afişarea submeniurilor se va folosi comanda SHOW POPUP.
           SHOW POPUP nume [,nume1 ...| ALL
           [PAD nume opt] [SAVE]
           Cu comanda HIDE MENU / POPUP se realizează înlăturarea de pe ecran a barelor de meniu (şi submeniu) fără ca acestea să fie înlăturate din memorie.
           HIDE MENU nume [,nume1...] |ALL
           [PAD nume opt] [SAVE]
           HIDE POPUP nume [,nume1...] | ALL
           [PAD nume opt] [SAVE]
           Legătura dintre barele de meniu şi submeniuri este de o importanţă deosebită pentru realizarea unor meniuri complexe. O modalitate de legare a unei bare de meniu cu o bară de submeniu sau o opţiune este dată de comanda ON PAD;
           ON PAD nume opt OF nume [ACTIVATE MENU nume
           [ACTIVATE POPUP nume sub]
          Comanda va avea efectul că în momentul alegerii opţiunii "nume opt" din bara de meniu se va activa submeniul "nume sub" sau bara de meniu "nume".
          Activarea submeniului sau a barei de meniu se face la selectarea opţiunii bară respective, fără a fi nevoie de acţionarea tastei ENTER sau SPACE.
          Pentru activarea unui submeniu se foloseşte clauza ACTIVATE POPUP urmată de numele submeniului, iar pentru activarea unei alte bare de meniu se foloseşte clauza ACTIVATE MENU, după care se include numele barei respective. Dacă nu se foloseşte nici una din cele două clauze, alegerea opţiunii nu va mai determina activarea nici unuia dintre aceste elemente, comanda folosindu-se la eliberarea opţiunii bară respective.
          Exemplu:
          DEFINE MENU mainmenu
          DEFINE PAD fiz OF mainmenu PROMPT '\<Fizica'
          DEFINE PAD chi OF mainmenu PROMPT \<Chimie'
          DEFINE PAD lit OF mainmenu PROMPT \<Literatura'
          DEFINE PAD spo OF mainmenu PROMPT \<Sport'
          DEFINE POPUP popmenut
          DEFINE BAR 1 OF popmenul PROMPT 'Fizica \<Atomica'
          DEFINE BAR 2 OF popmenul PROMPT 'Fizica \<Moleculara'
          DEFINE BAR 3 OF popmenul PROMPT '\<Caldura'
          DEFINE BAR 4 OF popmenu1 PROMPT '\<Electricitate'
          DEFINE POPUP popmenu2
          DEFINE BAR 1 OF popmenu2 PROMPT 'Chimie \<Oraganica'
          DEFINE BAR 2 OF popmenu2 PROMPT 'Chimie \<Anorganica'
          DEFINE BAR 3 OF popmenu2 PROMPT 'Chimie \<Fizica'
          ON PAD fiz OF mainmenu ACTIVATE POPUP popmenu1
          ON PAD chi OF mainmenu ACTIVATE POPUP popmenu2
          ACTIVATE MENU mainmenu
                                


           Corespunzătoare comenzii ON PAD pentru opţiuni bară, avem o comandă pentru opţiunile unui submeniu cu sintaxa:
           ON BAR expn OF nume sub [ACTIVATE POPUP nume
           |ACTiVATE MENU nume2]

           La selectarea opţiunii expn a submeniului "nume sub" se activează submeniul "nume" sau meniul "nume2".
          Dacă nici una din opţiuni nu se include în comandă, opţiunea expn a submeniului "nume sub" va fi eliberată (nu va putea determina activarea unui element la alegerea sa).
          Pot fi create în acest mod mai multe nivele de submeniuri, sau mai multe submeniuri care coordonează bare de meniuri.
          Grupul de comenzi ON SELECTION se foloseşte pentru ca la alegerea opţiunii bară sau a unei opţiuni a unui submeniu să se execute operaţii mai complexe.
          Aceste comenzi au forma:
          ON SELECTION MENU
          ON SELECTION PAD
          ON SELECTION POPUP
          ON SELECTION BAR
          Aceste comenzi determină executarea unei singure comenzi la alegerea opţiuni bară. Această comandă însă poate fi un apel de procedură (o comandă DO - executarea unui program) sau o instrucţiune care să contină apelul unei funcţii definite utilizator în cadrul căreia se pot executa o serie de operaţii, în funcţie de opţiunea aleasă. Sintaxa comenzii este:
          ON SELECTION MENU nume | ALL [instrucţiune]
          - instrucţiune - va fi executată la alegerea oricărei opţiuni bară a barei de meniu „nume” sau oricărei bare definite când se foloseşte clauza ALL. Comanda trebuie plasată între DEFINE MENU şi ACTIVATE MENU. Dacă instrucţiunea lipseşte din comandă, opţiunile bară respective sunt eliberate, adică nu se va executa nici o instrucţiune la alegerea lor.
          Comenzile:
          ON SELECTION POPUP nume|ALL [instrucţiune]
          ON SELECTION BAR expn OF nume|ALL
          [instrucţiune]
realizează executarea instrucţiunilor la alegerea opţiunii expn a submeniului nume sau a barului respectiv, sau eliberarea acestei opţiuni în cazul când aceasta (instructiunea) nu apare în comandă. Comanda trebuie plasată între DEFINE POPUP şi ACTIVATE POPUP.
          Poziţia şi dimensiunile unui submeniu pot fi modificate prin:
          MOVE POPUP nume TO lin,col | BY expn1 ,expn2
          Acestă comandă mută submeniul în poziţia lin,col sau peste expn1 linii şi expn2 coloane relativ la poziţia curentă. Deplasarea se face la stânga şi în jos dacă valorile sunt pozitive şi la dreapta şi în sus dacă ele sunt negative.
          Cu comanda:
          SIZE POPUP nume TO expn1,expn2 | BY expn3,expn4
se modifică poziţia submeniului "nume" la poziţia dată de colţul din dreapta jos (expn1,expn2 pentru clauza TO) şi va fi schimbată cu expn3 linii şi expn4 coloane când este folosită clauza BY. Pentru valori pozitive meniul va fi mărit iar pentru valori negative micşorat.
         Comenzile:
         PUSH MENU nume_meniu
         POP MENU nume_meniu [TO MASTER]
         PUSH POPUP nume_meniu
         POP POPUP nume_meniu
realizează salvarea unei versiuni a barei de meniu respectiv a submeniului, şi restaurarea acesteia (POP).
        Clauza TO MASTER folosită la comanda POP MENU determină extragerea din stivă a primei bare de meniu depusă, după care stiva se goleşte.
        La un moment dat doar un meniu poate fi activat. Dezactivarea acestuia se realizează cu comenzile:
        DEACTIVATE MENU nume [,nume2...] | ALL
        DEACTIVATE POPUP nume [,nume2...] | ALL
        Aceste comenzi nu înlătură meniul din memorie, deci nu este necesară redefinirea sa pentru activare.
        Eliberarea din memorie se realizează cu comenzile:
        RELEASE MENUS [listă meniuri [EXTENDED] ]
        RELEASE POPUPS [listă submeniuri [EXTENDED] ]
        RELEASE PAD nume_opt | ALL OF nume submenu
        RELEASE BAR expn | ALL OF nume submenu
       Comanda RELEASE elimină barele respective (meniu, submeniu, sau opţiunile bară din meniu sau submeniu). Clauza EXTENDED determină înlăturarea din memorie şi de pe ecran şi a elementelor subordonate. Clauza ALL OF determină înlăturarea tuturor elementelor submeniului respectiv.
       Toate barele de meniu vor fi eleminate cu comenzi CLEAR cu formele următoare:
       CLEAR MENUS |POPUPS | ALL
       În mod implicit meniurile sunt trasate cu o singură linie, iar dacă se doreşte modificarea acestei trasări se foloseşte comanda SET BORDER care a fost descrisă anterior.
       În timpul rulării unui program meniul sistem FoxPro poate fi accesat. Controlul accesului se realizează cu comanda:
        SET SYSMENU ON | OFF | AUTOMATIC
        TO [listă sub|listă opt] TO [DEFAULT]
        SAVE | NOSAVE
        Pentru ca meniul sistem să fie accesibil, la executarea unor comenzi de citire de la tastatură se include în comandă clauza ON (implicită), când activarea meniului sistem se face acţionând tasta F10 sau prin dublu click pe butonul drept al mouse-uli. Clauza OFF nu permite accesul la meniu.
       Clauza AUTOMATIC determină afişarea meniului pe ecran. Clauza TO se foloseşte pentru eliminarea unor submeniuri sistem (vor putea fi accesate doar meniurile şi submeniurite prezente în "listă sub" şi "listă opt"). Elementele din listă sunt separate prin virgulă.
       Clauza DEFAULT determină revenirea la configuraţia standard a meniului sistem.
O opţiune bară din meniu poate fi marcată. Acestă marcare se realizează cu următoarele comenzi:
       SET MARK OF MENU nume TO expc| expl
       SET MARK OF PAD nume opt OFF nume TO expc | expl
       SET MARK OF POPUP nume sub TO expc | expl
       SET MARK OF BAR expn OF nume sub TO expc | expl
      Aceste comenzi determină folosirea caracterului expc pentru marcarea unei opţiuni, sau a tuturor opţiunilor dacă se foloseşte forma cu expresie logică.
Se poate testa prin program starea marcată sau nu a unei opţiuni folosind funcţiile:
      MRKPAD (expc1,expc2)
care retumează dacă opţiunea bară specificată prin "expc2" a barei meniu "expc1" este marcată.
      MRKBAR (expc,expn)
returnează valoarea .T. dacă opţiunea bară "expn" a submeniului "expc" este marcată.
      Exemplu:
      SET TATK OFF
      CLEAR
      DEFINE MENU actiuni
      DEFINE PAD articol OF actiuni PROMPT \<Articol'
      DEFINE PAD calitate OF actiuni PROMPT \<Calitate'
      DEFINE PAD marcate OF actiuni PROMPT '\<Marcate'
      DEFINE PAD demarcate OF actiuni PROMPT '\<Demarcate'
      DEFINE PAD inversate OF actiuni PROMPT '\<lnversate'
      ON PAD articol OF actiuni ACTIVATE POFUP artic
      ON SELECTION PAD marcare OF actiuni DO mar1
      ON SELECTION PAD demarcare OF actiuni DO marc2
      ON SELECTION PAD inversare OF actiuni DO marc3
      SET MARK OF MENU actiuni TO '!'
      DEFINE POPUP artic MARGIN
      DEFINE BAR 1 OF artic PROMPT \<Masina '
      DEFINE BAR 2 OF artic PROMPT '\<Televizor'
      DEFINE BAR 3 OF artic PROMPT '\ <Apartament'
      DEFINE BAR 4 OF artic PROMPT '\<Teren '
      DEFINE BAR 5 OF artic PROMPT '\<Marcare'
      DEFINE BAR 6 OF artic PROMPT '\<Demarcare'
      DEFINE BAR 7 OF artic PROMPT \<lnversare'
      ON SELECTION BAR 5 OF artic DO marc4
      ON SELECTION BAR 6 OF artic DO marc5
      ON SELECTION BAR 7 OF artic DO marc6
      SET MARK OF POPUP artic TO '*'
      ACTIVATE MENU actiuni
      CLEAR POPUPS
      CLEAR MENUS
      PROCEDURE marc1
      SET MARK OF MENU actiuni TO .T.
      RETURN
      PROCEDURE marc2
      SET MARK OF MENU actiuni TO .F.
      RETURN
      PROCEDURE marc3
      SET MARK OF MENU actiuni TO not;
      MRKPAD('actiuni','inversare')
      RETURN
      PROCEDURE marc4
      SET MARK OF POPUP artic TO .T.
      RETURN
      PROCEDURE marc5
      SET MARK OF POPUP artic TO .F.
      RETURN
      PROCEDURE marc6
      SET MARK OF POPUP artic TO NOT MRKBAR('artic',7)
      RETURN

        În acest program se crează un meniu cu cinci opţiuni şi un submeniu asociat primei opţiuni meniu cu şapte opţiuni. Alegerea barei "Marcare" determină selectarea tuturor opţiunilor bară, iar alegerea optiunii "Demarcare" duce la demarcarea acestora. La alegerea opţiunii "Inversare" se va inversa starea opţiunilor.
        Posibilitatea de accesare a barelor meniu, opţiunilor bară, submeniurile şi opţiunile poate fi controlată cu comenzile SET SKIP:
        SET SKIP OF MENU nume expl
        SET SKIP OF PAD nume_opt OF nume expl
        SET SKIP OF POPUP nume_sub expl
        SET SKIP OF BAR expn | nume opt OF nume_sub expl

        Modul de funcţionare al comenzilor este asemănător (diferă doar elementul la care se referă: meniu, opţiune bară, submeniu, opţiune submeniu respectiv) şi fac posibilă accesarea acestora. În combinaţie cu acestea se pot folosi functiile referitoare la accesare:
        SKPPAD (expc1,expc2)
        SKPBAR (expc1,expc2)
        Aceste funcţii vor retuma valoarea .T. când elementul la care se referă nu poate fi accesat şi .F. în caz contrar. Funcţia SKPBAR() testează opţiunea dată de expn a submenului "expc".
        Exemplu:
        SET TALK OFF
        CLEAR
            a=1
        DEFINE MENU acţiuni
        DEFINE PAD articol OF actiuni PROMPT '\<Articol'
        DEFINE PAD calitate OF actiuni PROMPT \<Calitate'
        DEFINE PAD activare OF actiuni PROMPT 'Ac\<tivare'
        DEFINE PAD dezactivare OF actiuni PROMPT \<Dezactivare'
        ON PAD articol OF actiuni ACTIVATE POPUP artic
        ON SELECTION PAD marcare OF actiuni DO marc1
        ON SELECTION PAD demarcare OF actiuni DO marc2
        DEFINE POPUP artic MARGIN DEFINE BAR 1 OF artic PROMPT \<Masina '
        DEFINE BAR 2 OF artic PROMPT '\<Televizor'
        DEFINE BAR 3 OF artic PROMPT '\<Apartament'
        DEFINE BAR 4 OF artic PROMPT '\<Teren '
        DEFINE BAR 5 OF artic PROMPT 'A\<ctivare'
        DEFINE BAR 6 OF artic PROMPT \ <Dezactivare'
        ON SELECTION BAR 5 OF artic DO marc3
        ON SELECTION BAR 6 OF artic DO marc4
        ACTIVATE MENU actiuni
        DEACTIVATE MENU actiuni
        PROCEDURE marc1
       @ 10,10 SAY' ' GET a DEFAULT 1 PICT '9' RANGE 1,2
       READ
       CLEAR
           IF a=1
       SET SKIP OF PAD articol OF actiuni .F.
           ELSE
       SET SKIP OF PAD calitate OF actiuni .F.
       ENDIF
       RETURN

       PROCEDURE marc2
       @ 10,10 SAY ' ' GET a DEFAULT 1 PICT '9' RANGE 1,2
       READ
       CLEAR
          IF a=1
       SET SKIP OF PAD articol OF actiuni .T.
          ELSE SET SKIP OF PAD calitate OF actiuni -T.
       ENDIF
       RETURN
       
       PROCEDURE marc3
       @ 10,10 SAY 'lntroduceti nr. optiunii de dezactivat';
       GET a DEFAULT 1 PICT '9' RANGE 1,4
       READ
       CLEAR
       SET SKIP OF BAR a OF artic.F.
       RETURN

       PROCEDURE marc4
       @ 10,10 SAY 'lntroduceti nr. optiunii de dezactivat ';
       GET a DEFAULT 1 PICT '9' RANGE 1,4
       READ
       CLEAR
       SET SKIP OF BAR a OF artic.T.
       RETURN

       FUNCŢII REFERITORE LA MENIURI

       Ultima optiune bară alesă din bara de meniu activă este dată de funcţia:
       PAD()
       Numele opţiunii bară este returnat cu majuscule de funcţie. Dacă nu exista bară de meniu activă se returnează şirul nul.
       BAR () - returnează un număr reprezentând numărul ultimei opţiuni selectate
       MENU () - retumează un şir de caraciere conţinând numele barei meniu active (majuscule)
       POPUP () - returneză un şir de caractere reprezentând numele submeniului activ
       PROMPT () - returnează textul asociat ultimii opţiunii bară selectate
       PRMPAD (expc1,expc2) - returnează textul asociat ultimei opţiuni bară a submeniului
       PRMBAR (expc1,expn) - returnează textul asociat ultimei opţiuni a submeniului
       CNTPAD (expc) - retumează numărul de opţiuni bară asociate unei bare meniu (expc)
      CNTBAR (expc) – returnează numărul de opţiuni ale submeniutui (expc)
      GETPAD (expc,expn) - returnează numele opţiunii bară de pe poziţia "expn" a barei "expc"
     GETBAR (expc,expn) - returnează numeie opţiunii de pe poziţia expn din submeniul "expc"
      Funcţiile PRMBAR () şi PRMPAD () sunt folosite pentru a trece de la unele opţiuni (bară şi respectiv simple) la textul asociat prin construcţii de tipul următor:
      PRMPAD (MENU (), GETPAD (MENU(),i))
      PRMBAR (POPUP(), GETBAR (POPUP(),i))

Niciun comentariu:

Trimiteți un comentariu