Sunteți pe pagina 1din 37

Elemente de Visual Basic

B. Demoreanu s

Cuprins
1 Concepte generale 1.1 Constante, variabile, expresii . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Declaratii i conversii de tip. Tablouri . . . . . . . . . . . . . . . . . . . . . . . s 1.3 Functii standard . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Structuri de control 2.1 Structuri de decizie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Structuri repetitive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Proceduri generale 3.1 Subprograme de tip subrutin i functie . . . . . . . . . . . . . . . . . . . . . . as 3.2 Subprograme de tip GoSub ... Return . . . . . . . . . . . . . . . . . . . . . . 3.3 Rutine de tratare a erorilor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Sistemul de I/O. Fiiere s 4.1 Casete de dialog predenite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 Metoda Print i functia Format . . . . . . . . . . . . . . . . . . . . . . . . . s 4.3 Fiiere Visual Basic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . s n 5 Metode i proprieti grace Visual Basic s at n 5.1 Metode grace . . . . . . . . . . . . . . . . 5.2 Specicarea culorilor . . . . . . . . . . . . . 5.3 Proprieti grace . . . . . . . . . . . . . . at 5.3.1 Procedee de trasare . . . . . . . . . 5.3.2 Procedee de umplere . . . . . . . . . 5.4 Sistemul de coordonate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 6 8 10 10 11 13 13 15 16 16 17 19 21 25 25 27 28 28 29 29 31

A Anex: o procedur util pentru reprezentri grace a a a a 1

Elemente de Visual Basic

Concepte generale

Avndu-i originea a s ntr-un limbaj numeric de programare destinat initial nceptorilor, sistemul a Visual Basic a devenit ultimii ani un limbaj foarte evoluat, destinat mare msur programrii n n a a a orientate spre obiecte i dirijate de evenimente (OOED). Beneciind de o Interfat Grac Utilis a a zator (GUI) performant, bazat pe sistemul de operare Windows, pot dezvoltate relativ uor o a a s serie de aplicatii, pornind de la calcule simple i reprezentri grace, pn la constructii de baze s a a a de date, sau aplicatii cu interfat multi-document (MDI). a Dei primele elemente ale limbajului Basic (Beginners All-purpose Symbolic Instruction Code) s dateaz a din 1965, doar a nc ncepnd cu anii 80, odat cu dezvoltatea calculatoarelor pe 8 i a a s 16 biti se poate vorbi de o evolutie semnicativ. Imbuntirile aduse prezent limbajului sunt a a at n considerabile, ceea ce transform l a ntr-un instrument modern, deosebit de ecace, pentru dezvoltarea unor aplicatii complexe. Sunt utilizate o serie de concepte de programare structurat, a cunoscute i din alte limbaje, dintre care amintim doar structurile de decizie i de ciclare, posis s bilitatea de a lucra cu subprograme i functii externe ca module independente de program, noi s tipuri de date, variabile globale i locale, etc. Mediul de programare include un editor performant s care semnaleaz orice eroare de sintax, posibiliti de depanare interactiv deosebit de ecace, a a at a un sistem integrat de help-uri care se poate substitui bun msur unui manual exhaustiv. n a a a cele ce urmeaz vor prezentate succint doar elementele strict necesare dezvoltrii unei In a a aplicatii numerice, urmnd ca proprietile i metodele specice obiectelor Visual Basic s e a at s n a 1,2 site de utilizator din literatura de specialitate . nsu

1.1

Constante, variabile, expresii

Constantele sunt valori care se utilizeaz a ntr-un program i care nu se modic timpul s a n Visual Basic pot utilizate urmtoarele tipuri de constante : executiei. In a Byte : reprezentate pe un octet, cu valori domeniul 0 255 , adic 0 28 1 ; n a Boolean : reprezentate pe doi octeti cu valorile True i False ; s
1 2

* * * - Visual Basic 4 Unleashed, Sams Publishing, Indianapolis, 1995. M. S. Heyman - Essential Visual Basic 4, Sams Publishing, Indianapolis, 1996.

Integer ( ntreg) : reprezentate pe doi octeti, cu valori domeniul 3276832767 , adic n a 15 15 2 2 1 ; Long ( ntreg lung) : reprezentate pe patru octeti, cu valori domeniul 2147483648 n 2147483647 , adic 231 231 1 ; a Single (real simpl precizie) : reprezentate pe patru octeti, cu valori negative domeniul a n 38 45 3.402823 10 1.401298 10 i valori pozitive domeniul 1.401298 1045 s n 38 3.402823 10 ; Double (real dubl precizie) : reprezentate pe opt octeti, cu valori negative domeniul a n 1.79769313486232 10308 4.94065645841247 10324 i valori pozitive domeniul s n 324 308 4.94065645841247 10 1.79769313486232 10 ; Currency (moned, valut) : reprezentate pe opt octeti, cu valori cuprinse domeniul a a n 922337203685477.5808922337203685477.5807 , adic intervalul [263 263 1] scalat a la 10000 ; Date (dat) : reprezentate pe opt octeti, cu valori domeniul #January 1, 100# i a n s #December 31, 9999# ; String (ir de caractere) : o succesiune de maximum 32767 caractere ASCII scrise s ntre ghilimele (") , ecare caracter ocupnd un octet de memorie. Limbajul Basic recunoate a s i constanta ir vid de caractere (""). Sistemele pe 32 biti permit iruri avnd o lungime s s s a maxim de 2147483647 caractere. a Pentru a evita unele ambiguiti descrierea i efectuarea unor operatii cu numere avnd at n s a reprezentare intern distinct (aritmetica a a ntreag este complet diferit de aritmetica virgul a a n a otant), este recomandabil ataarea unor suxe care s indice explicit tipul: % - pentru a a s a ntreg, & - pentru ntreg lung, ! - pentru real simpl precizie, # - pentru real dubl precizie, @ - pentru a a moned. cazurile care nu exist dubii, suxul va eliminat automat de compilator. a In n a O variabil reprezint o mrime care poate lua diferite valori dintr-o multime dat. Variabila a a a a are un tip, un nume i o valoare. s afara variabilelor de tip numeric (Byte , Integer , Long , Single , Double , Currency), In logic (Boolean), sau dat (Date), sistemul recunoate tipul ir de caractere cu lungime variabil a s s a (String) sau x (String*n), tipul obiect (Object), tipul nedenit (Variant), tipul denit de a utilizator (Type ... End Type). Numele variabilei const dintr-un ir de maximum 255 de caractere alfanumerice, inclusiv a s caracterul ( ), primul caracter ind obligatoriu o liter. Numele unei variabile numerice poate a urmat de unul din caracterele %, &, !, #, @ care indic tipul variabilei. Numelui unei variabile ir a s de caractere i se poate ataa suxul $ . afara declaratiilor implicite de tip realizate cu ajutorul s In suxelor, exist posibilitatea declarrii explicite a tipului cu ajutorul instructiunilor Dim , Static , a a Public , Private . Valoarea variabilei depinde de tipul ei. Numele unei variabile nu poate un cuvnt rezervat (instructiune, comand, cuvnt cheie). a a a Tipul de date nedenit este cel prestabilit Visual Basic, el reprezentnd tipul oricrei variabile n a a care nu a fost declarat explicit sau implicit. O variabil de tip variant poate contine date de a tip numeric, iruri de caractere, date calendaristice, precum i valorile speciale Empty i Null. s s s 3

Ultimele dou entiti sunt distincte, valoarea Empty indicnd c variabila nu a fost initializat a at a a a (ea este zero pentru o dat numeric, sau are o lungime nul pentru un ir de caractere), iar a a a s valoarea Null corespunde situatiei care variabila nu contine nici o dat valid. Folosirea tipului n a a variant asigur o exibilitate mai mare manipularea datelor, tipul concret de dat continut a n a rezultnd din analiza contextului, ceea ce are drept consecint o oarecare scdere a vitezei de a a a calcul. O expresie reprezint o succesiune de variabile, functii i constante legate a s ntre ele prin operatori i paranteze (dac este cazul). Functia reprezint un subprogram care primete una s a a s sau mai multe valori, efectueaz anumite calcule, rezultatul ind returnat prin numele functiei. a particular, o Operatorii specic operatiile care se efectueaz asupra valorilor operanzilor. In a a expresie se poate reduce la un singur operand. a) Expresiile aritmetice const din operanzi i operatori aritmetici. Tab. 1 gureaz opea s In a ratorii aritmetici binari ordinea descrescnd a precedentei acestora. Precedenta operatorilor n a a stabilete prioritatea operatiilor s ntr-o succesiune care nu contine paranteze. La precedent egal, a a Operator Semnicatie ^ ridicare la putere (exponentiere) *, / nmultire i artire real s mp a \ artire mp ntreag a Mod restul artirii mp ntregi (modulo) +,adunare i scdere s a & concatenarea irurilor de caractere s Tabelul 1: Operatori aritmetici binari operatiile se efectueaz de la stnga la dreapta. Sistemul recunoate i operatorul minus unar, a a s s a crui precedent este imediat dup cea a operatorului de ridicare la putere. Este interzis a a a a scrierea consecutiv a doi operatori , unica exceptie reprezentnd-o operatorul minus unar a a care poate plasat imediat dup un operator binar. a Dac doi operanzi sunt de acelai tip, i rezultatul va de acelai tip. Dac a operanzii a s s s a ns sunt de tipuri diferite, operandul cu rang mai sczut va convertit la tipul operandului cu rang a mai nalt, rezultatul avnd rangul celui din urm. Operatorul (+) servete i la concatenarea cona a s s stantelor, variabilelor i variantilor care contin iruri de caractere, a operatorul de concatenare s s ns recomandat a folosit este (&), deoarece acesta realizeaz concatenarea chiar dac un variant a a Tab. 1 este trecut i operatorul de concateneare pentru contine o entitate de tip numeric. In s iruri (&) dei acesta nu este un operator aritmetic, deoarece precedenta sa este inferioar oricrui s s a a operator aritmetic, dar superioar operatorilor de relatie. a b) Expresiile de relatie const din expresii aritmetice sau de tip ir de caractere separate prin a s operatori de relatie. Operatorii relationali (v. Tab. 2) sunt binari i au toti aceeai precedent, s s a dar aceasta este inferioar operatorilor aritmetici i superioar operatorilor logici. Rezultatul unei a s a expresii de relatie este o entitate de tip logic (True sau False), dar poate lua i valoarea Null. s Dac operanzii nu sunt de acelai tip, a s naintea evalurii expresiei se face convertirea operanzilor a cu rang mai sczut la operandul cu rang mai ridicat. cazul operanzilor de tip ir de caractere, a In s 4

Operator Semnicatie = egal cu . . . <> diferit de . . . < mai mic ca . . . > mai mare ca . . . <= mai mic sau egal cu . . . >= mai mare sau egal cu . . . Like irul este asemenea cu . . . s Is . . . este . . . Tabelul 2: Operatori relationali compararea valorilor se face pe baza relatiei de ordine a codurilor ASCII. Operatorul Like servete s la compararea unui ir de caractere cu un ablon predenit. Adresele obiectelor denite Visual s s n Basic pot comparate cu operatorul Is , rezultatul indicnd dac operanzii fac sau nu referire la a a acelai obiect. s c) Expresiile logice contin operatori logici i operanzi care trebuie s e entiti de tip logic. s a at Prin exceptie un operand poate i o constant, variabil sau expresie numeric, caz care s a a a n dac are valoarea 0, i se atribuie valoarea logic False, iar pentru orice valoare numeric diferit a a a a Operator Not And Or Xor Eqv Imp Semnicatie negatie logic a i logic s sau logic sau excusiv logic echivalent logic a a implicatie logic a

Tabelul 3: Operatori logici de zero se consider c are valoarea logic True. Operatorii logici ordinea precedentei sunt a a a n prezentati Tab. 3 . Unicul operator unar este operatorul Not. Dac ambii operanzi sunt de tip n a numeric, ei sunt convertiti n ntregi i apoi este efectuat operatia pe biti indicat de operator. s a a Utilizarea parantezelor modic ordinea implicit care se efectueaz operatiile, ordine a a n a asociat cu precedenta operatorului utilizat. Calculul a ncepe ntotdeauna cu evaluarea parantezei avnd adncimea cea mai mare. a a Comentariile pot evidentiate ierul surs folosind instructiunea Rem sau caracterul n s a cazul folosirii instructiunii Rem, aceasta trebuie s apostrof (), care preced textul respectiv. In a e obligator urmat de un spatiu, iar dac nu este prima instructiune de pe o linie, ea trebuie a a plasat dup caracterul (:). Spre deosebire de liniile de cod care contin instructiuni executabile a a sau declaratii, care pot continuate pe linia urmtoare prin utilizarea perechii de caractere ( _ ), a liniile care contin comentarii nu beneciaz de aceast facilitate. a a 5

Visual Basic exist posibilitatea de a folosi constante simbolice, prin atribuirea de valori In a unor nume. Valorile atribuite constantelor nu pot modicate cursul executiei. Instructiunea n respectiv este : a [{ Public | Private }] Const nume [As tip ] = expr [, ...] unde expr poate contine orice alte constante denite anterior, precum i operatii aritmetice cu s exceptia celei de ridicare la putere. Cuvintele cheie Public sau Private nu pot utilizate dect la a nivel de modul i indic domeniul de vizibilitate al constantei, anume toate modulele proiectului, s a n respectiv doar modulul de denitie (cazul implicit). Constantele declarate proceduri au doar n n o extindere local. Dac este cazul, prin tip poate specicat tipul de dat referit de constant. a a a a

1.2

Declaratii i conversii de tip. Tablouri s

afara specicatiilor cu ajutorul suxelor %, &, !, #, @, $, exist posibilitatea de declarare In a implicit a tipului de date utiliznd la nivel de modul instructiuni de forma : a a DefTip lit [, lit ] ... unde lit este e o liter, e un interval de litere ordine alfabetic, iar loc de Tip pot gura a n a n simbolurile Bool, Byte, Int, Lng, Sng, Dbl, Cur, Date, Str, Obj, Var, corespondentele de tip ind evidente. Exemple : DefInt I, K: DefLng J: DefLng L-N: DefDbl A-H, O-Z O specicatie explicit la nivel de procedur sau de modul, poate modica oricnd specicatiile a a a implicite. Tipul unei variabile poate declarat explicit cu ajutorul uneia din instructiunile : Dim numevar [([domvarind ])] [As [New] tip ] [, ...] Static numevar [([domvarind ])] [As [New] tip ] [, ...] Public numevar [([domvarind ])] [As [New] tip ] [, ...] Private numevar [([domvarind ])] [As [New] tip ] [, ...] unde numevar reprezint numele variabilei, iar tip poate Byte, Boolean, Integer, Long, a Single, Double, Currency, Date, STRING[*n ], Object, Variant, sau un tip denit anterior de utilizator. Nu este necesar declararea tipului dac declaratiile implicite cu suxe sau cu a a instructiunea DefTip descriu corect tipul variabilei. absenta oricrei specicatii de tip, numevar In a va de tipul variant. Instructiunile amintite servesc totodat i la alocarea memoriei necesare as pentru stocarea datelor. Cuvntul cheie New este folosit doar cazul care o variabil este a n n a declarat ca ind de tip obiect. a Domeniul de actiune al variabilelor specicate la nivel de modul cu instructiunea Dim se extinde la toate procedurile continute de modulul respectiv, schimb variabilele declarate n ntr-o procedur a sunt locale procedurii respective. Instructiunea Static este folosit numai la nivel de procedur a a i are rolul de a specica explicit faptul c valorarea variabilei este pstrat memorie s a a a n ntre dou a apeluri succesive ale procedurii. Dac se dorete memorarea tuturor variabilelor a s ntre apeluri, ai nss procedura va trebui declarat cu cuvntul cheie Static . Este recomandabil ca instructiunile Dim a a i Static s gureze zona de cod de la s a n nceputul unei proceduri. Instructiunile Public (Global versiunile mai vechi) i Private sunt utilizate la nivel de modul pentru a declara n s variabile recunoscute toate modulele unui proiect, respectiv doar modulul care este fcut n n n a a specicarea. Simultan cu declararea explicit a tipului, are loc i initializarea variabilelor. Variabilele de a s 6

tip numeric sunt initializate cu zero, irurile de caractere de lungime variabil sunt initializate cu s a irul vid, irurile de lungime x sunt completate cu caracterul "0", iar variantii sunt initializati s s a cu valoarea Empty . Un tablou reprezint o structur de date care un numr de variabile de acelai tip sunt a a n a s organizate sub acelai nume. Accesarea unui element al tabloului se face specicnd numele s a acestuia, precum i pozitia elementului tablou. Rezervarea memoriei necesare se face utiliznd s n a una din instructiunile mentionate anterior, iar precizarea dimensiunilor i a domeniilor de variatie s pentru indici se face cu domvarind care are sintaxa : [indmin To] indmax [, ...] Dac specicatia indmin To lipsete, atunci indicele primului element este zero. Pentru calculul a s cu matrice (dar nu numai) se recomand ca valoarea minim a indicilor s e unitatea. Pentru a a a a realiza acest lucru, se va utiliza e sintaxa complet, e a naintea instructiunii Dim sau a uneia similare va plasat instructiunea Option Base 1 . Limbajul Visual Basic admite tablouri cu a maximum 60 de dimensiuni. Elementele unui tablou sunt initializate automat de sistem folosind regulile mentionate anterior. Tablourile pot de dou tipuri : a) tablouri cu dimensiuni xe, pentru care spatiul aloa cat memorie este x ; b) tablouri dinamice, pentru care spatiul necesar de memorie este n alocat timpul executiei. Dac specicarea domeniului de variatie pentru indici se face cu conn a stante ntregi, atunci tabloul are dimensiuni xe, iar dac instructiunile Dim , Public , Private a n aceast specicatie lipsete, instructiunea de declarare a tipului continnd doar perechea de paa s a ranteze ( ), atunci tabloul este dinamic. Instructiunea : ReDim [Preserve] numevar [(domvarind )] [As tip ] [, ...] este utilizat pentru dimensionarea sau redimensionarea unui tablou alocat dinamic. Redimena sionarea unui tablou dinamic are ca efect reinitializarea tuturor valorilor elementelor. Folosirea cuvntului cheie Preserve are ca efect pstrarea valorilor stocate elementele de tablou, dar a a n aceast situatie poate redimensionat doar domeniul de variatie a ultimului indice (tablourile n a sunt stocate memorie pe linii). n Incercarea de redimensionare a unui tablou static genereaz un mesaj de eroare. Reinitializarea a unui tablou static se poate face cu instructiunea : Erase numetab [, ...]. Dac aceast instructiune numetab reprezint numele unui tablou dinamic, acesta este ters a n a a s din memorie, reinitializarea lui ind posibil doar dup ce acesta este declarat din nou cu o a a instructiune de declarare a tipului. afara tipurilor predenite, limbajul permite denirea unor variabile de tip utilizator, care In pot avea o structur cu mai multe elemente avnd tipuri diferite : a a [{ Private | Public }] Type numetip numeelem [([domvarind ])] As tip [numeelem [([domvarind ])] As tip ] ... End Type Aici numetip este numele ales de utilizator, numeelem este un nume de element, iar tip este unul din tipurile mentionate anterior. Se observ din denitie c variabilele pot contine i tablouri cu a a s dimensiuni xe sau dinamice. Variabilele de tip utilizator pot declarate doar la nivel de modul, cuvintele cheie Public sau Private preciznd domeniul de vizibilitate al acestora, anume toate a n 7

modulele, respectiv doar modulul care sunt denite. Crearea propriu-zis a variabilei numevar n n a este realizat cu una din instructiunile Dim , Static , Public , Private , ReDim . Referirea la un a cmp al variabilei se face folosind sintaxa cu punct : numevar.numeelem . a cazul unei variabile numerice , tipul acesteia determin precizia, precum i In i a s intervalul care aceasta poate lua valori. Dup cum s-a mentionat, cazul unei expresii n a n aritmetice, dac operanzii sunt de tipuri diferite, sistemul va converti automat operanzii cu rang a mai sczut la tipul operanzilor cu rang mai a nalt, ordinea ind Integer , Long , Single , Double . cazul unei instructiuni de atribuire, care are forma general : In a [Let] numevar = expr unde expr contine o valoare numeric sau un ir care este expresia literal a unui numr, conversia a s a a se face ntotdeauna la tipul lui numevar. Dac precizia expr este mai mare dect precizia numevar, a a are loc o rotunjire a rezultatului evalurii expresiei. Astfel, dac particular b! = 3.654, a a n n urma executrii instructiunii a% = b!, variabila a% are valoarea 4 . a Conversia de tip poate realizat i explicit utiliz functiile as nd CInt(expr ) ; CLng(expr ) ; CSng(expr ) ; CDbl(expr ) unde argumentul expr , care se evalueaz la o valoare numeric sau la un ir de caracterea ce a a s contine o valoare numeric, trebuie s se a a ncadreze domeniul de valori corepunztor tipului de n a dat la care se face conversia, tip indicat numele functiei imediat dup caracterul C . a n a Instructiunea prin care unei variabile ir i se atribuie o valoare numeric genereaz un mesaj s a a de eroare. Situatia poate evitat prin utilizarea functiei CStr(expr). a

1.3

Functii standard

Limbajul Basic este destul de srac functii matematice . Tab. 4 este prezentat lista a n In a Functia Abs(expr ) Int(expr ) Fix(expr ) Sgn(expr ) Sqr(expr ) Log(expr ) Exp(expr ) Sin(unghi ) Cos(unghi ) Tan(unghi ) Atn(expr ) Denitia valoarea absolut a trunchiere la intregul imediat inferior trunchiere la partea ntreaga functia semn : returneaz 1 sau 0 a radical logaritmul natural exponentiala sinusul unghiului cosinusul unghiului tangenta unghiului lungimea arcului avnd tangenta . . . a

Tabelul 4: Functiile matematice ale limbajului acestora, unde expr reprezint o expresie numeric, iar unghi se evalueaz la un unghi exprimat a a a radiani. Functiile matematice derivate pot exprimate prin aceste functii elementare folosind n formulele cunoscute. 8

Generatorul de numere aleatoare este initializat cu instructiunea : Randomize [expr ] unde expr este o expresie numeric, lipsa acesteia initializarea secventei ind fcut implicit a n a a cu functia Timer, care furnizeaz numrul de secunde scurs de la miezul noptii. Generarea a a propriu-zis de numere aleatoare distribuite uniform pe intervalul ( 0, 1 ) este fcut cu functia a a a Rnd[(expr )]. Amintim i cteva din functiile pe iruri de caractere . Extragerea unui subir dintr-un ir s a s s s de caractere poate realizat cu functiile : a Left(ir , lung ) ; Right(ir , lung ) ; Mid(ir , s s s ncep [,lung ]) Primele dou functii returneaz un subir de caractere de lungime lung din irul ir , numrtoarea a a s s s aa fcndu-se de la captul din stnga, respectiv de la captul din dreapta al irului. Functia Mid a a a a a s returneaz un subir din ir a s s ncepnd cu caracterul care are indicele a ncep, lungimea sa ind lung sau, lips, toate caracterele pn la sfritul irului. n a a a as s Suprimarea blancurilor de la nceputul sau de la sfritul unui ir de caractere se realizeaz cu as s a functiile : LTrim(ir ) ; RTrim(ir ) s s rezultatul ind un subir al irului ir . s s s Lungimea unui ir de caractere este dat de functia : s a Len({ir | numevar }) s Visual Basic, functia Len poate admite ca argument i un nume de variabil (inclusiv de tip In s a utilizator), caz care valoarea returnat de functie reprezint lungimea octeti a variabilei n a a n respective. Convertirea caracterelor dintr-un ir numai la litere mici, respectiv numai la litere majuscule s se realizeaz cu functiile : a LCase(ir ) ; UCase(ir ) s s rezultatul ind evident un ir de caractere de aceeai lungime ca a lui ir . s s s Construirea unui ir de lungime specicat format din caractere de acelai tip se face cu s a s functia : String(lung , {codASCII | ir }) s Dac locul codului ASCII se specic un ir de caractere, atunci irul nou creat este format a n a s s numai din primul caracter din specicatia ir . O instructiune asemntoare care creeaz iruri s a a as formate doar din spatii este : Space(numsp ) . Convertirea din codul ASCII caracterul corespunztor i invers se realizeaz cu functiile : n a s a Chr(codASCII ) ; Asc(caract ) Cutarea pozitiei unui subir a s ntr-un ir dat este realizat de functia : s a InStr([start, ] ir , subir ) s s unde start indic indicele caracterului de unde a ncepe cutarea. a Functia Val(ir ) returneaz valoarea numeric continut ir , inversa acestei functii ind s a a a n s Str(num ). Functiile Date i Time returneaz data i ora sistemului sub forma unor iruri de caractere. s a s s

2
2.1

Structuri de control
Structuri de decizie

cursul executiei este adesea necesar s se ia o decizie dac se va executa un grup sau altul In a a de instructiuni. Aceasta se realizeaz folosind structura alternativ If-Then-Else : a a If exprcond-1 Then blocinstr-1 [ElseIf exprcond-2 Then blocinstr-2 ] ... ... [Else blocinstr-n ] End If unde exprcond sunt expresii de tip numeric sau de tip ir de caractere care se evalueaz la True s a sau False . Dac una din expresiile conditionale este adevrat, atunci se evalueaz blocul de a a a a instructiuni blocinstr aferent i apoi structura este prsit. Dac a niciuna din expresii nu este s aa a a ns adevrat i dac exist instructiunea Else , va executat blocul de instructiuni asociat acesteia. a as a a toate cazurile, executia continu cu prima instructiune care urmeaz structurii alternative. In a a Blocurile de instructiuni pot contine la rndul lor structuri alternative de tipul descris mai sus. a Sistemul recunoate i instructiunea avnd forma prescurtat : s s a a If exprcond Then blocinstr-1 [Else blocinstr-2 ] care trebuie scris pe o singur linie. Se recomand utilizarea acestei forme dac blocinstr-1, i a a a a s blocinstr-2, contin un numr redus de instructiuni, eventual doar cte una singur. a a a cazuri simple poate folosit i functia : In as IIf (exprcond, expr-adev, expr-fals ) care dac exprcond are valoarea True returneaz expresia aritmetic sau ir expr-adev, iar dac a a a s a are valoarea False returneaz expr-fals . a O structur alternativ mult mai general care permite luarea unei decizii privind executarea a a a unui anumit bloc de instructiuni functie de valoarea unei expresii numerice sau de tip ir de n s programele complexe caractere, numit selector, este descris de structura Select Case. In a a este preferabil utilizarea acestei structuri mai sugestive, locul instructiunilor de tip If. Sintaxa a n general a acestei structuri alternative generalizate este : a Select Case exprselect Case listexpr-1 blocinstr-1 [Case listexpr-2 blocinstr-2 ] ... ... [Case Else blocinstr-n ] End Select Dup cum s-a amintit exprselect este o expresie numeric sau de tip ir, functie de valoarea a a s n 10

creia se va executa un anumit bloc de instructiuni. listexpr va contine una sau mai multe expresii a care trebuie s e obligatoriu de acelai tip cu exprselect i poate avea una din urmtoarele forme : a s s a expr [, expr ] ... ; expr To expr ; Is operatrel expr sau eventual combinatii ale acestora. ultima form operatrel este un operator relational care In a poate < , > , <> , = , <= , >= , precedat obligatoriu de cuvntul cheie Is . Dac valoarea exprselect a a se ncadreaz una din listele listexpr , vor executate instructiunile din blocul blocinstr asociat, a n caz contrar trecndu-se la executarea instructiunilor aferente instructiunii Case Else , dac n a a aceasta exist. a VisualBasic este recunosct i instructiunea de salt neconditionat : In as GoTo {linie | etic } unde argumentul este numrul liniei unei instructiuni sau o etichet a unui bloc de instructiuni. a a Amintim c eticheta este un identicator urmat obligatoriu de caracterul (:). Sistemul accept a a i instructiunea alternativ mai general : s a a On expr GoTo list a unde expr este o expresie ntreag care poate lua valori a ntre 0 i 255. functie de valoarea s In numeric a acestui argument, controlul este transferat blocului de instructiuni asociat unei etichete a sau unui numr de linie din list, functie de pozitia sa list. Dac valoarea lui expr este 0, sau a a n n a a dac ea este mai mare dect numrul de etichete din list, executia se continu cu instructiunea a a a a a urmtoare, iar dac este negativ sau mai mare dect 255, va generat un mesaj de eroare. a a a a

2.2

Structuri repetitive

Structurile repetitive descriu situatiile care necesitile de calcul impun repetarea unui grup n at de instructiuni de un numr controlat de ori. a Cea mai ultilizat structur de acest tip este realizat cu instructiunea For ... Next care a a a realizeaz repetarea unei secvente de instructiuni, numrul de repetri ind determinat de valorile a a a pe care le poate lua o variabil contor pe un domeniu dat de valori : a For contor = valinit To valn [Step pas ] [blocinstr ] [Exit For] [blocinstr ] Next [contor ] Executia ncepe prin atribuirea pentru variabila contor a valorii specicate de valinit i se execut s a continuare valoarea variabilei contor este incrementat blocul de instructiuni (dac exist). In a a a cu valoarea pas, dac aceasta exist, caz contrar valoarea implicit pentru pas ind unitatea, a a n a i dac valoarea rezultat pentru contor este mai mic dect valn, blocul de instructiuni se s a a a a reia de la nceput. Procedeul se repet pn cnd valoarea variabilei contor depete valoarea a a a a as s specicat de valn. Numrul de repetri va dat de formula : a a a Fix valn valinit +1 pas

versiunile mai vechi ale limbajului Basic, chiar dac valn < valinit i pas > 0, ciclul ar trebui In a s Visual Basic el nu se va executa niciodat, deoarece s e executat cel putin o singur dat. In a a a a nainte de a se ntra executie, sistemul evalueaz formula de mai sus i dac rezultatul este n a s a negativ sau zero, ciclul nu se va mai efectua. 11

Sunt admise cicluri incluse unul altul cu conditia ca variabila de control s difere de la n a ciclu la ciclu. Ultimul ciclu deschis cu instructiunea For va trebui s e primul ciclu a nchis cu instructiunea Next aferent, .a.m.d. O singur instructiune Next poate a s a nchide mai multe cicluri incluse, ordinea contoarelor trebuind s respecte regula ultimul deschis, primul a nchis . Ieirea fortat dintr-un ciclu descris cu structura For ... Next poate realizat cu instructius a a nea Exit For plasat corpul ciclului, executia programului continund cu instructiunea imediat a n a urmtoare instructiunii Next . a Deoarece practic repetarea unei secvente de instructiuni poate determinat nu de valoan a a rea numeric a unei variabile contor, ci de modul cum este a ndeplinit o conditie a crei valoare a a este o entitate de tip logic True sau False, pot folosite i structuri repetitive realizate cu s instructiunea Do, avnd una din urmtoarele forme : a a Do [{ While | Until } exprcond ] [blocinstr ] [Exit Do] [blocinstr ] Loop sau : Do [blocinstr ] [Exit Do] [blocinstr ] Loop [{ While | Until } exprcond ] Aici exprcond este o expresie relational sau logic. Ciclul construit cu While se va relua atta a a a timp ct exprcond are valoarea True , iar ciclul construit cu Until va reluat pn cnd a a a a exprcond primete valoarea True . s Intre cele dou sintaxe exist o deosebire esential. Dac primul caz este posibil ca ciclul s a a a a n a nu e executat niciodat, functie de valoarea de adevr sau de fals a argumentului exprcond, a n a cel de al doilea caz, ciclul va executat cel putin o singur dat, deoarece operatia de testare n a a a relurii ciclului este fcut dup parcurgerea blocului de instructiuni. a a a a O ieire fortat dintr-un astfel de ciclu se poate face cu instructiunea Exit Do, executia s a programului continund cu instructiunea imediat urmtoare instructiunii Loop . a a Se observ c este posibil i structura repetitiv cu sintaxa : a a as a Do [blocinstr ] [Exit Do] [blocinstr ] Loop Evident, este vorba de un ciclu innit, executia sa putnd a ntrerupt doar cu o instructiune a Exit Do plasat interiorul blocului de instructiuni care se repet. a n a Pentru a pstra compatibilitatea cu GW-Basic sau Basica, sistemul Visual Basic recunoate a s i structura repetitiv : s a While exprcond [blocinstr ] Wend unde secventa blocinstr va executat atta timp ct exprcond are valoarea True. a a a 12

Proceduri generale

Divizarea unui program general Visual Basic o serie de uniti logice mai mici este impus n at a de satisfacerea a dou cerinte : a) claritate redactare i uurint la depanare, cazul existentei a n s s a n unor erori de conceptie sau de programare; b) evitarea repetrii unor secvente de cod mai scurte a sau mai lungi, dac cursul executiei acestea trebuie executate de mai multe ori. Procedurile a n pot generale , dac ele comunic aplicatiei modul cum urmeaz s e efectuate anumite a a a a actiuni, dar exist i proceduri-eveniment care sunt apelate pentru a rsupunde unor evenimente as a recunoscute de un anumit obiect. De obicei procedurile generale sunt grupate modulele de cod, n pentru a recunoscute din mai multe puncte ale programului. Ele pot subprograme distincte de tip subrutin sau de tip functie, care se pot apela a ntre ele, pe ele nsele (proprietatea de recursivitate), sau dintr-o alt unitate de program, dup nite reguli care vor precizate ulterior, a a s dar sistemul este compatibil i cu instructiunile GoSub ... Return preluate din versiunile mai s vechi, care sunt continute n ntregime ntr-o unitate de program i care pot apelate doar s n cadrul unitii de program care le contin. at Problema comunicrii a ntre programul apelant i subprogram implic existenta unui mecanism s a de transmitere a valorilor, care are loc dup nite reguli foarte stricte, care trebuie cunoscute i a s s respectate de utilizator. Fcnd abstractie de cazurile cnd sunt denite i utilizate variabile i a a a s s constante globale (publice), transmisia valorilor are loc prin intermediul unor argumente, numite actuale dac gureaz programul apelant, respectiv formale dac gureaz subprogramul a a n a a n apelat. Transmiterea se poate realiza att prin adres , caz care subprogram pot modicate a a n n valorile argumentelor actuale corespunztoare din programul apelant, ct i prin valoare , caz a a s care valorile argumentelor actuale nu se modic programul apelant, chiar dac valorile n a n a plus, un subprogram de tip functie va argumentelor formale sunt modicate subprogram. In n returna ntotdeauna programul apelant o valoare, prin specicarea explicit a numelui functiei n a respective, valoare care poate folosit fr restrictii diverse expresii. a aa n

3.1

Subprograme de tip subrutin i functie as

Subprogramele de tip subrutin i cele de tip functie au o form general asemntoare, a s a a a a anume : [{ Public | Private }] [Static] Sub numesub (listarg) [blocinstr ] [Exit Sub] [blocinstr ] End Sub respectiv : [{ Public | Private }] [Static] Function numefunc (listarg) [As tip ] [blocinstr ] [numefunc = expresie ] [Exit Function] [blocinstr ] [numefunc = expresie ] End Function Aici Public sau Private indic faptul c subprogramul poate accesat din orice procedur a a a 13

a proiectului, respectiv din orice procedur apartinnd modulului care este denit functia. a a n a Cuvntul cheie Static specic faptul c variabilele locale si pstraz valorile a a a a a ntre apelurile succesive ale procedurii, neind a afectate variabilele declarate afara procedurii. ns n Dac ceea ce privete alegerea numelui subrutinei numesub nu exist restrictii, deoarece a n s a subprogramul de tip functie returneaz a ntotdeauna o valoare prin numefunc, tipul functiei va trebui declarat explicit prin specicarea tip care poate Byte , Boolean , Integer , Long , Currency , Single , Double , Date , String (numai de lungime variabil), Object , Variant , a sau poate precizat implicit atand numelui unul din suxele % , & , ! , # , @ , sau folosind o sa instructiune DefTip. Lista de argumente formale listarg const din entiti avnd forma general : a at a a [Optional] [{ ByVal | ByRef }] [ParamArray] numevar[( )] [As tip] separate prin virgule. Cuvntul cheie Optional este folosit pentru a indica c argumentul nu a a este obligator, a aceast situatie toate argumentele care urmeaz list trebuie s e de ns n a a n a a plus, argumentele optionale nu pot dect de asemenea optionale i s e declarate ca atare. In s a a tipul variant. Parametrii ByVal i ByRef indic faptul c argumentul este transmis prin valoare s a a sau prin referint. Numai ultimul argument din listarg poate precedat de ParamArray , ceea a ce indic faptul c argumentul respectiv este un tablou optional avnd elemente de tip variant. a a a Cuvntul cheie ParamArray nu poate folosit a mpreun cu Optional , ByVal , sau ByRef . a numevar i tip au semnicatiile cunoscute. Dac argumentul formal numevar este un tablou, s a numelui ales i se poate ataa optional o pereche de paranteze rotunde ( ) . s Un subprogram de tip subrutin poate apelat cu instructiunea : a [Call] numesub [[(]listarg [)]] Utilizarea cuvntului cheie Call este optional, dar dac el este folosit, atunci obligator lista a a a de argumente actuale listarg , ale crei elemente sunt separate cu virgule, va trebui inclus a a ntre paranteze rotunde, chiar dac lista este vid. (Atentie : folosirea acestor paranteze absenta lui a a n Call este semnalat ca o eroare!) Elementele din listarg pot precedate de ByVal sau ByRef a pentru a preciza modul de transmitere pentru valorile argumentelor, dar se prefer utilizarea a acestor cuvinte cheie lista argumentelor formale din instructiunile de denitie ale subprogran melor. Dac argumentul este un nume de tablou declarat ca atare programul apelant, atunci a n identicatorul corespunztor trebuie urmat de o pereche de paranteze ( ). a Apelul unui subprogram de tip functie se face prin specicarea ntr-o expresie a identicatorului functiei numefunc urmat, dac este cazul, de lista de argumente actuale listarg inclus a a ntre paranteze rotunde ( ), valoarea returnat ind utilizat pentru evaluarea expresiei respective. a a Din acest motiv, corpul functiei trebuie s existe cel putin o instructiune prin care i se atribuie n a variabilei nume o anumit valoare. Dac o astfel de instructiune lipsete, valoarea returnat este a a s a zero dac functia este de tip numeric, irul nul dac functia este de tip ir de caractere, sau Empty a s a s dac este de tipul variant. Apelul functiei se poate realiza i cu o instructiune Call , a acest a s ns n caz nu exist nici o valoare returnat. a a urma apelului unei proceduri, elementele listei cu argumente actuale sunt puse In n corespondent cu elementele listei cu argumente formale, orice neconcordant de ordine i tip a a s ind semnalat ca o eroare. Transmiterea valorilor se face implicit prin adres, ceea ce este ecia a ent din punctul de vedere al utilizrii memoriei, a dac un argument actual este o constant, a ns a a o expresie, sau este scris ntre paranteze, atunci transmiterea sa se realizeaz prin valoare, chiar a dac nu este fcut nici o specicare explicit. cazul transmiterii prin adres, este important a a a a In a i efectul colateral al executiei subprogramului, sensul c eventuala modicare a valorilor unor s n a 14

argumente subprogram se manifest i programul apelant, locatiile de memorie folosite de n a s n argumentele formale i cele actuale ind comune. s Implicit orice procedur are caracter public, iar valorile variabilelor locale nu sunt memorate a ntre dou apeluri succesive. Deoarece Visual Basic sunt permise i proceduri avnd caracter a n s a de recursivitate, se recomand folosirea cu mare atentie a declaratiei Static . Instructiunile a executabile trebuie s e continute totalitate corpul precedurii, care nu poate contine alte a n n denitii de proceduri. Instructiuni Exit { Sub | Function } pot plasate oriunde corpul n procedurii i au ca efect imediat prasirea acesteia, executia ind preluat de instructiunea care s a a succede instructiunii apelante. Variabilele folosite subprograme sunt locale dac ele sunt declarate explicit corpul procen a n durii. Restul variabilelor utilizate ntr-o procedur sunt locale doar dac nu gureaz declaratii a a a n explicite la un nivel superior, aceast ultim situatie ind a posibile conicte de tip dac n a a ns a exist similariti de nume. Pentru a evita ambiguitile, este recomandabil utilizarea instructiunii a at at a Option Explicit care oblig declararea explicit a tuturor variabilelor a a

3.2

Subprograme de tip GoSub ... Return

Dei avnd sintaxa cea mai simpl, acest tip de subprogram prezint dezavantajul c varias a a a a bilele ind comune att programului apelant, ct i subprogramului care este continut obligator a a s aceeai unitate de program, este necesar o atentie deosebit pentru a nu modicate unele n s a a valori utilizate i alte secvente de cod. Forma sa general este : s n a ... GoSub etic-1 ... ... etic-1: [blocinstr ] Return [etic-2 ] ... [etic-2:] ... unde etic-1 este eticheta sau numrul liniei de a nceput a subprogramului, iar etic-2 este eticheta sau numrul liniei a ncepnd de la care continu executia programului, dup revenirea din suba a a program ca urmare a executiei instructiunii Return . Dac etic-2 lipsete, executia continu cu a s a instructiunea imediat urmtoare instructiunii GoSub . a Un subprogram de tip subrutin Sub nu poate apelat cu o instructiune GoSub i nici nu a s poate prsit cu o instructiune Return . aa O versiune ceva mai general a instructiunii GoSub este : a On expr GoSub list a unde expr este o expresie ntreag cu valori cuprinse a ntre 0 i 255. functie de valoarea numeric s In a a expresiei respective, controlul este transferat blocului de instructiuni asociat unei etichete sau unui numr de linie din list, functie de pozitia sa list. Dac expr are valoarea 0 sau a a n n a a o valoare mai mare dect numrul de etichete din list, executia se continu cu instructiunea a a a a imediat urmtoare, iar dac este negativ sau mai mare dect 255, va generat un mesaj de a a a a eroare. 15

3.3

Rutine de tratare a erorilor

Chiar dac instructiunile unui program sunt corecte din punct de vedere sintactic i semantic, a s este posibil ca cursul exploatrii programului s apar erori care pot n a a a ntrerupe executia normal a i uneori pot bloca chiar sistemul de operare. Pentru a evita astfel de situatii, utilizatorul are la s dispozitie instructiunea : On Error { GoTo etic | Resume Next } plasat a naintea unei secvente de program care poate genera una sau mai multe erori fatale. Este indicat ca o astfel de instructiune s e plasat chiar la a a nceputul procedurii. Efectul instructiunii este determinat de una din cele dou optiuni admise. Dac optiunea este Resume Next, cazul a a n aparitiei unei erori executie, programul se reia de la instructiunea imediat urmtoare aceleia n a care a generat eroarea. Optiunea GoTo etic transfer executia la o rutin scris de utilizator, a a a etic reprezentnd eticheta sau numrul primei linii a subprogramului de tratare a erorilor. a a cadrul rutinei de tratare a erorilor, care trebuie s se ae aceeai unitate de program cu In a n s instructiunea On Error , utilizatorul are posibilitatea de a identica i aa codul erorii (continut s s proprietatea Number a obiectului Err din sistemul Visual Basic), de a aa mesajul de eroare n ataat codului (valoarea returnat de functia Error(Err[.Number]) , care coincide cu propries a tatea Description a obiectului Err) i de a indica ce actiuni vor s ntreprinse dup identicarea a erorii pentru a evita efectele acesteia. Pentru a reveni program dup parcurgerea instructiunilor n a continute rutina de tratare a erorilor, se poate utiliza instructiunea : n Resume [{ etic | Next }] unde etic reprezint eticheta sau numrul de linie al instructiunii din program a a ncepnd de la care a cazul optiunii Next, executia se reia de la instructiunea imediat urmtoare se va relua executia. In a aceleia care a provocat eroarea. lipsa oricrei optiuni instructiunea Resume, executia se reia In a n chiar cu instructiunea care a provocat eroarea, deoarece se presupune c cadrul subrutinei de a n tratare a erorilor utilizatorul a fcut corecturile necesare pentru ca eroarea s nu se mai repete a a ( lipsa unor astfel de corecturi, programul intr n a ntr-un ciclu innit!). Dezactivarea rutinei de tratare a erorilor se face cu instructiunea On Error GoTo 0 , ceea ce nu nseamn c dac intervine o eroare, executia este transferat rutinei de tratare a erorilor care a a a a ncepe cu linia numerotat cu 0 , chiar dac aceasta exist. a a a Dei activarea rutinei de tratare a erorilor se face s ntr-o secvent de cod plasat la a a nceputul unei proceduri, codul asociat rutinei este situat de obicei la sfritul procedurii, iar pentru a evita as parcurgerea acestuia absenta interventiei unei erori, se recomand introducerea unei instructiuni n a Exit { Sub | Function } naintea etichetei care marcheaz a nceputul rutinei.

Sistemul de I/O. Fiiere s

Exist o gam sucient de larg de posibiliti pentru a realiza schimbul de informatii a a a at ntre utilizator i un program Visual Basic. Calea cea mai simpl i mai sigur, dar i cea mai putin s as a s exibil, const utilizatea unor casete de dialog predenite modale, care permit continuarea a a n executiei numai dup efectuarea unor actiuni specice. Ideea poate dezvoltat, ind posibil a a a proiectarea unor casete de dialog personalizate, care afara unor casete cu text, pot contine i n s alte controale care pot comunica date, cum ar bare de derulare orizontale i verticale, casete s cu list i combinate, butoane de optiune, spinnere, etc. Rezultatele intermediare i nale pot as s 16

aate formatul dorit cu metoda Print pe forme, casete cu imagine, fereastra Debug, s n n n ne, pentru a putea folosite ori pot tiprite la imprimant, sau pot reprezentate grac. In a a de cte ori este nevoie, datele i rezultatele pot stocate iere pe suport magnetic. a s n s

4.1

Casete de dialog predenite

Cea mai simpl metod de a furniza date unui program Visual Basic i de a aa unele a a s s informatii asupra executiei const utilizarea casetelor de dialog predenite cu ajutorul proce a n durilor InputBox i MsgBox . Aceste casete de dialog sunt s ntotdeauna modale , sensul c n a ele nu pot prsite i programul nu poate continuat fr aa s a a ncuviintarea utilizatorului, care n plus are posibiliti destul de reduse de inuentare asupra dimensiunilor, aspectului i pozitionrii at s a acestora. Aarea unei casete de dialog care contine un mesaj, un titlu, butoane de comand i o caset s as a de text care pot introduse informatii, cum ar un nume sau un numr i care sunt apoi n a s returnate procedurii apelante vederea prelucrrii, este realizat cu functia : n a a InputBox(mesaj [, [titlu ][, [implicit ][, [xpos ][, [ypos ][, help, nrcontxt ]]]]]) s Singurul argument obligatoriu este irul de caractere mesaj avnd maximum 1024 caractere, s a care pot scrise pe linii concatenate cu constanta predenit vbCrLf (Chr(13)+Chr(10)). a Celelalte argumente ind optionale, dac unele dintre ele sunt omise, ele trebuie a nlocuite cu virgule. Argumentul titlu reprezint irul ce urmeaz a aat bara de titlu a casetei de a s a s n dialog, lips ind aat numele aplicatiei. Valoarea prestabilit returnat de functie dac nu se n a s a a a introduce nimic de la tastatur i care este aat caseta de text este continut irul implicit . as s a n a n s Dac se omite acest argument, caseta de text este aat goal i valoarea implicit returnat a s a as a a de functie este irul vid (""). Argumentele numerice xpos i ypos precizeaz coordonatele s s a n twips ale coltului din stnga sus raport cu ecranul. Dac aceste coordonate lipsesc, caseta de a n a dialog va centrat pe orizontal la aproximativ o treime din altimea ecranului. Ultimele dou a a n a argumente sunt folosite pentru a pune le dispozitie asistent soft dependent de context, help a a s ind numele ierului, iar nrcontxt reprezint valoarea numeric a referintei de context din ier s a a s asociat cu caseta de dialog. Aceste dou argumente trebuie s gureze simultan instructiune, a a a n caz care va aat i butonul de comand Help, ind totodat activ i tasta F1. n s s a a as Functia returneaz continutul casetei de text prin selectarea butonului OK sau prin apsarea a a tastei Enter. Dac irul reprezint un numr, pentru conversie poate folosit functia Val , avnd as a a a a ca argument functia InputBox . Selectarea butonului Cancel are ca efect anularea mesajului introdus, ind returnat irul vid. s Att functia, ct i subrutina MsgBox aeaz un mesaj a a s s a ntr-o caset de dialog i ateapt ca a s s a utilizatorul s selecteze un buton de comand, cazul functiei ind returnat valoarea asociat a a n a a implicit butonului respectiv. Sintaxa general este similar ambele cazuri : a a n MsgBox[(] mesaj [, [butoane ][, [titlu ][, help, nrcontxt ]]][)] s diferenta constnd modul de apelare. Folosit ca subrutin, apelul poate fcut specicnd a n a a a a direct numele MsgBox urmat de lista de argumente, fr a scrise i parantezele rotunde, iar aa s dac este folosit ca functie, ea trebuie utilizat a a a ntr-o expresie care se evalueaz la o valoare a ntreag, ind obligatorie i includerea argumentelor a s ntre paranteze rotunde. Semnicatiile argumentelor mesaj, titlu, help, nrcontxt, sunt cele prezentate la functia s InputBox , doar argumentul butoane necesitnd explicatii. Acesta contine o expresie numeric a a reprezentnd suma valorilor care specic numrul i tipul butoanelor de comand care urmeaz a a a s a a 17

Constant simbolic a a vbOKOnly vbOKCancel vbAbortRetryIgnore vbYesNoCancel vbYesNo vbRetryCancel vbCritical vbQuestion vbExclamation vbInformation vbDefaultButton1 vbDefaultButton2 vbDefaultButton3 vbApplicationModal vbSystemModal

Valoare 0 1 2 3 4 5 16 32 48 64 0 256 512 0 4096

Semnicatie Aeaz numai butonul OK s a Aeaz butoanele OK i Cancel s a s Aeaz butoanele Abort, Retry i Ignore s a s Aeaz butoanele Yes, No i Cancel s a s Aeaz butoanele Yes i No s a s Aeaz butoanele Retry i Cancel s a s Aeaz icoana Critical s a Aeaz icoana semn de s a ntrebare Aeaz icoana semn de exclamare s a Aeaz icoana Information s a Este focalizat primul buton Este focalizat al doilea buton Este focalizat al treilea buton Caseta este modal pentru aplicatie a Caseta este modal pentru sistem a

Tabelul 5: Valorile numerice ale butoanelor, icoanelor, focalizrii i modalitii a s at a aate, stilul icoanei folosite, identitatea butonului focalizat i caracterul de modalitate al s s casetei de dialog (v. Tab. 5). Atunci cnd sunt a nsumate valorile numerice pentru a obtine lips, valoarea cifra nal, poate utilizat doar un singur numr din ecare grup de optiuni. In a a a implicit a argumentului butoane este zero. a Folosit ca functie, MsgBox returneaz o valoare numeric asociat butonului care este sea a a a lectat. Dac caseta de dialog este aat i butonul Help, urma selectiei acestuia nu este a n s s n Valoare 1 2 3 4 5 6 7 Constant simbolic a a vbOK vbCancel vbAbort vbRetry vbIgnore vbYes vbNo Semnicatie Butonul OK Butonul Cancel Butonul Abort Butonul Retry Butonul Ignore Butonul Yes Butonul No

Tabelul 6: Valorile numerice asociate butoanelor de comand a returnat nici o valoare, pn cnd nu este selectat i unul din butoanele din Tab. 6. a a a a s Unicul argument obligatoriu, indiferent de versiunea folosit (subrutin sau functie) este irul a a s mesaj. Restul argumentelor este optional, cele lips trebuind s e a a nlocuite cu virgule. Utilizatorul nu poate inuenta pozitionarea pe ecran a casetei de dialog MsgBox .

18

4.2

Metoda Print i functia Format s

Aarea rezultatelor pe ecran, sau dup caz tiprirea acestora la imprimant, se realizeaz s a a a a folosind metoda : [obiect.]Print [listexpr ][{ ; | , }] unde obiect nu poate dect o form (Form), o caset cu imagine (PictureBox), imprimanta a a a (Printer), sau fereastra de depanare (Debug), lips obiectul implicit ind forma curent. Dac n a a a nu este utilizat nici un argument, va lsat un rnd liber. Argumentul listexpr reprezint o lista a a a de expresii aritmetice sau de tip ir de caractere, care urmeaz s e tiprit pe ecran sau la s a a a a imprimant. Un element al listei are forma general : a a [{ Tab[(col )] | Spc(num ) }]{ | ;} expresie [{ | ; | , }] Functia Tab[(col )] indic faptul c cursorul sau capul de imprimare se va pozitiona pe a a coloana col , sau dac acest argument lipsete, se trece la zona de tabulare urmtoare. Un a s a rol asemntor are functia Spc(num ) care realizeaz un salt de num spatii pe aceeai linie. a a l a s Deoarece de obicei sunt folosite la scriere fonturi proportionale, indicatiile col i num au doar un s caracter orientativ, unitatea de msur a acestora ind lrgimea medie a unui caracter specic a a a tipului de font folosit. Dac expresie este urmat de (;) sau ( ), elementul ce urmeaz list va tiprit a a a n a a n continuare, iar dac este utilizat caracterul (,) se sare la urmtoarea zon de tabulare (functia a a a Tab fr argument). O zon de tabulare are o lime egal cu de 14 ori lrgimea medie a unui aa a at a a caracter. cazul care instructiunea Print are pe ultima pozitie (;), (,), Tab[(col )], sau In n Spc(num ), nu se trece la linia urmtoare, cursorul sau capul de imprimare rmnnd pe acelai a a a a s rnd vederea executrii unei eventuale instructiuni de tiprire ulterioare. a n a a Dac obiectul este Printer, imprimanta trebuie s e conectat la calculator, caz contrar a a a n semnalndu-se un mesaj de eroare. a Pozitionarea cursorului text pentru scriere poate realizat cu instructiunile : a [obiect.]CurrentX = x [obiect.]CurrentY = y unde x i y sunt valori numerice care specic coordonatele punctului de inserare pe orizontal s a a altimea unui ir de caractere i limea acestuia pot determinate folosind i pe vertical. In s a s s at metodele : [obiect.]TextHeight(ir ) s [obiect.]TextWidth(ir) s valorile returnate ind exprimate unitile de msur stabilite cu proprietatea ScaleMode . n at a a Pentru a aa rezultatele s ntr-o form precizat de utilizator poate folosit functia : a a a Format(expresie [, format ]) unde expresie reprezint o expresie valid a crei valoare va convertit la un ir de caractere a a a a s avnd format-ul dorit. Argumentul optional format este e o specicare predenit standard, e a a o expresie ir de caractere denit de utilizator care contine caractere speciale de formatare. s a In cazul arii unei expresii de tip numeric, functia Format fr specicarea de format are un efect sa aa asemntor cu cel al functiei Str(exprnum ) , deosebirea ind c la aarea valorilor pozitive, a a a s lipsete spatiul rezervat pentru semn. s Formatele predenite standard sunt prezentate Tab. 7. Simbolurile separatorilor pentru n mii i pentru zecimale sunt conformitate cu specicrile din Regional Settings Properties din s n a 19

Format standard "General Number" "Fixed" "Standard" "Currency" "Percent" "Scientific" "Yes/No" "True/False" "On/Off"

Semnicatie Numrul este aat forma care se a, fr separatori. a s n n a aa Cel putin o cifr stnga semnului zecimal, dou zecimale. a n a a Separatori pentru mii, dou cifre zecimale. a Separatori pentru mii, dou cifre zecimale, val. negative paranteze. a n Valoarea nmultit cu 100 , dou cifre zecimale, simbolul % la sfrit. a a as Este folosit notatia tiintic standard, dou cifre zecimale. a s a a O valoare diferit de zero este Yes. Zero este No. a O valoare diferit de zero este True. Zero este False. a O valoare diferit de zero este On. Zero este Of. a

Tabelul 7: Formatele predenite standard pentru valorile numerice Windows Control Panel. Pentru English (United States) separatorii pentru mii sunt virgulele (,) , iar separatorul zecimal este punctul (.) . Formatele denite de utilizator folosesc caractere speciale de formatare care sunt scrise ntre ghilimele (") . Ele determin cmpul i forma de aare pentru numere i iruri de caractere. a a s s s s Un format numeric poate avea pn la patru sectiuni separate cu simbolul (;) , din care prima a a este obligatorie i dac este unica specicatie, ea este folosit pentru formatarea tuturor valorilor. s a a Dac formatul are dou sectiuni, prima este folosit pentru valori pozitive i zero, iar cea de a a a a s cazul a trei sectiuni, prima este folosit pentru valori pozitive, a doua pentur valori negative. In a doua pentru valori negative, iar a treia pentru zero. Dac se adaug i a patra sectiune, ea este a as folosit pentru aarea valorii Null . Dac o specicatie de sectiune lipsete, fapt marcat prin a s a s doua caractere (;) succesive, sectiunea respectiv folosete pentru aare formatul pentru valori a s s pozitive. Formatul utilizator pentru iruri de caractere poate avea doar dou sectiuni separate s a cu (;) , prima folosit pentru orice date de tip ir, iar cea de a doua, dac exist, este folosit a s a a a doar pentru aarea valorii Null i a irului vid ("") . s s s Caracterele speciale de formatare care pot servi la alctuirea descriptorilor de format nua merici sunt urmtoarele : a 0 : se aeaz o cifr sau un zero. Dac expresia contine o cifr pozitia care gureaz un 0 s a a a a n n a irul descriptor de format, ea va aat ca atare, caz contrar pozitia respectiv va n s s a n n a nscris un zero. Dac expresia are mai putine cifre dect numrul caracterelor din descriptor, pozitiile a a a libere vor completate cu zerouri. Dac numrul de zecimale este mai mare dect numrul de a a a a zerouri care urmeaz separatorului punct din descriptor, numrul va rotunjit corespunztor, iar a a a dac partea a ntreag are mai multe cifre dect cele prevzute, ea reprezentat fr modicri. a a a a aa a # : se aeaz o cifr sau nimic. Dac expresia contine o cifr pozitia care gureaz s a a a a n n a un # irul descriptor de format, ea va aat ca atare, caz contrar pozitia respectiv n s s a n n a nu va aat nimic. Pentru un numr compus din mai multe cifre, efectul este asemntor cu s a a a cel descris mai sus, unica diferent ind aceea c nu vor mai scrise zerourile de la capete dac a a a numrul de cifre este mai mic dect numrul caracterlor din descriptor. a a a . : indic pozitia punctului zecimal. Acesta poate plasat orice pozitie a cmpului i poate a n a s forta tiprirea semnului minus fata numrului, dac acesta este negativ. Dac este necesar, a n a a a numerele sunt rotunjite, pentru a reprezentate conformitate cu formatul specicat. n 20

, : virgulele plasate la stnga punctului zecimal permit separarea grupurilor de cte trei cifre a a semnicative care alctuiesc partea a ntreag. Scalarea numrului prin artirea lui cu 1000 i a a mp s rotunjirea acestuia dac este cazul poate realizat prin plasarea virgulei la extremitatea dreapt a a a a prtii a ntregi ( naintea punctului zecimal dac acesta exist). Dou virgule succesive locul a a a n mentionat nseamn scalarea cu 1000000 , etc. a % : valoarea numeric este a nmultit cu 100 i apoi reprezentat conformitate cu descriptorul a s a n specicat. Simbolul % poate plasat oriunde, dar de obicei el gureaz la a nceputul sau la sfritul as descriptorului. E- E+ e- e+ : indic scrierea sub form exponential, tiintic, a numrului care urmeaz a a a s a a a a aat. Simbolul + sau - trebuie s e urmat cel putin de un caracter 0 sau # , numrul s a a acestor caractere determinnd numrul cifrelor de la exponent. Pentru a aa semnul minus a a s n fata exponentilor negativi se recomand una din formele E- sau e- , iar pentru a aa + sau a s functie de semnul exponentului, trebuie folosit forma E+ sau e+ . functie de numrul de n a In a caractere # sau 0 din fata simbolului pentru exponent, se face i rotunjirea expresiilor numerice s reprezentate. - + $ ( ) : caractere literale care sunt aate i plasate identic ca specicatorul de s s n format. \ : deoarece o serie de caractere au o anumit semnicatie i nu pot aate forma lor a s s n literal, se recomand ca orice alt caracter, afara celor ase amintite mai sus, s e precedat a a n s a (protejat) descriptorul de format de un caracter backslash (\), dac se dorete aarea sa n a s s explicit. si caracterul (\) poate aat scriind (\\). a Insu s ceea ce privete aarea expresiilor de tip ir de caractere , pot utilizate urmtoarele In s s s a caractere speciale de formatare : @ : se aeaz un caracter sau un spatiu. Dac expresia ir contine un caracter pozitia s a a s n care gureaz un @ irul descriptor de format, el va aat ca atare, caz contrar n a n s s n n pozitia respectiv va aat un spatiu. Dac expresia are mai putine caractere dect numrul a s a a a caracterelor din descriptor, pozitiile libere vor completate cu spatii, irul ind aliniat la dreapta. s & : se aeaz un caracter sau un nimic. Dac expresia ir contine un caracter pozitia s a a s n care gureaz un & irul descriptor de format, el va aat ca atare, caz contrar n a n s s n n pozitia respectiv nu va aat nimic. Dac expresia are mai putine caractere dect numrul a s a a a caracterelor din descriptor, pozitiile libere vor ignorate, irul ind aliniat la dreapta. s < : caracterele majuscule sunt aate minuscule. s > : caracterele minuscule sunt aate majuscule. s ! : alinierea se face la stnga . a Ultimele trei caractere de formatare pot plasate oriunde descriptorul de format. Dac expresia n a ir contine mai multe caractere dect descriptorul, ea va aat fr a trunchiat. s a s a aa a

4.3

Fiiere Visual Basic s n

Metodele i instructiunile prezentate paragrafele anterioare permit o activitate interactiv s n a cu calculatorul, datele ind citite de la tastatur atunci cnd programul o cere, iar rezultatele sunt a a ate pe ecran, sau tiprite la imprimant pe msur ce acestea sunt obtinute. Avantajele acestui s a a a a sistem sunt evidente, utilizatorul avnd tot timpul controlul asupra executiei programului. Pe de a alt parte, exist i o serie de dezavantaje, care apar special cnd este manipulat un volum a as n a mare de date, iar rezultatele obtinute trebuie pstrate e pentru a putea utilizate ca atare, e a 21

vederea unei prelucrri ulterioare. Aceste dezavantaje pot eliminate prin utilizarea ierelor, n a s care reprezint general colectii de date omogene sub aspectul semnicatiei i necesitilor de a n s at prelucrare, depuse de obicei pe un suport extern de memorare, cum ar discurile magnetice. Elementele din care este constituit un ier se numesc articole, care la rndul lor pot alctuite s a a din mai multe componente, numite cmpuri. a Avnd vedere modul de stocare al informatiilor, precum i modul ulterior de acces la acestea, a n s Visual basic exist trei tipuri de iere : iere secventiale, iere acces direct (aleator) i n a s s s n s iere binare. s Fiierele acces secvential sunt mai uor de creat dect cele acces direct, a prezint s n s a n ns a o exibilitate destul de redus din punctul de vedere al manipulrii datelor continute. Articolele a a ierului, reprezentnd succesiuni de caractere ANSI de diferite lungimi, sunt s a nregistrate unul dup cellalt, accesul la unul din articole ind posibil doar dup ce sunt parcurse toate articolele a a a precedente, ncepnd cu primul articol din ier. a s Fiierele acces direct, dei implic pentru construirea lor mai multe etape de program s n s a dect ierele secventiale, sunt mult mai exibile, deoarece ecare articol, de aceast dat de a s a a lungime x, are asociat un numr de ordine cadrul ierului. Prin specicarea acestui numr, a a n s a plus, aceste iere orice articol continut ier poate accesat direct vederea prelucrrii. In n s n a s ocup mult mai putin spatiu pe disc, datele ind memorate a ntr-o form compresat binar. a a a Fiierele acces binar sunt oarecum asemntoare cu cele acces direct din punctul de s n a a n vedere al memorrii datelor, a a ns nregistrrile nu mai au o lungime x, iar cmpurile nu mai sunt a a a de un anumit tip. Este obligatia utilizatorului s cunoasc succesiunea i lungimea a a s nregistrrilor, a pentru a regsi corect datele stocate. a Un ier poate creat, consultat, sau actualizat, ultimul caz existnd posibilitatea de a se s n a aduga sau terge unele articole, sau de a se modica cmpurile unor articole. Pentru a putea a s a realizat oricare din actiunile enumerate, ierul va trebui deschis cu instructiunea : a s Open nume [For mod ] [ACCESS acces ] [lock ] As [#]nr [Len = recl ] s s urma executiei instructiunii se aloc un buer (o zon tampon) prin intermediul cruia se In a a a realizeaz operatiile de I/O i se stabilete modul de acces la articolele ierului. a s s s Argumentul nume reprezint o constant sau o variabil de tip ir de caractere care contine s a a a s numele ierului care urmeaz a deschis. Dac acesta nu se gsete directorul curent, irul s a a a s n s respectiv va contine obligatoriu i calea de accesare a ierului, conformitate cu regulile stabilite s s n de sistemul de operare. Prin intermediul argumentului mod este specicat tipul ierului, precum i operatia pentru s s care acesta este deschis. cazul ierelor secventiale, mod poate una din clauzele Input , In s Output , sau Append , primele dou cazuri ierul ind deschis pe primul articol pentru citire n a s sau scriere, iar cel de al treilea caz acesta este deschis i pozitionat dup ultimul articol existent, n s a vederea extinderii ierului cu noi articole. Fiierele acces direct sunt specicate cu clauza n s s n Random care, absenta lui mod, reprezint optiunea implicit i care lipsa argumentului acces n a as n permite deschiderea i consultarea ierului ordinea : Read/Write ; Write-only ; Read-only. s s n Dac mod este specicat prin clauza Binary , este deschis un ier binar, care este de fapt un a s ier acces direct care toate articolele au lungimea de un octet. s n n Argumentul nr este o constant sau expresie s a ntreag cu valori cuprinse a ntre 1 i 511, s numrul respectiv ind asociat ierului deschis cu instructiunea Open i care este utilizat de a s s toate celelalte instructiuni de I/O care pe parcursul executiei programului fac referire la ierul s nume . s 22

Argumentul optional recl reprezint lungimea a nregistrrii i poate un a s ntreg cuprins ntre 1 cazul ierelor acces direct recl specic lungimea unui articol (pentru ierele desi 32767. In s s n a s chise cu clauza Binary acest argument, dac exist, este ignorat), iar pentru ierele secventiale a a s recl specic mrimea zonei tampon, mrime care determin viteza de transfer a datelor. Valorile a a a a implicite pentru recl sunt 128 pentru ierele acces direct i 512 pentru ierele secventiale. s n s s Argumentele acces i lock sunt specice lucrului retea sau medii multitasking, dac s n n a sistemul de operare permite acest lucru i dac ierele respective sunt accesate simultan de mai s a s multi ultilizatori, sau de alte programe. Pentru argumentul acces sunt permise clauzele Read , Write i Read Write , iar pentru argumentul lock clauzele admise sunt Shared , Lock Read , s Lock Write i Lock Read Write . s majoritatea cazurilor, instructiunea Open este utilizat pentru deschiderea unor iere exisIn a s tente, a dac nume nu exist, acesta va creat, exceptie fcnd tentativa de deschidere a ns a s a a a unui ier inexistent cu clauza Input , care este semnalat ca o eroare. O situatie deosebit apare s a a cazul utilizrii clauzei Output, cnd dac nume exist, acesta este distrus i apoi recreat n a a a s a s sub acelai nume i pozitionat pentru scriere pe primul articol. Dac nume exist i este deja s s a s as deschis de un alt proces i modul de acces specicat instructiune nu este permis, va generat s n un mesaj de eroare. Un ier deschis cu una din clauzele Input , Random , sau Binary , poate exploatat pe s parcursul executiei programului folosind i alte valori pentru nr, denite tot cu ajutorul unor s s instructiuni de tip Open , fr ca prealabil ierul s e aa n s a nchis. Dac a ierul este deschis a ns s cu clauzele Output sau Append , el va trebui mai ai s e nt a nchis i abia ulterior, printr-o nou s a instructiune Open, s i se asocieze un alt numr, dac este necesar. a a a Operatia de nchidere a ierelor se face cu instructiunea : s Close [[#]nr1 [, [#]nr2 ] ... ] s s urma utilizrii acestor instructiuni In a nceteaz orice asociere a ntre nr i nume, plasndu-se ss s a totodat o marc de sfrit de ier (end-of-le) dup ultimul articol. Utilizarea instructiunii a a as s a Close fr argumente are ca efect aa nchiderea tuturor ierelor deschise. Acelai rezultat este s s obtinut i cu ajutorul instructiunii Stop care termin executia programului i instructiunii End s a s care termin executia programului i transfer totodat controlul interpretorului de comenzi. a s a a Inchiderea tuturor ierelor poate realizat i cu comenda Reset , care golete totodat i s as s as zona tampon a sistemului. Efectul este identic cu cel al instructiunii Close , dac ierele se a a s a pe disc. Unui ier i se poate schimba numele cu ajutorul instructiunii : s Name nume1 AS nume2 s s unde nume1 este numele vechi, iar nume2 este noul nume de ier. Un ier poate ters s s s s s de pe disc cu comanda : Kill nume s ambele comenzi mentionate nume trebuie s e de tip ir de caractere i poate contine calea In s a s s de accesare a ierului. s Dac utilizatorul dorete s ae urmtorul numr de ier care poate utilizat de o instructiune a s a a a s Open , poate folosi functia : FreeFile[({ 0 | 1 })] Dac este folosit argumentul 0 functia returneaz un numr a a a ntre 1 i 255, iar dac este folosit s a argumentul 1 ea returneaz un numr a a ntre 256 i 511. s Pentru a asigura o prelucrare corect i complet a informatiilor continute a s a ntr-un ier, s 23

utilizatorul are la dispozitie o serie de functii care s-i furnizeze informatii privind lungimea ierului a s deschis, pozitia curent ier, sau pozitia mrcii de sfrit de ier. a n s a as s Lungimea octeti a unui ier deschis este dat de functia : n s a LOF(nr ) s unde nr este numrul asociat ierului prin instructiunea Open . s a s Pozitia curent a ntr-un ier deschis este returnat de functia : s a Loc(nr ) s cazul ierelor acces direct, functia evalueaz numrul ultimei In s n a a nregistrri scrise sau citite a din momentul deschiderii ierului, iar cazul ierelor secventiale ea returneaz pozitia curent s n s a a ier sub forma unui multiplu n s ntreg de 128 octeti. Pentru ierele binare functia furnizeaz s a pozitia ultimului octet scris sau citit. Pozitia care urmeaz a ntr-un ier este dat de functia : s a Seek(nr ) s cazul ierelor acces direct, functia returneaz numrul In s n a a nregistrrii care urmeaz ultimei a a operatii de scriere sau citire. Pentru celorlalte tipuri de iere este returnat pozitia octetului s a ncepnd cu care poate procesat o operatie de I/O. a a Deoarece orice tentativ de a citi dintr-un ier secvential dincolo de marca de sfrit de ier a s as s este semnalat ca eroare de sistem, cu consecinta imediat a a a ntreruperii programului, utilizatorul are nevoie de o functie care s-l informeze cnd este citit ultimul articol din ier. acest scop a a s In poate utilizat functia : a EOF(nr ) s care returneaz valoarea True , dac urmtorul articol ce urmeaz a citit din ier este marca a a a a s de sfrit de ier, sau valoarea False caz contrar. as s n toate cele patru functii amintite mai sus, nu este necesar ca argumentul nr s e precedat In s a de simbolul (#). Instructiunile de I/O prin intermediul crora sunt accesate ierele secventiale sunt cele a s cunoscute din versiunile mai vechi ale limbajului Basic, ierele ca atare ind de tip text i pot s s create ultim instant i cu un banal editor de texte. n a a s Pentru citirea datelor pot utilizate instructiunile : Input #nr, listvar s Line Input #nr, varir s s iar pentru citirea unui numr n de caractere dintr-un ier poate folosit functia : a s a Input(n, [#]nr ) s Cu instructiunea Input # sunt atribuite valori de tip numeric sau de tip ir de caractere vari s abilelor din varlist . La citire ghilimelele (") care delimiteaz irurile de caractere sunt ignorate. as Datele citite trebuie s respecte ordinea i tipul variabilelor din list. Dac o variabil este de tip a s a a a numeric, iar valoarea citit este de alt tip, variabilei i se atribuie valoarea zero. Citirea marcajului a de sfrit de ier produce o eroare. Instructiunea Line Input # citete succesiv caracterele de as s s pe o linie a ierului, pn cnd este alnit caracterul CR . Rezultatul citirii, mai putin secventa s a a a nt CR/LF , este atribuit variabilei de tip ir de caractere varir . Spre deosebire de instructiunea s s Line # , functia Input returneaz orice caracter citit, inclusiv virgule, ghilimele ("), spatiile ( ), a caracterele speciale LF i CR , etc. s Scrierea articolelor ntr-un ier secvential poate realizat utiliznd una din instructiunile : s a a Write #nr, [listexpr ] s 24

Print #nr, [listexpr ][{ ; | , }] s vederea unei exploatri ulterioare a ierului cu o instructiune de tip Input # , se recomand In a s a utilizarea formei Write # , deoarece acest caz valorile n nregistrate sunt separate cu delimitatori sub form de virgule, iar irurile de caractere sunt incluse a s ntre ghilimele ("), ultimele caractere inserate pe linie ind ntotdeauna secventa CR/LF . Argumentele instructiunii Print # coincid cu cele ale metodei Print , ele ind descrise la pag. 19. Dac listexpr lipsete, iar nr este a s s urmat de o virgul, ier este lsat o linie liber. a n s a a a Instructiunile de I/O pentru ierele acces aleator sunt esential diferite de cele s n mentionate mai sus, deoarece toate articolele continute trebuie s aib aceeai lungime. Fiecrui a a s a articol poate asociat astfel un numr de ordine , care permite identicarea pozitiei sale i a n cadrul ierului i prin intermediul cruia pot accesate direct informatiile continute cmpurile s s a n a articolului. Structura unui articol poate descris utiliznd date de tip utilizator , denite cu a a instructiunea Type ... End Type i declarate cu una din instructiunile Dim , Redim , Static , s Public , Private . Elementele (cmpurile) unei astfel de structuri pot de orice tip acceptat a de sistem (Integer , Long , Single , Double , String , etc.), unica restrictie ind aceea c ele a nu pot avea lungimi variabile. cazul irurilor de caractere, este necesar precizarea mod In s a n obligatoriu a lungimii acestora sub forma String*n . Lungimea total a articolului, furnizat de a a functia Len , va specicat argumentul recl din instructiunea Open (v. pag. 22). a n Instructiunile cu ajutorul crora sunt citite, respectiv scrise, articolele unui ier acces direct a s n au forma general : a GET [#]nr, [nrart ], numevar s PUT [#]nr, [nrart ], numevar s Aici nrart reprezint numrul articolului procesat din ier, absent ind luat considerare a a s n a n articolul imediat urmtor celui accesat a ntr-o operatie anterioar. Argumentul numevar este folosit a pentru a specica numele variabilei de tip utilizator care este memorat articolul. n Aceste dou instructiuni pot folosite i cazul ierelor acces binar , cu deosebirea a s n s n c nrart specic acum numrul octetului cu care a a a ncepe procesarea, iar restrictia cu privire la utilizarea irurilor de caractere avnd lungime x i pierde sensul, deoarece datele nu mai au o s a as structur anume. a

Metode i proprieti grace Visual Basic s at n

cele ce urmeaz, de ecare dat cnd se face referint la un obiect, dac nu se specic In a a a a a a altfel, se elege c este vorba de o form sau o caset cu imagine, lips considerndu-se c nt a a a n a a a este chiar forma curent. a

5.1

Metode grace

Pentru tergerea textului i a gracii cursul executiei poate utilizat metoda : s s n a [obiect.]Cls Controalele plasate pe form faza de proiectare nu sunt afectate. Ca urmare a apelului metodei a n Cls , cursorul grac este adus pozitia (0, 0) . n Desenarea sau tergerea unui punct pe un obiect se poate realiza cu instructiunea : s [obiect.]PSet [Step] (x, y ) [, culoare ] 25

unde (x, y ) reprezint coordonatele unde se va desena punctul, iar culoare este un a ntreg lung care reprezint culoarea RGB care va desenat punctul. Dac este omis ultimul argument, a n a PSet folosete valoarea curent a proprietii ForeColor. Pentru a terge un punct, valoarea s a at s argumentului culoare va cea a proprietii BackColor. Pentru specicarea culorii pot folosite at i functiile QBColor i RGB. Cuvntul cheie Step, dac gureaz instructiunea de mai sus, s s a a a n indic faptul c coordonatele (x, y ) sunt relative raport cu pozitia curent a cursorului grac. a a n a Dimensiunea punctului depinde de valoarea proprietii DrawWidth . Dac aceasta este 1 , va at a activat un singur pixel, iar dac ea este mai mare ca 1 va trasat un cerc centrat pe punctul a de coordonate (x, y ) avnd diametrul egal cu numrul de pixeli specicat. Modul care este a a n desenat punctul pe fundal depinde de setrile proprietilor DrawMode i DrawStyle . Ca urmare a at s a apelului metodei PSet , cursorul grac este deplasat pozitia (x, y ) . n O metod care permite trasarea de linii i dreptunghiuri este : a s [obiect.]Line [[Step] (x1, y1 )] - [Step] (x2, y2 ) [,[culoare ][,[B|BF]]] Perechea (x1, y1 ) desemneaz coordonatele punctului din care a ncepe trasarea liniei, sau ale coltului din stnga sus a dreptunghiului, iar (x2, y2 ) indic coodonatele punctului unde se termin a a a linia, sau ale coltului din dreapta jos ale dreptunghiului ; daca (x1, y1 ) lipsete, atunci sunt s luate considerare implicit coordonatele ultimului punct desenat. Argumentul optional B sau n BF indic faptul c se va desena un dreptunghi gol sau plin culoarea setat de argumentul a a n a culoare sau, dac acesta lipsete, culoarea setat anterior sau cea implicit a proprietii a s n a n a at ForeColor. Dac gureaz argumentul B, dreptunghiul va umplut cu modelul i coloarea a a s stabilite de proprietile FillStyle i FillColor, a indiferent de valoarea lui FillColor, at s ns dac FillStyle are valoarea implicit (adic 1), dreptunghiul trasat este gol. Cuvntul cheie a a a a Step, dac este utilizat, indic faptul c sunt specicate coordonate relative raport cu ultimul a a a n punct desenat. Ordinea ultimelor argumente instructiunea de mai sus trebuie pstrat, aa at dac unul n a a s nc a nu este necesar, el trebuie nlocuit cu o virgul. Limea pixeli a liniei depinde de valoarea a at n proprietii DrawWidth , iar modul care aceasta este desenat pe fundal depinde de setrile at n a a proprietilor DrawMode i DrawStyle . Ca urmare a apelului metodei Line , cursorul grac este at s deplasat pozitia (x2, y2 ) . n Instructiunea care permite trasarea unei curbe (cerc, elips, sau arc) este : a [obiect.]Circle [Step] (x, y ), raza [,[culoare ][,[start ][,[stop ][,aspect ]]]] Primele trei argumente au o semnicatie evident, care nu mai necesit explicatii. Argumentele a a start i stop reprezint valorile exprimate radiani ale unghiurilor de la care se s a n ncepe, respectiv la care se va opri trasarea arcului de curb, valorile implicite ale acestor argumente ind 0 i a s 2, ceea ce corespunde desenrii unei curbe a nchise. Dac aceste argumente au valori negative, a extremitile corespunztoare arcului de curb vor unite de centrul (x, y ) cu linii dreapte. at a a Argumentul optional aspect reprezint raportul dintre semiaxa mare i semiaxa mic, valoarea a s a implicit a acestuia ind unitatea, ceea ce corespunde trasrii unui cerc. a a Observatiile anterioare referitoare la ordinea argumentelor optionale, la modul de trasare al liniilor specicat cu proprietile DrawWidth, DrawMode i DrawStyle, precum i la caracteristicile at s s de umplere (doar pentru guri nchise!) date de proprietile FillColor i FillStyle, si psat s a treaz valabilitatea. Prin folosirea metodei Circle , cursorul grac este deplasat punctul de a n coordonate (x, y ) .

26

5.2

Specicarea culorilor

Proprietile at [obiect.]BackColor [= culoare ] [obiect.]ForeColor [= culoare ] returneaz sau seteaz culoarea fondului i prim planului obiect-ului sau, dac acesta nu gua a s a reaz explicit, a formei curente. Identicatorul culoare este un a ntreg lung care desemneaz a culoarea din schema RGB specic sistemului WINDOWS i are valori numerice cuprinse a s ntre 0 i 16777215 (&HFFFFFF). Specicarea culorii poate fcut folosind constante numerice (de s a a obicei exprimate sistemul hexazecimal), constante simbolice caracteristice sistemului, sau cu n ajutorul functiilor QBColor ori RGB. Ultimul octet precizeaz proportia de rou, penultimul preci a s zeaz proportia de verde, iar antepenultimul pe cea de albastru, valorile individuale ind cuprinse a ntre 0 i 255 (&HFF). Dac primul octet nu contine valoarea 0, sunt folosite culorile predenite s a ale sistemului Visual Basic. faza de proiectare BackColor este setat la valoarea implicit In a a vbWindowBackground, iar ForeColor la valoarea vbWindowText. Prin atribuirea unei valori proprietii BackColor, este ters att textul, ct i graca de pe o at s a a s form sau o caset cu imagine, schimb setarea proprietii ForeColor las nemodicate textul a a n at a i imaginea existente, aceasta avnd efect doar asupra operatiilor ulterioare. s a Pentru a aa valoarea RGB a culorii unui punct, poate apelat metoda : a [obiect.]Point (x, y ) care returneaz valoarea 1 dac punctul se gsete afara formei sau casetei cu imagine. a a a s n Functia care returneaz sub forma unui a ntreg lung codul RGB asociat unui index de culoare este : QBColor (index) unde argumentul index este un ntreg cuprins ntre 0 i 15 . Corespondenta dintre valorile numerice s i culorile aferente este prezentat Tab. 8 i coincide cu numerotarea folosit limbajele de s a n s a n Valoare 0 1 2 3 4 5 6 7 Culoare negru albastru verde cyan rou s magenta galben alb Valoare 8 9 10 11 12 13 14 15 Culoare gri albastru deschis verde deschis cyan deschis rou deschis s magenta deschis galben deschis alb intens

Tabelul 8: Culorile asociate valorilor numerice ale argumentului functiei QBColor programare care folosesc sistemul de operare DOS. O alt functie, avnd un efect similar, este : a a RGB (rou, verde, albastru) s unde rou, verde, albastru sunt numere s ntregi cu valori cuprinse ntre 0 i 255 care indic s a proportiile care culorile primare respective alctuiesc paleta ce urmeaz a aat pe ecran. n a a s a 27

Culoare negru albastru verde cyan rou s magenta galben alb

rou s 0 0 0 0 255 255 255 255

verde 0 0 255 255 0 0 255 255

albastru 0 255 0 255 0 255 0 255

Cod RGB &H000000 &H0000FF &H00FF00 &H00FFFF &HFF0000 &HFF00FF &HFFFF00 &HFFFFFF

Tabelul 9: Valorile numerice ale argumentelor functiei RGB pentru culorile standard Tab. 9 sunt indicate valorile numerice ale acestor argumente pentru culorile standard, precum In i codurile RGB corespunztoare. s a

5.3

Proprieti grace at

Setarea sau determinarea pozitiei cursorului grac la un moment dat poate realizat folosind a proprietile : at [obiect.]CurrentX [= x ] [obiect.]CurrentY [= y ] unde x i y sunt numere care specic valorile pentru coordonata orizontal i cea vertical. Cu s a as a exceptia coordonatelor denite de utilizator, originea axelor este plasat coltul din stnga sus a n a a unui obiect, sensul pozitiv de cretere ind de la stnga la dreapta i de sus jos. Coordos a s n natele sunt msurate twips, sau uniti de msur stabilite cu proprietile ScaleHeight, a n n at a a at ScaleWidth, ScaleLeft, ScaleTop i ScaleMode. s Folosirea oricreia din metodele grace implic modicarea automat a valorilor proprietilor a a a at CurrentX i CurrentY conformitate cu regulile descrise. s n 5.3.1 Procedee de trasare

Proprietatea care seteaz sau returneaz lrgimea pixeli a unei linii drepte sau curbe este : a a a n [obiect.]DrawWidth [= larg ] unde larg reprezint o expresie numeric cu valori cuprinse a a ntre 1 i 32767 , valoarea sa implicit s a ind unitatea. Dac larg > 1 , valorile 1 4 atribuite proprietii DrawStyle sunt ignorate, ind a at trasat a ntotdeauna o linie continu. a Setarea sau aarea stilului care sunt trasate liniile cu metodele grace este realizat cu n a ajutorul proprietii : at [obiect.]DrawStyle [= stil ] Aici stil este un numr care precizeaz tipul de linie care urmeaz a trasat : continu (stil = 0), a a a a a ntrerupt (stil = 1), punctat (stil = 2), diverse alte combinatii (2 < stil 6). Implicit, linia a a trasat este a ntotdeauna continu, ca i atunci cnd valoarea proprietii DrawWidth este diferit a s a at a de unitate. 28

Valoarea care determin modul care se prezint rezultatul aplicrii unei metode grace, a n a a este setat sau aat cu ajutorul proprietii : a a at [obiect.]DrawMode [= mod ] unde mod este un ntreg cuprins ntre 1 i 16 care codic efectele vizulale care pot obtinute s a prin compararea logic, pixel cu pixel, a culoriilor obiectelor desenate cursul executiei cu cea a a n fundalului existent. 5.3.2 Procedee de umplere

O gur a nchis trasat cu una din metodele grace Circle sau Line poate umplut cu o a a a culoare specicat de proprietarea,: a [obiect.]FillColor [= culoare ] Aici culoare este un ntreg lung care contine codul RGB al culorii dorite. Specicarea culorii poate fcut folosind constante numerice, constante simbolice caracteristice sistemului Visual Basic, a a sau cu ajutorul functiilor QBColor ori RGB. Implicit, culoarea setat are valoarea zero, ceea ce a corespunde culorii negre. Cu exceptia formelor, valorile setate cu proprietatea FillColor sunt ignorate, dac proprietatea FillStyle are valoarea implicit (unitatea). a a Modelul care poate folosit pentru umplerea unei guri este precizat de proprietatea : [obiect.]FillStyle [= stil ] unde stil este un ntreg care precizeaz modelul de umplere cu culoarea stabilit de proprietatea a a FillColor : plin (stil = 0), transparent (stil = 1), linii orizontale (stil = 2), linii verticale (stil = 3), linii oblice nclinate spre stnga (stil = 4), linii oblice a nclinate spre dreapta (stil = 5), linii ncruciate drepte (stil = 6), linii s ncruciate oblice (stil = 7). Valoarea implicit a variabilei s a stil este unitatea. Dac modelul specicat este cel transparent, proprietatea FillColor este a luat considerare doar cazul formelor. a n n

5.4

Sistemul de coordonate

Unitatea de msur folosit implicit sistemul Visual Basic pentru dimensionare, deplasare, a a a n sau pentru trasarea unor guri este twip-ul, care reprezint 1/20 dintr-un punct tipograc, ceea a ce nseamn c 1 inch are 1440 twips, respectiv 1 centimetru are 567 twips. Dimensiunile zice a a mentionate se refer la mrimele obiectelor tiprite la imprimant i nu la cele vizualizate pe a a a a s monitor, unde dimensiunea ecranului i rezolutia folosit poate conduce la alte valori. s a Sistemul de coordonate reprezint o retea bidimensional care permite localizarea pozitiei unui a a punct pe un obiect (form, caset cu imagine, imprimant) folosind o pereche de coordonate a a a avnd forma general : a a (x, y ) Valoarea x corespunde localizrii unui punct pe axa Ox care, dac nu se specic altfel, are a a a originea la extremitatea din stnga a obiectului i sensul de msurare pozitiv de la stnga la a s a a dreapta. Valoarea y precizeaz localizarea unui punct pe axa Oy care implicit are originea la a extremitatea superioar a obiectului i sensul de msurare pozitiv de sus jos. Visual Basic a s a n In exist posibilitatea de a modica originea i directiile axelor, precum i unitile de msur folosite a s s at a a att simultan, ct i individual pe ecare din axe. a a s Stabilirea unitilor de msur ale coordonatelor pe axe poate realizat folosind proprietatea : at a a a [obiect.]ScaleMode [= unit ] 29

unde unit este un ntreg care specic unitile de msur folosite i care poate lua valorile : 0 a at a a s coordonate denite de utilizator ; 1 - twips ; 2 - puncte (1 inch = 72 puncte) ; 3 - pixeli (numrul a de pixeli/inch depinde de rezolutia aleas) ; 4 - caractere (1 caracter = 120240 twips) ; 5 - inchi ; a 6 - milimetri ; 7 - centimetri. Dup cum s-a amintit, lips valoarea respectiv este unitatea, a n a a deoarece twipul este unitatea de msur implicit. a a a Setarea unor valori numerice pentru coordonatele coltului din stnga sus ale unui obiect este a stabilit de proprietile : a at [obiect.]ScaleLeft [= stnga ] a [obiect.]ScaleTop [= sus ] Valorile stnga i sus sunt exprimate unitile de msur denite pentru obiectul referit i nu a s n at a a s trebuie confundate cu valorile proprietilor Left i Top care sunt exprimate unitile de msur at s n at a a ale containerului care contine obiectul respectiv (de exemplu, ale formei care contine caseta cu imagine). Implicit, cele dou proprieti au valoarea zero. a at Dimensiunile interioare pe orizontal i pe vertical ale obiectului, exprimate unitile de as a n at msur stabilite, sunt date de proprietile : a a at [obiect.]ScaleHeight [= alt ] n [obiect.]ScaleWidth [= lrg ] a care nu trebuie confundate cu proprietile Height i Width. Dac alt sau lrg au valori at s a n a negative, atunci sensul pozitiv al axelor corespunztoare este invers celui implicit, deci de jos a n sus, respectiv de la dreapta la stnga. a Aceste patru proprieti pot folosite pentru a construi un sistem de coordonate care s at a corespund necesitilor grace ale utilizatorului. La folosirea acestora trebuie avut vedere a at n c prin atribuirea de valori oricreia din ele, proprietii ScaleMode este automat atribuit a a at i a schimb, dac proprietatea ScaleMode este setat la o valoare mai mare ca zero, valoarea zero. In a a atunci propritile ScaleLeft i ScaleTop sunt resetate la zero, iar proprietile ScaleHeight at s at i ScaleWidth si modic valorile pentru a respectate noile uniti de msur ; simultan s a at a a setrile furnizate de proprietile CurrentX i CurrentY reect noul sistem de coordonate pentru a at s a cursorul grac. Dac proprietile mentionate pot servi i la obtinerea de informatii asupra setului de coordoa at s nate folosit la un moment dat, pentru denirea unui sistem de coordonate specic utilizatorului poate folosit direct metoda : a [obiect.]Scale [(x1, y1 ) - (x2, y2 )] Perechea (x1, y1 ) stabilete coordonatele coltului din stnga sus ale obiectului, iar (x2, y2 ) ins a dic coodonatele coltului din dreapta jos uniti de msur compatibile. Valorile lui x1 i y1 a n at a a s determin setrile proprietilor ScaleLeft i ScaleTop, iar diferentele (x2 x1) i (y2 y1) pe a a at s s cele ale proprietilor ScaleWidth i ScaleHight. Dac metoda este utilizat fr argumente, at s a a aa sistemul de coorodnate este resetat la unitile implicite (twips). at Pot apare uneori situatii cnd rezultatele grace devin mai intuitive dac unitile de msur a a at a a pe axe sunt diferite. Pentru modicarea individual a acestora pot folosite metodele : a [obiect.]ScaleX (lrg [,[unitInit ][,[unitFin ]]]) a [obiect.]ScaleY ( alt [,[unitInit ][,[unitFin ]]]) n unde lrg i alt sunt exprimate unitile de msur stabilite initial unitInit. Constantele care a s n n at a a desemneaz sistemele de uniti sunt cele mentionate la descrierea proprietii ScaleMode, la a at at care se mai adaug una : 8 - HiMetric, care reect dimensiunile zice ale obiectului i care este a a s cea implicit dac unitInit lipsete. a a s 30

Anex: o procedur util pentru reprezentri grace a a a a

cursul dezvoltrii unei aplicatii apare adesea necesitatea de a reprezenta grac una sau In a mai multe functii cunoscute sub form analitic sau tabelat. Deoarece de la caz la caz, pot a a a apare diferente semnicative ntre valorile numerice ale variabilelor, devine util elaborarea unei a proceduri relativ simple care, folosind un numr limitat de informatii, s permit trasarea i a a a s inscriptionarea adecvat a unui domeniu care, prin utilizarea corespunztoare a metodelor gra a n a ce specice sistemului, s poat ilustrate grac o serie de aspecte ale proceselor i fenomenelor a a s examinate. Subrutina graph, descris cele ce urmeaz, poate introdus a n a a ntr-un modul de cod (cu extensia .bas), ind astfel accesibil din oricare din formele (cu extensia .frm) continute a de un proiect (cu extensia .vbp) elaborat Visual Basic. Din motive practice este de dorit ca n ecare form a proiectului s e consacrat unei singure aplicatii, uxul actiunilor i calculelor a a a s ind monitorizat cu ajutorul butoanelor de comand, butoanelor de optiune i casetelor de valia s dare. Datele necesare pot preluate prin intermediul casetelor de dialog, a barelor de derulare, a casetelor de text, cu list i combinate, etc., iar rezultatele pot aate sub forma unor texte, as s tabele, sau grace cu sau fr animatie. Forma folosit pentru reprezentarea grac, form care aa a a a poate contine i controalele mentionate eventual grupate s ntr-un cadru, sau poate dedicat a exclusiv scopului propus, va prevzut obligator faza de proiectare cu o caset de imagine a a n a (PictureBox) avnd numele unic picGraph, care redimensionat i repozitionat cadrul subrua as a n tinei va contine reprezentarea grac propriu-zis coordonate logice (universale), spatiul rmas a a n a neocupat pe form ind folosit pentru inscriptionarea denumirilor axelor, precum i a valorilor a s numerice corespunztoare marcajelor diviziunilor pe axe. a Apelul procedurii graph va continut ntr-o secvent de cod asociat unui eveniment specic a a unui obiect dat, de exemplu evenimentul Click al unui buton de comand situat pe form. acest a a In mod, prin punerea corespondent a listelor de argumente actuale i formale, sunt transmise n a s subrutinei prin adres sau valoare datele necesare elaborrii contextului care va realizat a a n a reprezentarea grac: a numele formei care va contine gracul; coordonatele logice ale coltului din stnga-jos (xmin , ymin ) i ale celui din dreapta-sus a s (xmax , ymax ) pentru caseta de imagine care va contine gracul propriu-zis; Valorile hx i hy ale intervalelor dintre marcajele diviziunilor pe axe; dac hx = hy = 1 s a subrutina va calcula valorile optime ale acestor intervale, iar dac hx = hy = 0 diviziunile a nu sunt nici marcate, nici numerotate; denumirile folosite pentru inscriptionarea axelor Ox i Oy; s optiuni privind trasarea sau nu a unui caroiaj care s uneasc diviziunile de pe axe, respectiv a a punerea evident a axelor de coordonate care se intersecteaz origine. n a a n Subrutina are o structur liniar, ceea ce permite urmrirea uoar a etapelor ce sunt parcurse, a a a s a secventele corespunztoare de program ind plus delimitate codul surs prin linii care contin a n n a exclusiv comentarii. Pentru a evita folosirea exagerat a unor instructiuni de declare a tipului i a s 31

pentru a facilita conversiile automate de tip cursul executiei, sectiunea de declaratii generale n n a modulului vor gura dou declaratii generice de tip (sugerate de limbajul FORTRAN3 ): a DefLng I-N: DefDbl A-H, O-Z Ca urmare, orice variabil numeric a crei nume a a a ncepe cu una din literele i, j, k, l, m, n va tratat ca un a ntreg lung (reprezentat pe patru octeti), iar variabilele numerice avnd un nume a care ncepe cu alt liter va de tip real dubl precizie (reprezentat pe opt octeti). Specicarea a a a explicit a tipului unei variabile cadrul programului va putea modica aceste declaratii, care a n devin implicite. primele dou sectiuni ale subrutinei sunt precizate sau modicate, dac este cazul, cteva In a a a dintre proprietile predenite ale formei i ale casetei de imagine continute, astfel at reprezenat s nc tarea grac s se a a ncadreze dimensiunile zice ale ecranului, ind avute vedere rezolutiile n n 640 480 i 800 600 pixeli. Caseta de imagine care va contine gracul propriu-zis, are dimensis unile 6000 4500 twips i este astfel plasat pe forma de baz, at s rmn sucient spatiu s a a nc a a a a pentru inscriptionarea axelor, pentru precizarea valorilor numerice ale marcajelor diviziunilor i s pentru aarea unor informatii utile. Partea dreapt a formei este rezervat trasrii unui cadru s a a a care s cuprind controalele necesare dezvoltrii aplicatiei. O lectur mai atent arat c a a a a a a a n esent sunt simulate efectele perechii de instructiuni VIEW i WINDOW folosite QuickBASIC. a s n Deoarece este respectat raportul 4 : 3 pentru dimensiunile ferestrei, prin alegerea adecvat a a valorilor coordonatelor logice, poate trasat fr diculti un sistem cartezian de axe. aa at Urmtoarele dou sectiuni sunt consacrate trasrii cu linii intrerupte a unui caroiaj care s a a a a se suprapun peste marcajele diviziunilor de pe axe i care s permit localizarea mai uoar a a s a a s a obiectelor grace care urmeaz a reprezentate. Dac este cazul, sunt calculate optional i a a s valorile optime ale intervalelor dintre dou diviziuni succesive. Aceast secvent de cod poate a a a evitat dac din datele de intrare rezult explicit c nu se cere trasarea caroiajului respectiv. a a a a In continuare sunt inscriptionate direct pe form denumirile axelor de coordonate, precum i valorile a s numerice ale diviziunilor de pe axe. acest scop vor utilizate informatiile referitoare la altimea In n i limea medie a unui caracter apatinnd setului de fonturi folosite pentru scriere, aceste valori s at a ind calculate a prima sectiune. Simultan sunt trasate chiar pe domeniul rezervat gracului nc n marcajele corespunztoare diviziunilor pe axe, existenta acestora ind util special cazul a a n n n care din diverse motive nu este recomandabil trasarea caroiajului mentionat anterior. a nal, portiunea care delimiteaz reprezentarea grac este In a a ncadrat cu o linie continu, a a ind de asemenea marcate distinct axele de coordonate care se intersecteaz obligator origine. a n
------------------------------------------------------------------------------ Subrutina graph(xmin, xmax, hx, ymin, ymax, hy, numeOx As String, _ numeOy As String, icar, iaxe, frm As Form) defineste, vizualizeaza si inscriptioneaza o caseta cu imagine plasata pe o forma, care ulterior poate folosita pentru realizarea unor reprezentari grafice folosind proceduri specifice. Argumente formale : xmin : valoarea numerica minima pe axa Ox - variabila de tip Double
E. W. Schmid, G. Spitz, W. Lsch - Theoretical Physics on the Personal Computer, Springer-Verlag, o Berlin Heidelberg New York, 1990
3

32

xmax : valoarea numerica maxima pe axa Ox - variabila de tip Double hx : intervalul dintre doua diviziuni pe axa Ox - variabila de tip Double; daca hx=-1 este calculata valoarea optima, iar daca hx=0 nu sunt marcate si inscriptionate diviziunile pe axa Ox ymin : valoarea numerica minima pe axa Oy - variabila de tip Double ymax : valoarea numerica maxima pe axa Oy - variabila de tip Double hy : intervalul dintre doua diviziuni pe axa Oy - variabila de tip Double; daca hy=-1 este calculata valoarea optima, iar daca hy=0 nu sunt marcate si inscriptionate diviziunile pe axa Oy numeOx : numele asociat axei Ox - variabila de tip String numeOy : numele asociat axei Oy - variabila de tip String icar : este trasat (icar<>0) sau nu este trasat (icar=0) caroiajul corespun zator diviziunilor de pe axe - variabila de tip Long iaxe : sunt trasate (iaxe<>0) sau nu sunt trasate (icar=0) axele de coodonate care se intersecteaza in origine - variabila de tip Long frm : numele formei pe care este executat graficul - obiect de tip Form ------------------------------------------------------------------------------Sub graph(xmin, xmax, hx, ymin, ymax, hy, numeOx As String, numeOy As String, _ icar, iaxe, frm As Form) Dim ascii As String, fmt(0 To 3) As String Const xwmin = 960, xwmax = xwmin + 6000, ywmin = 720, ywmax = ywmin + 4500 fmt(0) = "##.###": fmt(1) = "###.##": fmt(2) = "####.#": fmt(3) = "#####." frm.Cls: frm.picGraph.Cls Specificarea explicita a unor proprietati ale formei care contine graficul If frm.Height < 6375 Then frm.Height = 6375 If frm.Width < 9570 Then frm.Width = 9570 frm.Top = Screen.Height / 2 - frm.Height / 2 frm.Left = Screen.Width / 2 - frm.Width / 2 frm.BackColor = QBColor(15) frm.ForeColor = QBColor(0) frm.Font.Name = "MS Sans Serif" frm.Font.Size = 8 frm.Font.Bold = True asciiy = frm.TextHeight("ABC") Inaltinea unui caracter ascii = "" For i = 32 To 127 ascii = ascii & Chr(i) Next i asciix = frm.TextWidth(ascii) / 96 Largimea medie a unui caracter Principalele proprietati ale casetei cu imagine pe care se traseaza graficul frm.picGraph.Left = xwmin frm.picGraph.Top = ywmin frm.picGraph.Height = ywmax - ywmin frm.picGraph.Width = xwmax - xwmin frm.picGraph.BackColor = QBColor(7) frm.picGraph.ForeColor = QBColor(0) frm.picGraph.BorderStyle = 0

33

frm.picGraph.ScaleMode = 0 frm.picGraph.ScaleHeight = -(ymax - ymin) * 1.002 frm.picGraph.ScaleWidth = (xmax - xmin) * 1.002 frm.picGraph.ScaleLeft = xmin frm.picGraph.ScaleTop = ymax Calculul valorilor optime ale intervalelor dintre doua diviziuni succesive If hx <> -1 Then dx = hx Else dx = 10 ^ (Int(Log(Abs(xmax - xmin)) / Log(10) - 1)) Select Case Int(Abs(xmax - xmin) / dx) Case 13 To 30 dx = 2 * dx Case 31 To 60 dx = 5 * dx Case Is > 60 dx = 10 * dx End Select End If If dx <> 0 Then ndxinf = Fix((xmin - 0) / dx) ndxsup = Fix((xmax - 0) / dx) ndxpas = Sgn(ndxsup - ndxinf) If Abs(ndxsup - ndxinf) > 200 Or dx < 0 Then dx = 0 End If If hy <> -1 Then dy = hy Else dy = 10 ^ (Int(Log(Abs(ymax - ymin)) / Log(10) - 1)) Select Case Int(Abs(ymax - ymin) / dy) Case 13 To 30 dy = 2 * dy Case 31 To 60 dy = 5 * dy Case Is > 60 dy = 10 * dy End Select End If If dy <> 0 Then ndyinf = Fix((ymin - 0) / dy) ndysup = Fix((ymax - 0) / dy) ndypas = Sgn(ndysup - ndyinf) If Abs(ndysup - ndyinf) > 200 Or dy < 0 Then dy = 0 End If Trasarea cu linii intrerupte a caroiajului corespunzator diviziunilor de pe axe frm.picGraph.DrawStyle = 2 If icar <> 0 And dx <> 0 Then

34

For n = ndxinf To ndxsup Step ndxpas frm.picGraph.Line (n * dx, ymin)-(n * dx, ymax), QBColor(9) Next n End If If icar <> 0 And dy <> 0 Then For n = ndyinf To ndysup Step ndypas frm.picGraph.Line (xmin, n * dy)-(xmax, n * dy), QBColor(9) Next n End If frm.picGraph.DrawStyle = 0 Inscriptionarea denumirilor atribuite axelor de coordonate Ox si Oy If numeOx <> "" Then xpos = (xwmin + xwmax - frm.TextWidth(numeOx)) / 2 ypos = ywmax + asciiy / 2 If dx <> 0 Then ypos = ypos + 1.5 * asciiy If ypos > 6000 - asciiy Then ypos = 6000 - asciiy frm.CurrentX = xpos: frm.CurrentY = ypos: frm.Print numeOx End If If numeOy <> "" Then xpos = xwmin - 6 * asciix If xpos < 0 Then xpos = 0 ypos = ywmin - 2 * asciiy frm.CurrentX = xpos: frm.CurrentY = ypos: frm.Print numeOy End If Inscriptionarea valorilor numerice si trasarea marcajelor diviziunilor pe axa Ox If dx <> 0 Then facty = 0.5 * asciiy * (ymax - ymin) / (ywmax - ywmin) xt1 = xwmax: xs0 = xwmin: If numeOx = "" Then xs0 = xt1 If Abs(xmin) > Abs(xmax) Then aux = Abs(xmin) Else aux = Abs(xmax) End If logaux = Int(Log(aux) / Log(10)) fact = 1 If (logaux < 0) Or (logaux > 3) Or (dx < aux * 0.01) Then fact = 10 ^ logaux ascii = Format(logaux, "####") xt1 = xt1 - frm.TextWidth("*10" & ascii) If numeOx <> "" Then frm.CurrentX = xt1 frm.CurrentY = ywmax + 0.75 * asciiy frm.Print "*10" frm.CurrentX = xt1 + frm.TextWidth("*10") frm.CurrentY = ywmax + 0.25 * asciiy frm.Print ascii End If

35

logaux = 0 End If For n = ndxinf To ndxsup Step ndxpas ascii = Format(n * dx / fact, fmt(logaux)) If Right(ascii, 1) = "." Then ascii = Mid(ascii, 1, Len(ascii) - 1) xs = xwmin + (xwmax - xwmin) / (xmax - xmin) * (n * dx - xmin) xs1 = xs - frm.TextWidth(ascii) / 2 xt0 = xs + frm.TextWidth(ascii) / 2 + asciix / 2 If (xs1 > xs0) And (xt0 < xt1) Then frm.CurrentX = xs1 frm.CurrentY = ywmax + 0.5 * asciiy frm.Print ascii frm.picGraph.Line (n * dx, ymin)-(n * dx, ymin + facty) frm.picGraph.Line (n * dx, ymax)-(n * dx, ymax - facty) xs0 = xt0 Else frm.picGraph.Line (n * dx, ymin)-(n * dx, ymin + facty / 2) frm.picGraph.Line (n * dx, ymax)-(n * dx, ymax - facty / 2) End If Next n End If Inscriptionarea valorilor numerice si trasarea marcajelor diviziunilor pe axa Oy If dy <> 0 Then factx = 0.75 * asciix * (xmax - xmin) / (xwmax - xwmin) ys0 = ywmax - asciiy: yt1 = ywmin - asciiy: If numeOy = "" Then ys0 = yt1 If Abs(ymin) > Abs(ymax) Then aux = Abs(ymin) Else aux = Abs(ymax) End If logaux = Int(Log(aux) / Log(10)) fact = 1 If (logaux < 0) Or (logaux > 3) Or (dy < aux * 0.01) Then fact = 10 ^ logaux ascii = Format(logaux, "####") yt1 = ywmin + 0.75 * asciiy If numeOy <> "" Then frm.CurrentX = xwmin - 6 * asciix frm.CurrentY = ywmin + 0.75 * asciiy frm.Print "*10" frm.CurrentX = xwmin - 6 * asciix + frm.TextWidth("*10") frm.CurrentY = ywmin + 0.25 * asciiy frm.Print ascii End If logaux = 0 End If For n = ndyinf To ndysup Step ndypas

36

ascii = Format(n * dy / fact, fmt(logaux)) If Right(ascii, 1) = "." Then ascii = Mid(ascii, 1, Len(ascii) - 1) ys = ywmin + (ywmax - ywmin) / (ymax - ymin) * (ymax - n * dy) ys1 = ys - asciiy / 2 yt0 = ys - 1.75 * asciiy If (ys0 > ys1) And (yt1 < yt0) Then frm.CurrentX = xwmin - asciix - frm.TextWidth(ascii) frm.CurrentY = ys1 frm.Print ascii frm.picGraph.Line (xmin, n * dy)-(xmin + factx, n * dy) frm.picGraph.Line (xmax, n * dy)-(xmax - factx, n * dy) ys0 = yt0 Else frm.picGraph.Line (xmin, n * dy)-(xmin + factx / 2, n * dy) frm.picGraph.Line (xmax, n * dy)-(xmax - factx / 2, n * dy) End If Next n End If Incadrarea reprezentarii grafice cu o linie continua in culoarea prim planului frm.picGraph.Line (xmin, ymax)-(xmax, ymin), , B Trasarea cu rosu a axelor de coordonate care se intersecteaza in origine If iaxe <> 0 Then frm.picGraph.Line (xmin, 0)-(xmax, 0), QBColor(12) frm.picGraph.Line (0, ymin)-(0, ymax), QBColor(12) End If End Sub

Renuntnd la unele optiuni, cum ar calculul valorilor optime pentru intervalele dintre divia ziuni, sau la inscriptionarea exact a valorilor numerice ale marcajelor, codul subrutinei se reduce a la doar 20-30 de instructiuni, pstrndu-se apropape neschimbat functionalitatea acesteia. a a a Odat apelat subrutina graph, prin utilizarea ulterioar a metodelor i proprietilor grace a a a s at eventualitatea specice sistemului, pot realizate uor schitele i reprezentrile grace dorite. In s s a modicrii unor proprieti care nu sunt specicate explicit subrutin, este recomandabil ca a at n a nal acestea s e setate la valorile lor predenite, caz contrar putnd apare rezultate n a n a imprevizibile la o reluare a executiei. Spatiul rmas liber pe form i din caseta cu imagine poate a as folosit pentru inscrierea a diverse informatii utile, cu observatia c pentru pozitionarea textelor a pe cele dou obiecte trebuie folosite uniti de msur diferite. a at a a

37

S-ar putea să vă placă și