Sunteți pe pagina 1din 62

4.2.

ELEMENTE ALE LIMBAJULUI DE PROGRAMARE


VISUAL BASIC

Setul de caractere

Pentru a scrie instrucţiunile pe care calculatorul să le interpreteze şi să le execute în cadrul


programului folosim cuvintele. Acestea sunt entităţi formate din caractere.
În cazul limbajului Visual Basic se pot folosi următoarele caractere:
- Literele mari şi mici ale alfabetului limbii române: A-Z, a-z;
- Cifrele sistemului de numerotaţie zecimal:0-9;
- Caractere speciale: + - / ^ () [] {}. , ; :_ ! # % & $ etc.;
- Caracterele speciale perechi, care definesc operatori de comparare: <=, >=, = ,<>;
- Separatorii: spaţiu, tab şi caracterul Enter.
Observaţie:
Visual Basic nu face diferenţa între literele mari şi mici folosite în cuvintele cheie sau în
formarea identificatorilor.

Identificatori

Un identificator este numele dat de programator unui element dintr-un program, care poate fi
o variabilă, o constantă, un tip definit de utilizator, o enumerare, o procedură, o funcţie, un
obiect, o metodă, o proprietate, un control, o formă, un modul sau chiar proiectul însuşi. Un
proiect Visual Basic poate să conţină maxim 32000 identificatori.
Un identificator trebuie să respecte următoarele reguli:
- să înceapă cu o literă sau cu underscore;
- să nu conţină anumite caractere cum ar fi: . %!$&#@;
- dacă începe cu underscore, să fie urmat de un caracter alfabetic sau zecimal;
- numele controalelor, modulelor, formelor şi claselor nu pot fi mai lungi de 1023
caractere;
- numele fisierelor nu trebuie sa fie mai mari de 260 de caractere (inclusiv calea),
iar calea separat trebuie sa aiba mai putin de 248 de caractere;
- numele celorlalte tipuri de identificatori nu trebuie sa depășească 1023 caractere;
- nu trebuie să existe identificatori identici;
- nu pot fi identificatori cuvintele cheie (rezervate) ale limbajului, decât în cazuri
excepție, când sunt declarate între paranteze pătrate (ex: Dim [dim] = 1 ‘s-a declarat
variabila cu identificatorul [dim] și s-a inițializat cu valoarea 1). Cuvintele cheie sunt
identificatori cu semnificaţie fixată, care nu pot fi folosiţi în alt context decât cel precizat
de semantica limbajului. Exemple: Dim, Private, Public, Array , For , Next, If, Then,
Else, End etc.
- există o serie de identificatori standard, definiţi de Visual Basic. O redeclarare a
lor de către programator va duce la nerecunoaşterea sensurilor iniţiale.
Pentru a face codul sursă al programului cât mai lizibil, identificatorii folosiţi ar trebui să
sugereze rolul lor în aplicaţie. De aceea mulţi programatori folosesc prefixe în definirea
identificatorilor care indică tipul de date referit şi scopul lor.

Comentarii , separatori, împărţirea liniei


Comentariile sunt şiruri de caractere precedate de caracterul apostrof (`) sau de cuvântul cheie
REM şi servesc pentru a face textul programului mai lizibil, pentru a documenta programul.
Exemple:
REM Aici începe programul
Dim iVirsta as Integer ´ Vârsta sportivilor
Dim iGreutatea as Interger ´ Greutatea sportivilor în kilograme

Comentariile mai pot fi utilizate pentru a determina compilatorul să nu mai execute anumite
instrucţiuni, mai ales în faza de testare a programului.

În general în Visual Basic se poate scrie o singură instrucţiune pe o linie. Totuşi, dacă se
doreşte, se pot scrie mai multe instrucţiuni pe o singură linie despărţindu-le cu ajutorul
separatorului de instrucţiuni şi declaraţii care este caracterul : (două puncte).
Exemplu:
Dim a as Integer : a=10

Pe de altă parte, pentru a spori lizibilitatea programelor, dacă o declaraţie sau o instrucţiune
este prea mare, atunci ea se poate scrie pe mai multe linii. Aceasta se realizează folosind
caracterul continuator de linie ( _)( un spaţiu urmat de underscore).

Observaţie:
Facem următoarele convenţii privind formatul comenzilor (instrucţiunilor) Visual Basic:
- Cuvintele scrise îngroşat (Bold) sunt cuvinte cheie, care trebuie folosite ca atare, iar cele
scrise cu caractere normale reprezintă cerinţe, deci elemente care se vor înlocui cu ceea ce se
cere efectiv prin ele.
- Cuvintele scrise între paranteze drepte [] semnifică ceva opţional, care poate fi scris sau
poate lipsi.
- Caracterul / între două cuvinte semnifică faptul că se poate folosi oricare dintre acele
cuvinte în sintaxa comenzii.

4.3. TIPURI DE DATE

Tipul unei date defineşte mulţimea de valori pe care le poate lua o variabilă şi mulţimea de
operaţii care pot fi efectuate cu elementele mulţimii respective. În funcţie de tipul de dată
declarat pentru o anumită variabilă compilatorul alocă o zonă mai mare sau mai mică de
memorie pentru reprezentarea ei.
Fiecare tip de dată permite o serie de operaţii.
Astfel:
- Pentru valorile unui tip întreg se pot face următoarele operaţii: adunarea(+); scăderea(-);
înmulţirea(*); împărţirea întreagă (\); împărţirea reală(/); restul împărţirii întregi (mod); ridicarea
la putere (^).
Sunt permise de asemenea operaţiile relaţionale: mai mic sau egal (<=); mai mic (<); egal
(=); mai mare(>); mai mare sau egal (>=);Rezultatul unor astfel de operaţii este de tip boolean,
având valorile logice True sau False.
- Pentru valorile unui tip real se pot face următoarele operaţii: adunarea (+); scăderea(-);
înmulţirea(*); împărţirea(/); ridicarea la putere (^). Sunt permise şi operaţiile relaţionale
prezentate la tipurile întregi.
- Pentru şirurile de caractere sunt permise operaţia de concatenarea (& sau +) şi operaţiile de
comparaţie (<,<=,=,>=,>).
Prin concatenare două sau mai multe şiruri de caractere pot fi alipite formând un singur şir de
caractere. Cu ajutorul operaţiilor de comparaţie se stabileşte poziţia alfabetică a şirurilor de
caractere;
- Pentru valorile de tip logic, boolean (True şi False) sunt permise următoarele operaţii
logice: negarea logică (Not); şi logic (And); sau logic (Or); sau exclusiv logic (Xor);
echivalenţa logică (simbolul ‘=’); implicaţia logică ((Not A) Or B);
- Pentru tipul de dată de tip obiect este permisă o singură operaţie – cea de comparaţie
(Is).

4.3.1. Constante

O constantă reprezintă o valoare fixă care nu se schimbă în timpul execuţiei programului


sau de la o execuţie la alta, identificată printr-un nume (identificator). O constantă poate conţine
numere, şiruri de caractere, date calendaristice, etc. Ea poate avea deci un anumit tip.
Adeseori în programele noastre pot să apară valori constante care se repetă de nenumărate
ori. Pentru a spori lizibilitatea programului şi pentru a nu fi nevoiţi să facem numeroase
modificări în cazul în care o valoare des întâlnită ar trebui modificată, vom folosi constantele. O
definiţie de constantă introduce un identificator ca sinonim al unei valori constante
În Visual Basic există două tipuri de constante:
 Intrinseci sau definite de sistem; Visual Basic pune la dispoziţie o serie întreagă de
constante pentru culori, taste, figuri etc.
 Simbolice sau definite de utilizator (se declară prin instrucţiunea Const). Putem defini
deci propriile noastre constante în cadrul unui program cu ajutorul cuvântului cheie Const.
Formatul general al declaraţiei de constante este:

[Public|Private] Const NumeConstanta[As type] = expresie

unde: cuvintele Public sau Private definesc tipul constantei: Public, dacă poate fi referită în toate
procedurile şi respectiv Private dacă este definită doar pentru procedura curentă.
Const : cuvânt cheie
NumeConstantă – numele atribuit ca identificator constantei respective
As type – defineşte tipul constantei
Expresie – defineşte valoarea sau expresia din evaluarea căreia rezultă valoarea constantei.
Observaţie:
Dacă se specifică direct valoarea constantei, atunci trebuie să reţinem următoarele:
- o constantă de tip numeric sau logic se precizează prin valoarea ei scrisă ca atare;
- o constantă de tip şir de caractere trebuie scrisă între delimitatorii “ “ (ghilimele);
- o constantă de tip dată calendaristică se precizează între delimitatorii # #.
Exemple:
Const PI = 3.14159265358979
Const Nr_zile_lucratoare = 22
Const Zi_de_nastere = #2/4/1981#
Const Nume_aplicatie = ˝Salarii˝

4.3.2. Variabile Visual Basic

O variabilă reprezintă o locaţie de memorie internă care serveşte pentru stocarea temporară a
datelor şi care se identifică printr-un nume. O variabilă poate conţine orice tip de dată care poate
fi modificat în timpul execuţiei programului.
Tipul variabilelor din Visual Basic sunt: VarianType, Byte, Boolean, String, Integer, Long,
Single, Double, Currency, Date şi Object. Tipul implicit pentru orice variabilă este tipul Object
(nedefinit).
În Visual Basic 6.0, tipul Variant era un tip special de date care putea conţine date
numerice, şiruri de caractere şi date calendaristice, precum şi valorile speciale Null şi Empty. În
Visual Basic 2010 tipul Variant este înlocuit de Object, valorile speciale fiind reprezentate prin
VariantType.Null și VariantType.Empty.
Empty indică faptul că o variabilă nu a fost inţializată şi este egală cu 0 când se referă la
valori numerice sau are lungime nulă când se referă la şiruri de caractere.
Null indică faptul că o variabilă nu conţine nici o dată validă în mod deliberat.
Definirea unei variabile Visual Basic se poate face în două moduri:
- Utilizând operatorul de atribuire: NumeVariabilă=Variabilă;
- Declarând variabilele cu comanda Dim, Private sau Public.
Pentru a utiliza o variabilă de tip Object ea trebuie declarată cu Dim, ReDim, Static, Private
sau Public şi apoi i se asociază un obiect cu instrucţiunea: variabilă=obiect ;
Aşa cum indică şi cuvântul variabilă, valoarea pe care programul o păstrează în aceste locaţii
se poate modifica pe parcursul execuţiei programului. O variabilă poate să stocheze valori
diferite în momente diferite. O variabilă se caracterizează prin cele două elemente:
- numele variabilei, care este un identificator cu ajutorul căruia putem să referim
variabila pe parcursul programului;
- tipul variabilei, care precizează tipul de date care pot fi stocate de variabila respectivă.
În funcţie de tipul variabilei compilatorul alocă o zonă de memorie mai mică sau mai mare
pentru aceasta.
În ceea ce priveşte variabilele de memorie, Visual Basic permite utilizarea a două feluri de
variabile:
- variabile cu tip
- variabile fără tip.
Folosirea variabilelor fără tip de date (prin utilizarea tipului implici Variant) a devenit
deosebit de importantă. Tipul Variant conţine nu numai variabila, dar şi informaţii despre
variabilă.
Declararea unei variabile înseamnă practic a defini de la început informaţiile necesare
programului despre variabila respectivă, astfel încât programul să ştie cum se numeşte, ce tip de
date poate stoca, ce zonă de memorie trebuie să-i aloce şi unde.

Declararea unei variabile se face astfel:

[Public| Private| Dim] NumeVariabilă As TipVaribilă


Public, Private, Dim sunt cuvinte rezervate limbajului Visual Basic prin care se precizează
dacă variabilă respectivă este de tip public, accesibilă în toate procedurile sau privat, accesibilă
doar în procedura curentă (locală); NumeVaribilă este identificatorul variabilei; As este un
cuvânt cheie care precizează faptul că dorim să declarăm tipul variabilei. TipVariabilă este
numele unui tip de date dintre cele pe care le acceptă Visual Basic.

Exemple:
Dim i as Integer ´ defineşte variabila locală i de tip Integer
Dim ZiSalar as Date ´ defineşte variabila locală ZiSalar de tip Date
Private Nume as String ´ defineşte variabila locală Nume de tip String
Public ListaPreturi as ListBox ´ defineşte variabila ListaPreturi ce va conţine o ´referinţă
către un obiect de tip ListBox.

Variabilele au două caracteristici deosebit de importante şi anume:


- domeniul de valabilitate
- durata de existenţă.
Astfel variabilele utilizate în cadrul unei proceduri se numesc variabile locale. Acestea se
declară în interiorul procedurii cu ajutorul comenzii Dim. Variabilele locale există atâta timp cât
se execută procedura în care au fost declarate şi pot fi utilizate numai în cadrul acelei proceduri,
neavând nici o semnificaţie în altă parte a programului. Aceste variabile au deci un domeniu de
valabilitate restrâns doar la nivelul procedurii şi au o durată de viaţă temporară.

Observaţie:
Se recomandă folosirea comenzii Dim doar pentru declararea acestui tip de variabile, chiar
dacă Visual Basic permite utilizarea ei şi în alte contexte.

Un alt tip de variabile îl reprezintă cele cu domeniu de vizibilitate la nivelul unui modul.
Aceste variabile pot fi folosite oriunde în interiorul modulului în care au fost declarate. Ele există
atâta timp cât este folosit modulul respectiv. Se recomandă ca declararea lor să se facă cu
ajutorul comenzii Private în loc de Dim.

Un alt tip de variabile îl reprezintă variabilele publice sau globale, vizibile la nivelul
întregului program. Acestea pot fi folosite oriunde în program, au un domeniu de valabilitate
global şi există atâta timp cât se execută programul. Variabilele globale se declară utilizând
comanda Public în zona General Declaration.
Pe lângă acestea, un alt tip de variabile sunt cele statice. Acestea pot avea un domeniu de
valabilitate locală sau la nivelul unei proceduri, dar o durată de existenţă permanentă. Declararea
lor se face cu ajutorul comenzii Static. De exemplu se poate defini o variabilă statică la nivelul
unei proceduri. Ea va fi vizibilă doar la nivelul acelei proceduri, dar îşi va păstra valoarea şi după
ce procedura îşi va termina execuţia. Dacă procedura va fi din nou apelată, variabila statică nu va
fi iniţializată automat de Visual Basic, aşa cum se întâmplă cu variabilele care nu sunt statice, ci
va avea valoarea pe care a avut-o la ultima ei folosire.
Diferenţa dintre variabilele declarate cu Dim şi cele declarate cu STATIC constă deci în
durata de viaţă a variabilelor. Astfel, cele declarate cu static nu se modifică şi nu îşi pierd
valoarea stabilită pe parcursul execuţiei programului la o nouă reluare a acestuia..
Variabilele locale la nivelul unui modul sau publice (globale) se declară în secţiunea de
declaraţii a modulului ( Declarations).
Declararea variabilelor se poate face în Visual Basic în două moduri :
- implicit
- explicit.
În modul implicit o variabilă este considerată declarată la prima ei folosire. Nu este necesară
o declarare prealabilă cu ajutorul cuvintelor cheie Dim, Private, Public. În mod implicit Visual
Basic declară toate variabilele de tip Object.
Declararea explicită a variabilelor presupune ca înainte să fie folosită, o variabilă să fie
declarată cu ajutorul uneia dintre comenzile Dim, Private, Public.

Observaţie:
Se poate scrie la începutul modulului opţiunea Option Explicit sau se poate cere mediului de
programare să facă acest lucru automat selectând din meniul Tools -Options…- Projects and
Solutions –VB Defaults opţiunea Option Explicit. În acest caz Visual Basic ne va atenţiona
dacă folosim o variabilă pe care nu am declarat-o anterior. Este o opţiune deosebit de utilă şi se
recomandă pentru a evita greşelile legate de scrierea numelor variabilelor.

Notă:
Una dintre cele mai frecvente probleme întâlnite la declararea unei variabile este următoarea:
Dim a,b,c As Integer,d As Decimal,e As Char,f,g As String,h
Ne întrebăm ce tip de variabilă este fiecare după declarare. Avem următoarele rezultate:
 a,b și c sunt de tip Integer, tip ce nu necesită inițializare explicită;
 d este de tip Decimal;
 e este de tip Char;
 f și g – în cazul acestor variabile, pentru a fi de tip String, este obligatorie inițializarea
după declarare, altfel f și g sunt recunoscute ca fiind de tip Object;
 h prin omiterea tipului de date la declarare, Visual Basic îi acordă tipul implicit, tipul
Object.

Memorarea, înscrierea datelor în variabile se face cu ajutorul instrucţiunilor de atribuire.


Formatul general al unei astfel de comenzi este:
NumeVariabilă =Variabilă/expresie
unde:
Nume variabilă reprezintă numele variabilei care se defineşte;
Expresie – reprezintă valoarea dată sau expresia din evaluarea căreia se obţine valoarea ce se
va înscrie în variabila noastră;
Variabilă – variabila a cărei valoare se înscrie şi în variabila Nume variabilă definită acum.
Exemple:
Nota = 10 – variabila Nota va stoca valoarea numerică 10;
Nume = ”Ionescu” - variabila Nume va stoca şirul de caractere ˝Ionescu˝
DataNasterii= #10/12/1977# - variabila va stoca data 10.12.1977

Semnul egal din aceste exemple este operator de atribuire şi nu operator de egalitate.
Când creem o variabilă, Visual Basic îi atribuie în mod implicit o valoare în funcţie de tipul
variabilei ; spunem că o iniţializează automat.
Adeseori, în cadrul unui program sunt necesare prelucrări asupra variabilelor care impun
conversia tipurilor acestora. Astfel, vom întâlni situaţii în care vom dori să atribuim unei
variabile de un anumit tip o valoare de alt tip, lucru care în mod normal nu este posibil. De aceea
va trebui să facem o conversie a valorii pe care dorim să o atribuim la tipul variabilei. În unele
cazuri Visual Basic execută în mod automat aceste conversii de date, dar bine este să realizăm
noi aceste conversii utilizând funcţiile de conversie.
Exemplu:
Când am lucrat cu controale de tip TextBox pentru a efectua şi a afişa diverse calcule am
utilizat funcţiile de conversie VAL şi STR:
Text1.text = Str(val(text2.text) +val(text3.text))

Variabilele în Visual Basic sunt deci caracterizate prin:


- nume
- tip de dată
- domeniu.
Numele trebuie să înceapă cu o literă şi să fie diferit de cuvintele rezervate ale limbajului.
Tipul indică modul în care respectivele valori sunt stocate în memorie (Boolean, Byte, Char,
String, Integer, Long, Single, Decimal, Date şi Object ). În reprezentarea internă datele au nişte
sufixe specifice tipului, ocupă o anumită dimensiune, au un anumit domeniu de valori.

În Visual Basic principalele tipuri de date sunt:


 Tipul Boolean memorează valori logice de tip adevărat sau fals, da, nu, pornit sau oprit.
Deci tipul Boolean are 2 valori – adevărat sau fals, nu are suffix şi ocupă 2 octeţi.Valoarea
implicită a unei astfel de variabile este false.
 Tipul Byte poate lua valori de la 0 la 255. El nu acceptă deci numere negative şi
acceptă toţi operatorii care lucrează cu numere întregi.
 Tipul Char ocupă 2 octeți și poate conține doar valori pozitive, de la 0 la 65535. Se
utilizează pentru a memora informații de tip caracter.
 Tipul Integer are sufixul procent %, ocupă 2 octeţi şi poate lua valori întregi cuprinse
în intervalul de la -32768 la 32767.
 Tipul Long are sufixul &, ocupă 4 octeţi şi poate lua valori întregi cuprinse în
intervalul - 2.147.483.648 şi 2.147.483.647.
 Tipul Single poate memora valori reale în simplă precizie.
 Tipul Double poate memora valori reale în dublă precizie.
 Tipul Decimal ocupă 16 octeţi şi poate lua valori reale cuprinse în intervalul -7.92*E la
puterea 28 până la 7.92*E la puterea 28. Practic el poate memora valori reale cu maxim 29
cifre pentru partea întreagă şi maxim 29 zecimale. Se recomandă pentru calcule monetare
de mare precizie.
 Tipul Date nu are suffix, ocupă 8 octeţi şi poate lua valori cuprinse între 1 ianuarie
1000 şi 31 decembrie 9999. El memorează practic o dată calendaristică sau o anumită oră,
exprimate într-o formă literală acceptată.
 Tipul String are sufixul $ şi ocupă numărul de octeţi precizat prin declaraţia de tip.
 Tipul de date Object reprezintă o variabilă care poate stoca o valoare sau poate apela
obiecte din cadrul aplicaţiei sau din alte aplicaţii. Este tipul implicit pentru orice variabilă
Visual Basic care nu a fost declarată (în mod explicit). Acesta este un tip special de date
care poate conţine atât valori numerice, şiruri de caractere, date calendaristice, precum şi
valorile speciale Nothing, VariantType.Empty și VariantType.Null.
o VariantType.Empty –o comparare a variabilei cu această valoare determină dacă
variabila a fost iniţializat cu orice valoare de la definirea sa originală.
o VariantType.Null –o comparare a variabilei cu această valoare dacă variabila are
o valoare Nulă. (cum ar fi o linie goală)
o Nothing reprezintă valoarea implicită a unui tip de date (de exemplu pentru
Integer, Nothing este 0).Poate fi, in acest caz echivalentul valorii Empty. Dacă
variabila este de tip pointer, Nothing indică faptul că variabila nu este asociată
niciunui obiect. În schimb, dacă variabila este de tip obiect, atunci indică faptul că
variabila nu mai referă nici o instanță. În ultimele două cazuri, Nothing este
echivalent cu Null

Visual Basic mai conţine şi alte tipuri de date, dar mai puţin utilizate.

Tipul de date al unei variabile se poate declara implicit sau explicit.


Pentru a declara în mod implicit tipul unei variabile se ataşează numelui acesteia un
caracter asociat tipului de date, acest caracter fiind numit sufix.

Observaţie:
Pentru a utiliza o dată, o variabilă de un anumit fel, ea trebuie declarată cu una dintre
instrucţiunile: PRIVAT, PUBLIC, DIM sau STATIC.
Visual Basic permite modificarea numărului de elemente al unei variabile de tip tablou cu
comanda: REDIM. Atenție, această comandă nu permite și modificarea numărului de
dimensiuni.

Prin urmare, în mod normal şi pentru a evita situţii imprevizibile, orice variabilă Visual Basic
trebuie declarată cu instrucţiunile DIM sau PRIVAT, PUBLIC, STATIC. După ce s-a făcut
declaraţia, acestei variabile i se poate atribui o valoare.
Asocierea unui obiect la variabila declarată se face apoi cu instrucţiunea:
variabilă = obiect.
La declararea variabilelor de tip obiect, trebuie folosite clasele specifice aşa cum sunt
enumerate ele în object browser şi nu cu titlul generic object.

Variabile de tip tablou (matrice)


Un tablou este o structură de date care poate să memoreze mai multe valori de acelaşi tip.
Tablourile trebuie concepute ca nişte colecţii de date care poartă acelaşi nume şi au acelaşi tip.
Dacă tabloul este de tip Object atunci elementele acestuia pot să conţină diferite tipuri de date
(numerice, şiruri de caractere, date calendaristice, obiecte).
În Visual Basic se pot utiliza două tipuri de tablouri:
- tablouri cu dimensiune fixă
- tablouri dinamice.
Tablourile cu dimensiune fixă sunt tablourile care au un număr fix de elemente componente.
Acesta este declarat de la început, astfel încât compilatorul îi alocă suficientă memorie pentru a
putea reţine toate elementele.
Matricea reprezintă o structură de date de tip tablou cu două dimensiuni, formată practic din
locaţii de memorie definite pentru a memora date de acelaşi tip.
Elementele tabloului se identifică printr-un nume (acelaşi nume) urmat de un indice care
precizează poziţia elementului în cadrul tabloului. Toate elementele dintr-o matrice au acelaşi
tip de date. Matricea poate fi de dimensiune fixă pe tot parcursul execuţiei programului, sau
matrice dinamică, a cărei dimensiune se poate modifica în timpul execuţiei programului.

Declararea unui tablou cu dimensiune fixă se poate face în două moduri:


a) prin specificarea numărului de elemente

Dim|Public|Private NumeTablou(NrElemente) As TipDată

Exemplu:
Dim Puncte(4) As Integer

Observaţie:
Când se declară un tablou primul element are numărul de ordine 0.

Putem atribui valori fiecărui element din tablou astfel:


Puncte(0)=270
Puncte(1)=250
Puncte(2)=289
Puncte(3)=275
Puncte(4)=300

b) prin specificarea marginilor (adică se specifică numărul primului şi ultimului element) cu


instrucţiunea:

Dim|Public|Private NumeTablou ( [NrPrimulElement To] NrUltimulElement ) As TipDată

Exemple:
Dim a( 0 To 10) As Double
Dim b (0 To 100) as Date
Observaţie:
Visual Basic 2008 nu permite modificarea limitei inferioare, aceasta fiind mereu 0. De aceea,
la declarare se poate omite specificarea limitei inferioare.

După locul unde e declarată, o matrice de dimensiune fixă poate fi:


- matrice publică, dacă e declarată cu instrucţiunea PUBLIC;
- matrice locală, dacă e declarată numai la nivelul modulului cu instrucţiunea PRIVATE.
Observaţie:
La declararea unei matrici trebuie declarată limita superioară a numărului de elemente. Un
caz particular al matricilor îl constituie matricile unidimensionale, numite şi vectori.
Matricea dinamică se declară cu instrucţiunea PUBLIC sau DIM şi de dimensiunea vidă.

Tablourile dinamice sunt tablourile care au un număr variabil de elemente. Există situaţii
când nu ştim de câte elemente avem nevoie în tabloul nostru. Şi pentru a nu aloca un spaţiu prea
mare sau prea mic de memorie, Visual Basic ne oferă posibilitatea să redimensionăm tabloul în
funcţie de necesităţi. Pentru a crea un tablou dinamic acesta trebuie declarat fără dimensiune:

Dim NumeTablou() As TipDată

Apoi, în funcţie de câte elemente avem nevoie le alocăm cu ajutorul instrucţiunii ReDim, a
cărui sintaxă este:

ReDim NumeTablou(NrElemente) sau

ReDim NumeTablou(NrPrimulElement To NrUltimulElement)

Instrucţiunea ReDim poate fi folosită numai în interiorul unei proceduri. Este utilă pentru a
modifica numărul de elemente maxime al unei dimensiuni a variabilei tablou, fără a putea
schimba numărul de dimensiuni sau tipul datei.

Exemplu:
Dim Salarii() As Integer

Şi apoi într-o procedură se alocă numărul de elemente:

Private Sub CalculareImpozit()


ReDim Salarii(0 To 10)
……………………………….
End Sub

În toate exemplele prezentate până acum, tablourile au constat într-un singur rând de date (o
singură dimensiune). Totuşi, limbajul Visual Basic acceptă tablouri bi-, tri şi multi-
dimensionale.
Exemplu:
Dim A(0 to 100,0 to 100) As Integer - defineşte o matrice (deci un tablou bidimensional) de
101 linii şi 101 coloane cu elemente întregi.

4.3.3. Tipuri de date definite de utilizator

Adeseori în practică apar situaţii când dorim ca o singură variabilă să stocheze mai multe
informaţii de tipuri diferite, dar aflate în strânsă legătură. Pentru aceaste cazuri Visual Basic ne
permite să creem tipuri de date definite de utilizator.
În aceste cazuri utilizatorul poate defini în cadrul modulului său şi tipuri de date proprii, deci
tipuri de date predefinite. Pentru aceasta, declaraţia de tip se face de către programatori în
secţiunea General Declaration a modulului de cod cu ajutorul instrucţiunii:
STRUCTURE ( nume_tip_nou )
Definire Variabile
END STRUCTURE
După definirea noului tip de date, se poate declara o variabilă de acest tip prin acelaşi
procedeu întâlnit şi la declaraţia variabilelor în tipurile prestabilite.
O variabilă nu poate avea decât o singură valoare la un moment dat, în momentul unei noi
atribuiri ea pierzând valoarea stocată anterior.

Aceste tipuri de date sunt compuse dintr-un număr de componente numite câmpuri. Spre
deosebire de tablouri, câmpurile pot conţine tipuri de date diferite. Fiecare câmp are deci un
nume (numit identificator de câmp) şi un anumit tip. Sintaxa unui tip definit de utilizator este
următoarea:

Private| Public Structure NumeTip


Private| Public| Dim Nume_câmp1 As TipDată
Private| Public| Dim Nume_câmp2 As TipDată
…………………………..
Private| Public| Dim Nume_câmp3 As TipDată
End Structure

Exemplu:
Private Structure InfoStudent
Public nume As String
Dim DataNaşterii As Date
Dim Sex As String
Private MediaAdmitere As Single
Private MediiSemestriale() As Integer
Dim Adresa As String
End Structure

În exemplul anterior am creat un tip de date definit de utilizator denumit InfoStudent. Putem
defini apoi variabile locale, la nivel de modul sau variabile globale de tipul respectiv.

Exemple:
Dim student As InfoStudent
Dim StudentiInformatica (70) As InfoStudent

Atribuirea sau recuperarea de valori stocate în câmpurile acestor variabile se face exact ca în
cazul proprietăţilor controalelor sau a formelor.
Exemple:
student.Nume = ”Munteanu Răzvan”
student.DataNasterii = #6/21/1990#

4.3.4.Date de tipul Enumerare

Tipul de date enumerare defineşte o mulţime ordonată de valori: se enumeră un şir de


identificatori care desemnează valorile posibile. În mod implicit primul element al enumerării
este iniţializat cu 0. Fiecare alt element desemnează succesorul valorii specificate de elementul
precedent. Identificatorii apar în ordinea crescătoare a valorii lor.
Sintaxa instrucţiunilor de declarare a unui tip enumerare este următoarea:

Private|Public Enum NumeEnumerare


Element1[=valoare]
Element2[=valoare]
……………………
Elementn[=valoare]
End Enum

Exemplu:
Private Enum ZileS
Luni = 0
Marţi
Miercuri
Joi
Vineri
Sâmbătă
Duminică
End Enum
Observaţie:
Declararea unui tip enumerare nu se face la nivel de procedură.

După ce am creat un tip enumere, ca şi în cazul tipurilor definite de utilizator, putem defini o
variabilă de tip enumerare. Această variabilă va putea să ia ca valoare doar elementele din
enumerare.
Exemplu:
Dim ZiSăptămână As ZileS
ZiSăptămână = ZileS.Miercuri

4.4. OPERATORI

Operatorii reprezintă comenzi speciale pentru operaţiile ce pot fi executate cu datele din
program. Visual Basic pune la dispoziţie 4 tipuri de operatori:

a). Operatori Aritmetici:


+ (adunare), - (scădere), * (înmulţire), / (împărţire), \ (împărţire întreagă) şi MOD (modulo).
\ împarte două numere, rezultatul fiind redat sub forma unui număr întreg;
MOD (modulo) împarte două numere şi reţine doar restul împărţirii.
Oper Semnific Observaţii
ator atie

^ Ridicare Rezultatul este Double sau Variant


a la putere (Double) cu excepţia: dacă un operand
este Nothing, rezultatul este tot Nothing.

* Înmulţirea Rezultatul este dat de cel "mai precis"


factor, ordinea crescătoare a "preciziei"
fiind, pentru înmulţire, Byte, Integer,
Long, Single, Double şi Decimal. Dacă o
expresie este Nothing, rezultatul este
Nothing. O expresie Nothing este
considerată ca 0.

/ Împărţirea Rezultatul este, în general, Double


sau Object (Double). Dacă o expresie
este Nothing, rezultatul este Nothing. O
expresie Nothing este considerată ca 0.

\ Împărţirea Înainte de împărţire, operanzii sunt


întreagă rotunjiţi la Byte, Integer sau Long.
Rezultatul este Byte, Object (Byte),
Integer, Variant (Integer), Long, sau
Variant (Long). Dacă o expresie este
Nothing, rezultatul este Nothing. O
expresie Nothing este considerată ca 0.

Mod Restul Operanzii sunt rotunjiţi la întregi şi se


împărţirii obţine restul împărţirii. Rezultatul este
Byte, Variant(Byte), Integer, Object
(Integer), Long sau Variant (Long). Dacă
o expresie este Nothing, rezultatul este
Nothing. O expresie Nothing e
considerată ca 0.

+ Adunarea În general, operanzii numerici produc


numerică adunarea, iar operanzii şiruri produc
sau concatenarea. În cazul numeric, rezultatul
concatenarea este de tipul cel "mai precis" al
sirurilor operanzilor, ordinea de "precizie" fiind
pentru adunare şi scădere: Byte, Integer,
Long, Single, Double, şi Decimal.

- Scăderea Operanzii pot fi doar numerici.


sau Rezultatul este de tipul cel "mai precis" al
inversarea operanzilor, ordinea de "precizie" fiind
semnului pentru adunare şi scădere: Byte, Integer,
Long, Single, Double şi Decimal. Dacă o
expresie este Nothing, rezultatul este
Nothing. O expresie Nothing este
considerată ca 0.

Observaţie:
Operaţiile ce se efectuează în cadrul expresiilor trebuie să aibă sens din punct de vedere
matematic. Exemplu, la împărţire numitorul să nu fie 0 (zero).

b). Operatori Logici: manipulează valorile True şi False:


- AND (conjuncţia logică) returnează valoarea True când toate variabilele din expresie
au valoarea true şi valoarea False dacă cel puţin una din variabile are valoarea false;
- OR (disjuncţia logică) returnează valoarea False dacă toate variabilele din expresie
au valoarea False şi valoarea logică True dacă cel puţin una din variabile are valoarea
de True;
- XOR (disjuncţia exclusivă) returnează valoarea True dacă toate variabilele au valori,
ori True ori False, dar numai una are valoarea True;
- NOT (negaţia logică) schimbă o valoare egală cu true în false şi invers;
- Echivalența Logică(=). Dacă o expresie este Nothing, rezultatul este Nothing.
Echivalența Logică realizează şi compararea bit cu bit a două expresii numerice,
poziţionând cifrele binare ale rezultatului după regulile de calcul ale echivalenţei
logice: 0 = 0 este 1 etc. Pentru compararea bit cu bit se foloseste Not(A XOr B), care
este egal cu A = B
- IMP Nu mai este utilizat in Visual Basic 2008. În schimb, și pentru comparația
logică și pentru cea la nivel de bit, putem folosi expresia (Not A) Or B(implicaţia
logică). True Imp Null este Null, False Imp * este True, Nothing Imp True este True,
Nothing Imp False (sau Nothing) este Nothing. Operatorul Imp realizează şi
compararea bit cu bit a două expresii numerice, poziţionând cifrele binare ale
rezultatului după regulile de calcul ale implicaţiei logice: 1 Imp 0 este 0, în rest
rezultatul este 1.

c). Operatori de comparare - compară două numere sau şiruri de caractere şi returnează
valoarea true sau false. Operatorii de comparare sunt cei uzuali: < (mai mic), <= (mai mic sau
egal), > (mai mare), >= (mai mare sau egal), = (egal), <> (diferit, neegal).
Rezultatul este True - dacă relaţia este adevarată, False - dacă relaţia este neadevărată şi
Nothing ( vbNull sau dbNull, in functie de caz. ) - dacă cel puţin un operand este Nothing(vbNull
sau dbNull).

Relaţiile care există între diferite tipuri de entităţi se pot evidenţia prin comparaţii având una
dintre formele următoare:
rezultat = expresie1 operator expresie2
rezultat = object1 Is object2
rezultat = string Like pattern
unde:
rezultat este o variabilă de tip logic
expresie este o expresie oarecare
operator este un operator relaţional
object1, object2 sunt nume de obiecte
string este o expresie de tip şir de caractere oarecare
pattern este o expresie String sau un domeniu de caractere.

Operatorul Is produce True dacă variabilele se referă la acelaşi obiect şi False în caz contrar.
Operatorul Like compară două şiruri cu observaţia că al doilea termen este un şablon. Prin
urmare rezultatul este True dacă primul şir operand este format după şablon, False în caz contrar.
Atunci când un operand este Nothing, rezultatul este tot Nothing.
Comportarea operatorului Like depinde de instrucţiunea Option Compare, care poate fi:
 Option Compare Binary, ordinea este cea a reprezentării interne binare,
determinată în Windows de codul de pagină.
 Option Compare Text, ordinea este determinată de setările locale ale sistemului.
Construcţia şablonului poate cuprinde caractere speciale, liste de caractere, domenii de
caractere, cu următoarea semnificaţie:
? semnifică un caracter oarecare pe poziţia pe care apare;
* orice caracter şi oricâte caractere se pot afla pe poziţia respectivă;
# o cifră oarecare (0–9).
[charlist] oricare dintre caracterele enumerate în listă, un domeniu de litere poate fi dat prin
utilizarea cratimei.
[!charlist] orice caracter care nu este în listă

d). Operatori de concatenare: +, & realizează concatenarea (alipirea) a două şiruri de


caractere.
În sintaxa:
expression1 & expression2
unde operanzii sunt expresii oarecare, rezultatul este:
 de tip String, dacă ambii operanzi sunt de tip String;
 de tip Variant (String) în celelalte cazuri;
 Nothing, dacă ambii operanzi sunt Nothing.
Înainte de concatenare, operanzii care nu sunt şiruri se convertesc la Variant (String).
Observaţie:
Expresiile Nothing sunt tratate ca şiruri de lungime zero ("").

4.5. OPERAŢIUNI DE INTRARE-IEŞIRE

În categoria operaţiunilor de intrare / ieşire (I/O) se înscriu următoarele:


a) schimbul de informaţii cu utilizatorul: acesta se poate desfăşura prin intermediul unor
casete de dialog predefinite (InputBox, MsgBox) sau prin intermediul unor controale
definite de dezvoltatorul proiectului VBA.
b) schimbul de informaţii cu fişiere şi/sau baze de date: acesta se realizează prin
intermediul unor instrucţiuni dedicate acestor operaţii.
4.5.1. Dialogul standard cu utilizatorul

Funcţia InputBox
Apelul funcţiei InputBox afişează o casetă de dialog care conţine un mesaj, două butoane
(OK şi Cancel) şi o zonă text în care se poate tasta un răspuns (de tip String, chiar dacă se
transmite o valoare numerică). Textul introdus este transmis ca valoare a funcţiei la acţionarea
butonului OK sau Enter, iar acţionarea butonului Cancel (ca şi închiderea dialogului ca fereastră)
transmite un şir de lungime zero, indiferent de valoarea zonei text.

Sintaxa funcţiei este:

InputBox(prompt[, title] [, default] [, xpos] [, ypos])


unde:
prompt este expresia String cu mesajul afişat în caseta de dialog (max.1024 caractere).
Mesajul poate fi aranjat pe mai multe linii prin combinaţii de caractere Chr(13) – carriage return,
Chr(10) – linefeed, Chr(13)&Chr(10) – CR+LF.
title este expresia de tip String cu titlul ferestrei dialogului. Dacă este omis se va folosi titlul
aplicaţiei.
default este expresia de tip String, opţională, conţinând textul afişat iniţial în zona text
rezervată utilizatorului. Textul este, în lipsa modificării lui, retransmis ca răspuns (acţionând
butonul OK).
xpos este expresia numerică specificând coordonata orizontală a colţului stânga sus al casetei.
În lipsa argumentului, caseta de dialog este centrată orizontal.
ypos este expresia numerică specificând coordonata verticală a colţului stânga sus al casetei.
În lipsa argumentului, caseta de dialog este poziţionată la aproximativ o treime de ecran.
Dacă valoarea funcţiei nu este atribuită (sau utilizată într-o alta expresie) este evident că se
pierde, fără semnalarea vreunei erori.

Funcţia MsgBox
Un dialog mai simplu decât InputBox este realizat prin forma predefinită afişată de funcţia
MsgBox. Se afişează un mesaj într-o casetă de dialog şi se asteaptă ca utilizatorul să acţioneze
unul dintre butoanele existente (numărul şi tipul lor este fixat la proiectarea aplicaţiei). Funcţia
returnează o valoare întreagă, indicând astfel care buton a fost acţionat. Sintaxa este:

MsgBox(prompt[, buttons] [, title])


unde:
prompt este textul mesajului (asemenea lui InputBox)
buttons este o expresie numerică egală cu suma valorilor care specifică numărul, tipul şi
atributele butoanelor. Aici se fixează şi modalitatea ferestrei (Vezi constantele predefinite din
tabelul care urmeaza). Valoarea implicită este 0.
title identice cu argumentele similare descrise la InputBox.
Constantele recomandate pentru formarea argumentului buttons sunt:
Constanta Valoar Descriere
e
OKOnly 0 Numai butonul OK
OKCancel 1 OK şi Cancel
AbortRetryIgnore 2 Abort, Retry şi Ignore
YesNoCancel 3 Yes, No şi Cancel
YesNo 4 Yes şi No
RetryCancel 5 Retry şi Cancel
Critical 16 Icoana de Critical Message
Question 32 Icoana de Warning Query
Exclamation 48 Icoana Warning Message
Information 64 Icoana de Information
Message
DefaultButton1 0 Primul buton este cel
implicit (echivalent cu Enter)
DefaultButton2 256 Al doilea buton este cel
implicit
DefaultButton3 512 Al treilea buton este cel
implicit
DefaultButton4 768 Al patrulea buton este cel
implicit
ApplicationModal 0 Application modal:
aplicaţia curentă este oprită
până când raspunde
utilizatorul
SystemModal 4096 System modal: toate
aplicaţiile sunt oprite până
când utilizatorul răspunde la
dialog

MsgBoxSetForeground 65536 Aduce fereastra in prim-


plan

MsgBoxRight 524288 Textul este aliniat la


dreapta

MsgBoxRtlReading 1048567 Textul va aparea de la


dreapta la stanga, conform
regulilor de citire ale
sistemelor evreiesti si arabe.

Pentru utilizarea constantelor in cadrul argumentului buttons, vor fi precedate de


MsgBoxStyle, de ex: MsgBoxStyle.YesNoCancel

Valorile 0-5 descriu butoanele, 16,32,48 şi 64 descriu stilul icoanei afişate, 0, 256 şi 512
determină butonul implicit, iar ultimul grup (0 şi 4096) determină modalitatea casetei de dialog.
La formarea argumentului Buttons se va aduna doar câte un număr din fiecare grup.
Butoanele pot fi: OK, Cancel, Abort, Retry, Ignore, Yes sau No.

Valorile returnate de funcţie şi care pot fi testate, în expresii logice, pentru a alege ramura de
prelucrare dorită de utilizator sunt:
Constanta Valoa Descri
re ere

OK 1 OK

Cancel 2 Cancel

Abort 3 Abort

Retry 4 Retry

Ignore 5 Ignore

Yes 6 Yes

No 7 No
Acţionarea tastei Esc este echivalentă cu acţionarea butonului Cancel (dacă acesta este
prezent). Dacă în dialog este prezent butonul Help, acţionarea lui nu termină dialogul.

4.5.2. Comanda DrawString


Puteţi afişa text în interiorul formelor și al controlerelor cu ajutorul metodei DrawString.
Metoda se accesează în cadrul unui obiect Graphics atașat formelor sau controllerelor.
Sintaxa este următoarea:
[obiect.]CreateGraphics.DrawString(”sir_caractere”,obiect Font, obiect Brush, x,
y[,StringFormat])

 obiectul Font definește un format particular pentru text, cum ar fi dimensiunea, familia
de fonturi, atribute de stil, etc. Cea mai simplă sintaxa pentru constructorul unui obiect
Font este:
Font(numele_fontului As String, dimensiunea As Single)
 Brush definește obiectele ce realizează umplerea formelor de tip grafic sau text. De
menționat, această clasa nu poate fi instanțiată, în schimb se pot crea instațe pe baza
claselor derivate SolidBrush, TextureBrush și LinearGradientBrush. Un exemplu de
instațiere este următorul:
Dim brush1 As New SolidBrush(Color.Blue)
 x și y sunt reprezintă coordonatele punctului extrem stanga-sus al șirului de caractere
afișat. În sintaxa, x și y se pot înlocui cu un obiect de tip Point sau RectangleF. Acestea
din urmă, trebuiesc declarate în prealabil utilizării.
Un obiect de tip Point are două proprietăți esențiale, X și Y.
Exemplu de utilizare:
Dim punct As Point‘ se declară o variabila de tip Point
punct.X=100 ‘ se inițializează proprietarea X cu 100
punct.Y=150 ‘ se inițializează proprietarea Y cu 150
În momentul în care este folosit în cadrul unor forme, controllere, obiecte de tip
Graphics, rolul instanței de tip Point va fi plasarea ”cursorului” la coordonatele (100,150)
Obiectul RectangleF reține patru valori: X -coordonata x a punctului de plecare,Y-
coordonata Y a punctului de plecare,Width -lățimea, Height -înălțimea;
 StringFormat încapsulează informații legate de formatarea șirului de caractere
(aliniamentul, orientarea, numărul de caractere dintr-un Tab, etc).

4.6. FUNCŢII ÎNCORPORATE ÎN VISUAL BASIC


Acestea pot fi grupate în mai multe categorii, astfel:
a). Funcţii matematice şi statistice:
Aceste functii trebuiesc precedate de clasa System.Math, de exemplu:
System.Math.Abs(-5) ’ returneaza valoarea 5
O altă soluție este importul clasei in prima linie din secțiunea (Declarations), cu comanda:
imports System.Math
caz in care, functiile se pot folosi ca atare in aplicatie
ABS( ) – determină o valoare absolută a expresiei numerice
EXP( ) – determină valoarea lui e, baza logaritmului natural
INT( ) – determină partea întreagă a numărului dat sau rezultat din evaluarea expresiei
LOG( ) – Determină logaritmul natural din valoarea argumentului.
RND( ) – Returneza o valoare dintr-o serie de numere aleatoare de tip Single. Pentru
aceeasi valoare seed va returna aceeasi serie de numere aleatoare.
SQRT( ) – determină rădăcina pătrată a numărului dat sau rezultat.
ATAN( ) – determină valoarea în radiani a arctg (N )
SIN( ) – Determină valoarea în radiani a sin (N)
COS( ) şi TAN( ) – determină după caz valoarea în radiani a cosinusului şi a tangentei.

b). Funcţii pentru şiruri de caractere:


Majoritatea funcțiilor de prelucrare a șirurilor de caractere trebuiesc precedate de clasa
Microsoft.VisualBasic, de exemplu:
Microsoft.VisualBasic.Len(”text de test”) ’ returneaza valoarea 12
O soluție alternativă este importul clasei in prima linie din secțiunea (Declarations), cu
comanda:
imports Microsoft.VisualBasic
caz in care, functiile se pot folosi ca atare in aplicatie

LCASE(şir) – transformă literele mici dintr-un şir în majuscule.


UCASE(şir) – realizează inversul instrucţiunii de mai sus.
LTRIM(şir) - elimină spaţiile de la începutul şirului.
RTRIM(şir) - elimină spaţiile de la sfârşitul şirului.
TRIM(şir) – elimină spaţiile de la începutul şi de la sfârşitul şirului.
CHR(şir) – returnează caracterul corespunzător codului din paranteză.
ASC(şir) – returnează codul caracterului prezent în paranteză.
LEN(şir) – returnează numărul de caractere al şirului specificat (lungimea şirului).
VAL(şir) – returnează valoarea numerică a şirului de caractere precizat sau rezultat din
evaluarea expresiei date.
StrREVERSE(şir) inversează ordinea caracterelor într-un şir;
LEFT(şir,Nrc) extrage din şirul de caractere specificat primele Nrc caractere din partea
stângă a şirului; se poate folosi si sub forma Microsoft.VisualBasic.Left(sir,Nrc)
RIGHT(şir,Nrc) extrage din şirul de caractere specificat primele Nrc caractere din
partea dreaptă a şirului;
MID(şir,Start [,Nrc]) extrage din şirul de caractere specificat primele Nrc caractere din
partea stângă a şirului începând cu poziţia precizată prin Start;
INSTR ([intStart, ] Şir, strCaută[, intCompară]) verifică dacă un caracter sau un şir
(strCaută) se găseşte în interiorul altui şir (Şir). În caz afirmativ funcţia returnează poziţia
primului caracter căutat în şirul Şir. Funcţia este deci un instrument de căutare a unui subşir
şi întoarce prima poziţie din şir corespunzătoare primului caracter din şirul dorit.

Exemplu:
Presupunem că variabila Nume conţine numele complet al unei persoane (nume şi prenume).
Dorim să extragem numele de familie. Vom proceda astfel:

strSpaţiu=˝ ˝
lngNrCaracter=InStr(Nume,strSpaţiu)
NumeFam=Microsoft.VisualBasic.Left(Nume,lngNrCaracter)

c). Funcţii de editare:


Format este una dintre cele mai puternice funcţii din Visual Basic care permite stabilirea
modului de reprezentare a şirurilor de caractere. Funcţia este folosită adeseori pentru a afişa
timpul şi data.
Sintaxa funcţiei este următoarea:

Format(Expresie[, Format_String[, PrimaZiaSapt[, PrimaSaptaAn ]]])


unde:
.
* Expresie este orice expresie care returnează un şir de caractere, o dată sau un număr
* Format_String est un şablon de şir care spune funcţiei cum dorim să apară şirul rezultat
* PrimaZiaSapt este o constantă opţională care stabileşte prima zi din săptămână. În mod
implicit prima este Sunday (Duminică), dar putem stabili ca ea să fie Monday (Luni) cu ajutorul
acestui parametru.
* În mod asemănător putem stabili prima săptămână a anului cu ajutorul parametrului
PrimaSaptaAn.
Valoarea returnată de funcţie este un Şir caractere.

Pentru a înţelege funcţia Format() trebuie să înţelegem parametrul Format_String. Acesta


spune valorii expresiei cum să apară ca şir. Valorile pe care parametrul Format_String le poate
lua sunt prezentate în tabelul de mai jos:
Format_Stri
Exemplu Rezultat
ng
Format(36000, „Long Friday, July 24,
„Long Date”
Date”) 1998
„Medium Format(36000, „Medium
24-Joule-98
Date” Date”)
„Short Format(36000, „Short
7/24/98
Date” Date”)
„Long Format(0.874, „Long
8:58:34 p.m.
Time” Time”)
„Medium Format(0.874, „Medium
08:58 p.m.
Time” Time”)
„Short Format(0.874, „Short
20:58
Time” Time”)

De asemenea putem folosi funcţia format pentru a stabili modul de afişare al valorilor
numerice.
Pe lângă şabloanele standard oferite de valorile predefinite ale parametrului Format_String
ne putem crea propriile şabloane în funcţie de necesităţi.

d). Funcţii financiare:


▪ DDB calculează şi returnează amortismentul unui bun pe parcursul unei perioade
specificate, urmând metoda amortismentului degresiv cu rată dublă sau după un coeficient
care trebuie specificat;
▪ FV calculează şi returnează valoarea viitoare a unei investiţii;
▪ IPMT calculează şi returnează suma dobânzilor unei investiţii pentru o perioadă dată;
▪ IRR calculează şi returnează rata de rentabilitate internă pentru fluxurile financiare
pozitive şi negative finanţate la rate diferite;
▪ MIRR calculează şi returnează rata de rentabilitate internă a unei investiţii fără a ţine
seama de costurile de finanţare şi de plusvalorile de reinvestire;
▪ NPER calculează şi returnează numărul de plăţi pentru o investiţie dată;
▪ NPV calculează şi returnează valoarea actuală netă a unei investiţii pe baza fluxurilor
financiare variabile;
▪ PMT calculează suma totală a fiecărei rambursări periodice a unei investiţii şi ratele
dobânzii constante;
▪ PPMT calculează partea vărsământului principal al unui împrumut pentru o perioadă
dată;
▪ PV calculează valoarea actuală a unei investiţii;
▪ RATE calculează rata dobânzii pe perioada unei investiţii date;
▪ SLN calculează amortismentul unui bun pentru o perioadă dată pe baza metodei
americane SUM-of-Years Digits.

e). Funcţii pentru conversia întregilor

Int() - Parte întreagă din argument


CInt() - Rotunjeşte valori fracţionare de .5 sau mai mult către următorul întreg.

f). Funcţii pentru conversia tipului de dată

CDbl(arg) - Converteşte argumentul la un echivalent în dublă precizie


CLng(arg) - Converteşte argumentul la un echivalent de tip Long Integer
CSng(arg) - Converteşte argumentul la un echivalent numeric în simplă precizie
CStr(arg) - Converteşte argumentul la un echivalent de tip String
CObj(arg) - Converteşte argumentul la un echivalent de tip Variant
CDec(arg) – Converteste argumentul la un echivalent de tip Decimal
g). Funcţii de verificare a tipului de dată

IsNumeric() - Determină dacă argumentul are o valoare care poate fi convertită într-un
număr valid.
IsDate() - Determină dacă argumentul poate fi convertit într-o dată validă.
isNullOrEmpty() – Determină dacă argumentul are o valoare nulă sau dacă a fost
inițializat cu orice valoare de la definirea sa originală. Este utilizabil doar pentru variabilele de
tip String.
isNothing() – Determină dacă argumentul are valoarea implicită a tipului de date (în cazul
tipurilor de date valoare) sau dacă argumentul nu are o instanță atribuită (în cazul tipurilor de
date obiect și pointer).
VarType() – Determină tipul argumentului. În tabelul următor se prezintă valorile
returnate de funcţia VarType
Tabel Valorile returnate de funcţia VarType()
Constanta Valoare Semnificaţie
vbEmpty 0 Neinițializată (default)
vbNull 1 Nu conține date valide
vbInteger 3 Tip Integer
vbSingle 4 Tip Single
vbDouble 5 Tip Double
vbDate 7 Tip Date
vbString 8 Tip String
vbObject 9 Object
vbError 10 Tip Error
vbBoolean 11 Tip Boolean
vbVariant 12 Variant
vbDataObject 13 Data access object
vbDecimal 14 Tip Decimal
vbByte 17 Tip Byte
vbLong 20 Tip Long
vbArray 8192-8207 Array. Variază în funcție de tipul de date al tabloului (ex.
Tablou de tip Integer returnează valoarea 8192 + 2 = 8194)
h). Funcţii pentru lucrul cu date calendaristice

DateDiff() - calculează intervalului de timp dintre două momente. Acest lucru se


realizează cu ajutorul funcţiei care are următoarea sintaxă:
DateDiff(Interval, DatăStart, DatăSfârşit [,PrimaZiaSapt [,PrimaSaptaAn]])
Interval este o variabilă de tip şir care defineşte intervalul de timp în care va fi măsurată
diferenţa.

Valorile pe care le poate lua variabila inteval.


Rezult
Valoare Interval Utilizare
at
DateDiff(„yyyy”, „7/4/76”,
„yyyy” An 10
„7/4/86”)
DateDiff(„q”, „7/4/76”,
„q” Trimestru 40
„7/4/86”)
DateDiff(„m”, „7/4/76”,
„m” Lună 120
„7/4/86”)
DateDiff(„y”, „7/4/76”,
„y” Zi din an 3652
„7/4/86”)
DateDiff(„d”, „7/4/76”,
„d” Zi 3652
„7/4/86”)
DateDiff(„w”, „7/4/76”,
„w” Zi din săpt. 521
„7/4/86”)
DateDiff(„ww”, „7/4/76”,
„ww” Săptămână 521
„7/4/86”)
DateDiff(„h”, „7/4/76”,
„h” Oră 87648
„7/4/86”)
DateDiff(„n”, „7/4/76”, 525888
„n” Minut
„7/4/86”) 0
„s” Secundă DateDiff(„s”, „7/4/76”, 315532
„7/4/86”) 800

IsDate (expresie) - verifică dacă o expresie şir de caractere sau de tip dată reprezintă o dată
calendaristică validă.
TimeOfDay() – serveşte pentru a obţine ora din sistem,
Today() – serveşte pentru a obţine data sistemului
Now() – serveşte pentru a le obţine pe amândouă (data şi ora).
CStr (TimeOfDay()) – transformă ora în şir de caractere;
CStr (Today()) – transformă data calendaristică în şir de caractere;
CStr (Now()) – transformă data şi ora în şir de caractere:

Am prezentat anterior funcţia Format care este folosită în primul rând pentru a afişa timpul
şi data.

i). Funcţii pentru lucrul cu fişiere

Seek(NumărFişier) returnează ca valoare poziţia curentă de citire/scriere în cadrul unui fişier


deschis cu instrucţiunea Open.
LOF(NumărFişier) returnează mărimea fişierului exprimată în octeţi.
EOF(NumărFişier) returneză valoarea logică True dacă s-a ajuns la sfârşitul unui fişier
deschis în mod aleatoriu sau secvenţial şi False în caz contrar.

4.7. FUNCŢII ŞI PROCEDURI UTILIZATOR ÎN VISUAL BASIC

O funcţie este un modul program care efectuează o anumită sarcină şi returnează o valoare
identificată prin numele funcţiei.
Exemplu:Valreturn = nume_funcţie([listă parametri)]
Pentru ca un program Visual Basic să fie mai uşor de scris, de modificat sau de înţeles,
trebuie împărţit în entităţi logice numite proceduri. O procedură este o secvenţă de instrucţiuni
executate ca un tot unitar sau partajabile.
O procedură poate fi folosită de mai multe ori în acelaşi program, accesarea sa fiind făcută
prin menţionarea numelui ei în codul programului la momentul potrivit. Există trei tipuri
proceduri:
- Sub – execută o anumită secvenţă de comenzi.
- Function
- Tip de proprietate
Sintaxa generală a unie proceduri este :
Private/Public/Static/Sub
………………………
End Sub.

O procedură eveniment devine activă atunci când e apelată de utilizator sau de program în
mod automat.
O procedură funcţie este o procedură care realizează o anumită funcţie şi returnează o
anumită valoare identificată prin numele funcţiei. Utilizatorul poate crea singur procedurile
folosind proprietatea FUNCTION.
Procedurile tip proprietate – pot returna şi atribui valori şi pot stabili referinţe la obiecte.
Conceperea şi apoi scrierea unui program trebuie realizată modular, prin împărţirea acestuia
în module (subprograme) relativ independente. De altfel realizarea unui program de mare
complexitate impune organizarea unor date şi a acţiunilor la care acestea trebuie spuse în
subprograme. În Visual Basic există un mecanism evoluat de declarare şi utilizare a
subprogramelor.
În Visual Basic subprogramele sunt de tipuri:
- proceduri
- funcţii.
Procedurile sunt blocuri de cod constituite din instrucţiuni, date locale şi alte subprograme.
Acestea pot fi utilizate în cadrul altor programe sau a altor subprograme pentru a îndeplini o
anumită sarcină.
În Visual Basic procedurile sunt două tipuri:
- proceduri generale
- proceduri eveniment.
Procedurile generale sunt blocuri de cod (instrucţiuni) prin care se transmite aplicaţiei cum
trebuie să îndeplinească o anumită sarcină. O dată creată, o procedură generală trebuie apelată în
mod explicit în cadrul aplicaţiei pentru a se executa codul (setul de instrucţiuni) pe care aceasta îl
conţine.
Procedurile eveniment sunt blocuri de cod (instrucţiuni) asociate diferitelor evenimente
recunoscute de un obiect (control sau formă) şi care se execută în momentul în care se produce
evenimentul respectiv.
De exemplu, cmdButton_Click() este procedura aferentă evenimentului Click de mouse al
butonului cmdButton. Aceasta îşi va începe execuţia în momentul în care utilizatorul va apăsa
butonul cmdButton.
Numele unei astfel de proceduri este format din numele obiectului aferent, caracterul _ şi
numele evenimentului ce-i declanşează execuţia.
Sintaxa definirii unei proceduri:
[Private|Public][Static] Sub NumeProcedură (listă_parametri_formali)
Instrucţiuni
End Sub

Observaţie:
O procedură eveniment poate fi definită doar Private.
Procedurile comunică date cu programul apelant cu ajutorul parametrilor.

O funcţie este asemănătoare cu o procedură, cu deosebirea că funcţia furnizează un rezultat


atribuit numelui de funcţie, acest lucru permiţând ca apelul ei să se facă chiar din expresia care
conţine valoarea calculată. Spre deosebire de proceduri, funcţiile au un anumit tip.
Sintaxa definirii unei funcţii:

[Private|Public][Static]Function NumeFuncţie (listă_parametri_formali) [As tip]


Instrucţiuni
End Function

Exemplu:
Să se scrie o funcţie care să calculeze aria unui cerc cu raza dată iRaza.
Private Function ArieCerc(iRaza As Integer)
ArieCerc=3.14*iRaza^2
End Function

Pe lângă funcţiile pe care le vom crea noi în cadrul aplicaţiilor, se pot utiliza o serie de funcţii
standard oferite de bibliotecile Visual Basic, cum sunt: funcţiile matematice, funcţiile de
prelucrare a şirurilor de caractere, funcţiile financiare, etc.

Utilizarea funcţiilor şi procedurilor în program

După ce am scris o funcţie sau o procedură, cu siguranţă că vom dori să o apelăm dintr-un
program sau un subprogram. Apelarea procedurilor diferă de apelarea funcţiilor. În timp ce
funcţiile returneză un rezultat şi pot fi apelate din cadrul unei expresii, apelurile de procedură
sunt instrucţiuni liniare de sine stătătoare.
Apelarea unei proceduri se poate face în două moduri, cu sintaxa:

NumeProcedură listă_parametri_actuali
sau
Call NumeProcedură(listă_parametri_actuali)
Exemplu:
Presupunând că există declarată o procedură care calculează suma a două numere cu numele
Adună, ea poate fi apelată astfel:

Adună x, y
sau
Call Adună(x,y)

Apelarea funcţiilor se poate face astfel:


Exemplu:

ArieParalelipiped=2* (Aria1(l,L)+ Aria2(l,h)+Aria3(L,h) )

Schimbul de date cu ajutorul parametrilor

De cele mai multe ori procedurile şi funcţiile trebuie să schimbe informaţii cu programele care
le apelează. Procedurile pot primi date de la programul apelant şi pot returna date programului
apelant prin intermediul parametrilor formali ai procedurii. Parametrii formali se caracterizează
prin:
- un parametru formal apare ca un identificator; acestuia i se asociază un tip de dată;
- parametrii formali declaraţi într-o procedură sunt cunoscuţi în întregul text al procedurii
şi necunoscuţi în afară;
- în cadrul procedurii parametrii formali se manifestă ca nişte variabile de tipul respectiv;
- dacă lista parametrilor formali este vidă, atunci nu există schimb de informaţii cu restul
programului sau acesta se realizează prin intermediul variabilelor globale.
În Visual Basic se pot defini mai multe tipuri de parametri formali:
- parametri transmişi prin valoare;
- parametri transmişi prin referinţă;
- parametri opţionali;
- listă cu număr nedefinit de parametri.
Elementele transmise ca parametru pot fi variabile sau invariabile. Pentru parametrii
invariabili nu se vor propaga modificările în blocul apelant, chiar dacă se specifică transmisia
prin referință. Adică, parametrii sunt preluați în procedura lansată, se pot modifica, dar acele
modificări sunt vizibile doar local (în procedura lansată cu acei parametrii) și dispar odată cu
încheierea procedurii. Tabelul următor prezintă elementele variabile și invariabile din Visual
Basic.

Elemente Variabile Elemente Invariabile


Variabile declarate, inclusiv Constantele
variabilele obiect
Proprietățile claselor Valorile literale explicite(ex: 3.14,
“VB.NET”, #21/10/2011# etc.)
Variabilele tablou Datele de tip Enumerare
Variabilele structură Expresiile

Parametri transmişi prin valoare sunt parametri impliciţi pe care îi foloseşte Visual Basic.
Pentru o mai bună lizibilitate a programului se poate folosi cuvântul cheie ByVal înaintea unui
parametru pe care dorim să-l transmitem prin valoare. Aceşti parametri pot fi modificaţi în
interiorul procedurii, dar valorile noi nu se transmit către blocul apelant, sunt doar parametri de
intrare.
Parametri transmişi prin referinţă sunt precedaţi de cuvântul cheie ByRef. Aceşti parametri
sunt elemente variabile. Ei pot fi modificaţi în interiorul procedurii, rezultatul răsfrângându-se și
asupra variabilelor din blocul apelant. Nu sunt transmişi prin valoare, ci se transmit prin adresa
lor.
O mențiune privind modul de transmisie a valorilor și performanța procedurilor: la
transmiterea prin referință se copiază doar un pointer de 4 bytes către variabilă sau către
începutul tabloului, structurii sau obiectului. În contrast, la transmiterea prin valoare, se copiază
întreg conținutul obiectului trimis ca parametru.
Modul de tratare a tipurilor de date atunci când sunt transmise ca argumente prin referință și
valoare este prezentat în următorul tabel:
Tipul de dată Argument ByVal Argument ByRef
Variabilă care Procedura nu poate Procedura poate
stochează o singură schimba variabila sau schimba variabila și
valoare oricare din membrii săi membrii săi
Variabilă de tip Procedura nu poate Procedura poate
referențial (conține un schimba variabila, dar schimba variabila și
pointer către o instanță poate schimba membrii membrii săi.
de clasă, un tablou sau instanței indicate de
un pointer către o pointer. Pentru o
instanță de tip structură. variabilă tablou(array),
poate fi modificată
valoarea elementelor
din tablou, dar nu se
modifică variabila
tablou, de exemplu,
prin redeclarare sau
atribuirea unui alt
tablou.

Parametrii opţionali sunt precedaţi de cuvântul cheie Optional. Dacă vom declara un
parametru opţional, atunci toţi parametri din sublista de parametri formali care urmează după
acel parametru trebuie să fie declaraţi ca opţionali. Dacă vom declara un parametru ca opţional în
momentul în care programul apelează procedura, nu este necesar să se transmită o valoare
parametrului declarat opţional.
Există situaţii în care nu se ştie exact numărul de parametri care se transmit procedurii.
Folosind cuvântul cheie ParamArray se pot transmite procedurii apelate un număr nedefinit de
parametri.

Ieşirea dintr-o procedură sau funcţie

Există situaţii în care procedurile şi funcţiile îşi îndeplinesc sarcina pe care o au fără să execute
toate instrucţiunile din corpul procedurii sau funcţiei respective. Pentru astfel de situaţii se pot
utiliza instrucţiunile Exit Sub şi Exit Function care determină terminarea forţată a execuţiei
procedurii sau funcţiei, chiar dacă nu s-a executat ultima linie de instrucţiune a acesteia.

4.8. INSTRUCŢIUNI DE ATRIBUIRE


Atribuirea unei valori la o variabilă de memorie se poate efectua prin instrucţiunile:
Let - pentru valori atribuite variabilelor şi proprietăţilor;
Set - pentru atribuirea de obiecte la o variabilă de tip obiect;
Lset şi Rset - pentru atribuiri speciale de şiruri.

Instrucţiunea Let
Atribuie valoarea rezultată din evaluarea unei expresii la o variabilă sau proprietate.
Instrucţiunea are sintaxa:

[Let] numevar = expresie

unde:
numevar este numele variabilei sau al proprietăţii căreia i se atribuie o valoare.
expresie este expresia din evaluarea căreia rezultă valoarea ce se va atribui variabilei
precizate (în partea stângă a semnului =).

Se observă că Let este opţional, deci poate lipsi din comandă. De fapt instrucţiunea de
atribuire se foloseşte aşa în cele mai multe cazuri.
Observaţie.
Valoarea expresiei trebuie să fie compatibilă ca tip cu variabila (sau proprietatea): valori
numerice nu pot fi atribuite variabilelor de tip String şi nici invers.
Variabilele Object pot primi valori numerice sau String, reciproc nu este valabil decât dacă
valoarea expresiei Object poate fi interpretată compatibilă cu tipul variabilei. Astfel, orice Object
poate fi atribuit unei variabile de tip String (cu excepţia Null). Doar Variant care poate fi
interpretat numeric poate fi atribuit unei variabile de tip numeric.

La atribuirea valorilor numerice pot avea loc conversii la tipul numeric al variabilei.
Atribuirea valorilor de tip utilizator poate fi efectuată doar dacă ambii termeni au acelaşi tip
definit.
Observaţie:
Pentru legarea de obiecte la variabile obiect nu se poate utiliza instrucţiunea de atribuire Let
(cu sau fără cuvântul Let), ci se va utiliza instrucţiunea Set.

Instrucţiunea LSet
Copiază, cu aliniere la stânga, şirul de caractere specificat ca atare sau valoarea expresiei din
dreapta într-o variabilă de tip String specificată în stânga semnului =. Deoarece copierea este
binară, poate fi utilizată pentru atribuiri între tipuri utilizator diferite (rezultatul este imprevizibil
deoarece nu se face nici o verificare de tipuri/componente ale valorilor de tip record).
Sintaxa este:
varstring = LSet(string, dimensiune_sir_dorita)
unde:
varstring şi string reprezintă variabila de tip String şi respectiv expresia de acelaşi tip
implicate într-o atribuire de valori de tip string.
Conţinutul zonei de memorie alocată celei de a doua variabile este copiată, cu aliniere la
stânga, în zona de memorie a primei variabile.
La atribuire se respectă regulile cunoscute pentru transferul datelor în alte limbaje de
programare, cum sunt: caracterele care rămân neocupate se completează cu spaţii, iar dacă zona
sursă (de unde se copiază) este mai mare, caracterele din dreapta se pierd (datele sunt trunchiate).

Instrucţiunea RSet
Copiază, cu aliniere la dreapta, şirul de caractere specificat ca atare sau valoarea expresiei din
dreapta într-o variabilă de tip String specificată în partea stângă a semnului =.
Sintaxa comenzii este:

varstring = RSet(string, dimensiune_sir_dorita)unde:


varstring este variabila destinaţie de tip String .
Caracterele rămase neocupate în variabila destinaţie sunt completate cu spaţii. Instrucţiunea
RSet nu se poate utiliza (analog lui LSet) pentru tipuri definite de utilizator.

4.9. INSTRUCŢIUNI DE TERMINARE SAU OPRIRE A PROGRAMULUI

Terminarea execuţiei unui program sau oprirea temporară a acestuia (pauza) se pot realiza
prin instrucţiunile: DoEvents, End, Exit, Stop.

Procedura DoEvents
Deşi nu este practic o instrucţiune Visual Basic ci o procedură, includerea ei este naturală
prin aceea că permite cedarea controlului către sistemul de operare, care poate astfel sa
funcţioneze în regim de multitasking. Acţiunea poate fi realizată şi prin alte tehnici (de exemplu
utilizarea unui Timer etc.). Sintaxa este:
DoEvents( )
Controlul este redat programului după ce sistemul de operare a terminat procesarea
evenimentelor din coada de evenimente, ca şi procesarea tuturor caracterelor din coada
SendKeys.

Instrucţiunea End
Această instrucţiune termină execuţia unei proceduri sau indică sfârşitul codului unei
structuri de tip bloc (cum ar fi End Function, End If etc., prezentate la structurile respective).
În cazul opririi execuţiei unei proceduri sintaxa instrucţiunii este:
End
Prin aceasta instrucţiune, care poate fi plasată oriunde în program, execuţia este terminată
imediat, fără a se mai executa eventualele instrucţiuni scrise pentru tratarea unor evenimente
specifice sfârşitului de program (Dispose, Finalize etc.).
Fişierele deschise prin Open sunt închise şi toate variabilele sunt eliberate. Obiectele create
din modulele clasa sunt şterse, iar referinţele din alte aplicaţii la asemenea obiecte sunt
invalidate. Memoria este astfel eliberată.

Instrucţiunea Exit
Instrucţiunea Exit, în una din multiplele sale formate, întrerupe forţat o ramură de execuţie
(cum ar fi o procedură, o funcţie, o structură iterativă etc.) pentru a se continua nivelul apelant.
Sintaxa instrucţiunii este:
Exit Do
Exit For
Exit Function
Exit Property
Exit Sub
Aşa cum se poate observa, efectele comenzii se referă la o structură repetitivă de tip Do, la o
structură alternativă de tip For, la o procedură de tip funcţie, subrutină sau tip de proprietate.
Instrucţiunea Exit nu trebuie confundată cu instrucţiunea End.

Instrucţiunea Stop
Efectul acestei instrucţiuni depinde de modul de execuţie a programului. Dacă se execută un
fişier.exe (varianta compilată a programului) atunci instrucţiunea este similară instrucţiunii End
şi deci va suspenda execuţia şi va închide fişierele deschise. Dacă însă execuţia este din mediul
VBA, atunci se suspendă doar execuţia programului, dar nu se închid fişierele deschise şi nu se
şterge valoarea variabilelor. Execuţia poate fi reluată în acest caz din punctul de suspendare.
Instrucţiunea este similară introducerii unui punct de oprire (Breakpoint) în codul sursă.

4.10. COMENZI PENTRU STRUCTURILE DE CONTROL ALE PROGRAMELOR

Se ştie că în cadrul algoritmilor de rezolvare a problemelor se întâlnesc, în afara unor


secvenţe de operaţii care se execută liniar, în mod necondiţionat, o serie de operaţii care necesită
testarea unor condiţii, funcţie de care se execută o succesiune de operaţii sau alta, sau o serie de
operaţii care se execută în mod repetat. Avem de a face cu cele trei tipuri de structuri
fundamentale:
- structura secvenţială sau liniară;
- structura alternativă sau de decizie;
- structura repetitivă.

Limbajul de programare Visual Basic implementează ultimele două structuri de control ale
programului, prin comenzi corespunzătoare deci :
 Comenzi pentru structuri alternative (de decizie);
 Comenzi pentru structuri repetitive (tip buclă).

4.10.1. Structura secvenţială sau liniară

Se utilizează în cazul secvenţelor de operaţii primare: intrare, ieşire, transfer, calcule


aritmetice sau pe şiruri de caractere, aflate într-o succesiune logică. Acestea se concretizează
practic prin două tipuri de comenzi:
- instrucţiunea de atribuire
- instrucţiunea de apel procedură

Instrucţiunea cea mai importantă şi cea mai frecventă a limbajului este instrucţiunea de
atribuire, având forma:
variabilă = expresie
sau
Set variabilă = obiect
sau
Nume_de_funcţie = expresie

Instrucţiunea de atribuire specifică faptul că unei variabile sau unei fucţii îi este atribuită o
nouă valoare, care este specificată printr-o expresie sau printr-un obiect. O expresie constă dintr-
o secvenţă formată din operanzi (variabile, constante, etc.) şi operatori (simboluri operaţionale).
Instrucţiunea de apel procedură specifică activarea (apelul) procedurii al cărui nume apare
în instrucţiune şi are forma:
nume_de_procedură( listă_parametri_actuali)
sau
Call nume_de_procedură(listă_parametri_actuali)

4.10.2. Structuri alternative

Ramificarea firului de execuţie a programului în funcţie de rezultatul verificării unei condiţii


este o necesitate frecventă în orice limbaj de programare.
Structura alternativă (de ramificare) a apărut din necesitatea ocolirii unor secvenţe de
instrucţiuni din cadrul unui program. Structura alternativă poate fi întâlnită sub diverse forme:
- structură alternativă cu două ramuri (simplă);
- structură alternativă cu ramură vidă (pseudoalternativă);
- structură alternativă cu mai multe ramuri (compusă/imbricată);
- structură alternativă generalizată.
În Visual Basic structurile alternative sau de decizie sunt implementate prin comenzi
asemănătoare altor limbaje de programare de nivel înalt, cum sunt: Pascal, C, Cobol, şi
anume:
 If ....Then
 If ....Then ....Else
 Select Case
Comanda If ....Then determină execuţia condiţionată a uneia sau mai multor instrucţiuni.
Sintaxa generală a comenzii este:
If condiţie Then
instrucţiuni
End If
Practic, se evaluează condiţia: dacă este adevărată se execută setul de instrucţiuni care
urmează după Then, altfel nu se execută nimic din corpul instrucţiunii şi se trece mai departe,
după End If. Acest format al instrucţiunii If precizează ce se execută doar dacă este îndeplinită
condiţia specificată.
Observaţie:
La utilizarea acestui format, (fără clauza Else) se pot scrie mai multe instrucţiuni pe aceeaşi
linie, separate de caracterul ":".

Exemplu:
If a>0 Then
B=a+6
End If

Comanda If....Then....Else precizează ce secvenţe de instrucţiuni se execută pentru ambele


cazuri: dacă este îndeplinită şi dacă nu este îndeplinită condiţia specificată. O asemenea
structură, întâlnită de altfel în toate limbajele de programare, execută un grup de instrucţiuni ca
răspuns la îndeplinirea unei condiţii (compusă sau nu din mai multe condiţii testate secvenţial).
Sintaxa permite o mare varietate de forme:

Sintaxa generală a comenzii este:


If condiţie1 Then
instrucţiuni1
Else
instrucţiuni2
.......................
EndIf

unde:
- condiţie1 are una din formele:
- expresie numerică sau şir care se poate evalua True sau False (Null este interpretat
False);
- expresie de forma TypeOf objectname Is objecttype, evaluata True dacă objectname este
de tipul obiect specificat în objecttype.
- Instrucţiuni1 reprezintă blocurile de instrucţiuni executate atunci când condiţia este True.
- Instrucţiuni2 reprezintă blocurile de instrucţiuni executate atunci când condiţia este
False.

Practic, se evaluează condiţia:


- dacă este adevărată se execută setul de instrucţiuni1 care urmează după Then până la Else
şi apoi se trece la prima instrucţiune de după End If.
- dacă nu este adevărată se execută setul de instrucţiuni care urmează după Else până la
End If, după care se trece la prima instrucţiune de după End If.

Exemplu:
If a>0 Then
B=a+6
Else: B=a-6
C=a+1
End If

Observaţie:
Sunt acceptate structuri IF imbricate, adică structuri IF cuprinse în alte structuri IF, cu
condiţia ca acestea să fie corect utilizate.

Instrucţiunea Select Case se poate utiliza în locul unor instructiuni If Then ElseIf multiple
atunci când se compară aceeaşi expresie cu mai multe valori, diferite între ele. Instrucţiunea
Select Case furnizează, prin urmare un sistem de luare a deciziilor similar instrucţiunii
If…Then…ElseIf. Totuşi, Select Case produce un cod mai eficient şi mai inteligibil.

Sintaxa instrucţiunii Select Case este:

Select Case testexpression


[Case expressionlist-n
[statements-n]] ...
[Case Else
[elsestatements]]
End Select
unde
- testexpression este o expresie numerică sau şir.
- expressionlist-n este lista, separată prin virgule, a uneia sau mai multe expresii de forma:
 expression.
 expression To expression. Cuvântul To introduce un interval de valori, valoarea
minimă fiind prima specificată.
 Is comparisonoperator expression. Se va utiliza Is cu operatori de comparare
(exceptând Is şi Like) pentru a specifica un domeniu de valori.
- statements-n reprezintă una sau mai multe instrucţiuni care se vor executa dacă
testexpression este egală cu un element din expressionlist-n.
- elsestatements reprezintă una sau mai multe instrucţiuni care se vor executa dacă
testexpression nu este egală cu nici un element din listele liniilor Case.
Dacă testexpression se potriveşte cu un element dintr-o listă Case, se vor executa
instrucţiunile care urmează această clauză Case până la următoarea clauză Case, sau până la End
Select. Controlul execuţiei trece apoi la instrucţiunea care urmează liniei finale End Select.
Rezultă că dacă testexpression se regăseşte în mai multe liste, doar prima potrivire este
considerată.
Clauza Case Else are semnificaţia uzuală "altfel, în rest, în caz contrar etc.", adică introduce
instrucţiunile care se execută atunci când expresia de test nu se potriveşte nici unui element din
listele clauzelor Else. Dacă aceasta este situaţia şi nu este specificată o clauză Case Else, atunci
execuţia urmează cu prima instrucţiune de după End Select.
Instrucţiunile Select Case pot fi incluse unele în altele, structurile interioare fiind complete
(dacă fiecare structura are End Select propriu, includerea este completă).

Pe lângă structurile prezentate, se pot utiliza trei funcţii care realizează alegeri în mod
liniarizat (pe o linie de cod): Choose(), Iif(), Switch().

4.10.3. Structuri repetitive

Atunci când dorim execuţia repetată a unei sevenţe de instrucţiuni în cadrul unui program,
este posibil ca acest lucru să fie cerut fără a cunoaşte numărul de repetări, sau, dimpotrivă,
cunoscând acest număr.
Visual Basic suportă astfel două tipuri de structuri repetitive:
 structuri repetitive cu contor descrise de instrucţiunile For …Next şi
For…Each…Next care execută acelaşi lucru de un număr stabilit de ori ;
 structuri repetitive cu condiţie descrise de diferitele variante ale instrucţiunii
Do…Loop ce îndeplinesc aceeaşi sarcină atâta timp cât o condiţie există sau până
când nu mai există o condiţie.
În cazul unui număr nedefinit de repetiţii, condiţia de oprire poate fi testată la începutul sau
la sfârşitul ciclului, prin alegerea structurii adecvate.
Limbajul Visual Basic ne pune la dispoziţie o varietate de comenzi şi forme ale acestora, prin
care să putem solicita oricare dintre aceste cicluri:
- cu număr nedefinit de reluări şi, în acest caz cu testarea condiţiei de reluare fie la
începutul ciclului, fie la sfârşitul acestuia;
- cu număr cunoscut de reluări, deci cu numărător.
Comenzile repetitive sau de tip buclă permit executarea în mod repetat a unei instrucţiuni sau
a unei secvenţe de instrucţiuni atâta timp cât o condiţie este adevărată sau până când o condiţie
este adevărată. Acestea sunt:
- While.....Wend;
- Do .....Loop;
- For.....Next;
- For Each....Next.
Diferitele variante posibile pentru Do…Loop diferă după momentul evaluării condiţiei şi
decizia luată.
Comanda While...End While are sintaxa:
While condiţie
Instrucţiuni
End While
Această comandă execută repetat una sau mai multe instrucţiuni atâta timp cât o condiţia
specificată este adevărată.
Comanda Do...Loop execută o secvenţă de instrucţiuni de un număr necunoscut de ori, atâta
timp cât condiţia este adevărată.
Sintaxa comenzii este:
Do While condiţie
instrucţiuni
Loop
Do...Loop testează întâi condiţia: dacă aceasta are valoarea true (este adevărată) se execută
secvenţa de instrucţiuni specificată până la Loop, altfel nu se execută nimic şi se trece la prima
instrucţiune de după Loop.
Avem de a face deci cu o structură repetitivă condiţionată anterior.
Comanda Do...Loop mai are şi o altă variantă, care execută secvenţa de instrucţiuni cât timp
condiţia este falsă (până când aceasta devine adevărată):
Do Until condiţie
instrucţiuni
Loop
O altă variantă a acestei comenzi este cea în care mai întâi se execută secvenţa de instrucţiuni
şi apoi testează condiţia, deci este o structură repetitivă condiţionată posterior.
Sintaxa instrucţiunii în acest caz va fi:
Do
instrucţiuni
Loop While condiţie
Instrucţiunile se repetă atâta timp cât condiţia este adevărată.
Dacă se doreşte repetarea instrucţiunilor cât timp condiţia este falsă se va folosi sintaxa:
Do
instrucţiuni
Loop Until condiţie

Observaţie:
O condiţie care este Null se consideră False.
Se poate abandona ciclarea oriunde în corpul structurii prin utilizarea comenzii Exit Do.
Dacă apare o comandă Exit Do se poate omite chiar şi condiţia din enunţ întrucât execuţia se va
termina prin această decizie.
Structurile Do pot fi inserate (dar complet incluse) unele în altele. O terminare (prin orice
metodă) a unei bucle transferă controlul la nivelul Do imediat superior.

Execuţia structurilor DO este explicată în tabelul următor:


Do While Testează condiţia la începutul buclei, execută
… bucla numai dacă rezultatul este True şi continuă
Loop astfel până când o nouă evaluare produce False.

Do Until Testează condiţia la începutul buclei, execută


… bucla numai dacă rezultatul este False şi continuă
Loop astfel până când o noua evaluare produce True.
Do Se execută întotdeauna bucla o dată, se
… testează condiţia la sfârşitul buclei şi se repetă
Loop While bucla atât timp cât condiţia este True. Oprirea
este pe condiţie falsă.

Do Se execută întotdeauna bucla o dată, se


… testează condiţia la sfârşitul buclei şi se repeta
Loop Until bucla atât timp cât condiţia este False. Oprirea
este pe condiţie adevărată.

Pentru realizarea unei structuri repetitive cu numărător se poate utiliza instrucţiunea


For...Next . Aceasta execută o secvenţă de instrucţiuni de un număr de ori precizat. Pentru
aceasta comanda For...Next foloseşte un contor.
Sintaxa generală a acestei comenzi este:
For contor=început To sfârşit [Step pas]
instrucţiuni
Next [contor]
unde:
contor - este variabila contor (care numără repetările), de tip numeric.Nu poate fi de tip
Boolean sau element de tablou.
început - este valoarea iniţială a contorului.
sfârşit - este valoarea finală a contorului.
pas - este cantitatea care se adună la contor la fiecare reluare. În cazul în care nu se specifica
este implicit 1. Poate fi şi negativă.
instrucţiuni - sunt instrucţiunile care se repetă. Dacă nu se specifică, atunci singura acţiune
este cea de modificare a contorului de un număr specificat de ori.
Valorile început, sfârşit şi pas trebuie să fie numerice. Pas reprezintă valoarea care se adaugă
la valoarea iniţială a variabilei contor sau care se scade din aceasta, după fiecare execuţie a
ciclului, după cum pas este pozitiv sau negativ. Dacă Step lipseşte valoarea implicită a pasului de
ciclare este 1.

Practic, instrucţiunea funcţionează astfel:


- Se iniţializează contor cu valoarea inceput şi se verifică dacă aceasta este mai mică sau
egală cu valoarea de sfârşit. Dacă nu este, atunci nu se execută nimic şi se trece la prima
instrucţiune de după Next. Dacă este îndeplinită condiţia de mai sus, atunci se execută o
dată setul de instrucţiuni scris până la Next.
- Se incrementează (creşte) valoarea contorului de numărare contor cu pasul precizat prin
pas sau, în lipsa acestuia cu 1.
- Se trece din nou la For (la începutul ciclului) pentru a verifica din nou contorul. Dacă
acesta a ajuns la valoarea de sfârşit se termină execuţia ciclului, altfel aceasta continuă în
acelaşi mod.

Specificarea numelui contorului în linia Next poate clarifica textul sursă, mai ales în cazul
când exista structuri For…Next îmbricate.
Observaţie:
Corpul unei bucle For…Next poate include (complet) o altă structură For…Next. În
asemenea situaţii, structurile imbricate trebuie să aibă variabile contor diferite.
Instrucţiunile Exit For pot fi plasate oriunde în corpul unei bucle şi provoacă abandonarea
ciclării. Controlul execuţiei se transferă la prima instrucţiune de după linia Next.

Comanda For Each...Next repetă o secvenţă de instrucţiuni pentru fiecare element dintr-o
colecţie de obiecte sau din cadrul unui tablou (matrici). Sintaxa generală este:
For Each element In grup
instrucţiuni
Next element
unde:
- element - este variabila utilizată pentru parcurgerea elementelor. Dacă se parcurge o
colecţie de obiecte, atunci element poate fi Variant, o variabilă generică de tip Object sau o
variabilă obiect specifică pentru biblioteca de obiecte referită (un obiect enumerat în utilitarul
Object Browser). Pentru parcurgerea unui tablou, element poate fi doar o variabilă de tip Variant.
- group - este numele colectiei de obiecte sau al tabloului
- instrucţiuni - este grupul de istrucţiuni executate pentru fiecare element Instrucţiunea este
utilă atunci când nu se cunoaşte numărul de elemente sau dacă se modifică, în timpul execuţiei,
conţinutul colecţiei.

Execuţia unei structuri For Each…Next :


1. Se defineşte element ca numind primul element din grup (dacă nu există nici un element,
se transferă controlul la prima instrucţiune de după Next – se părăseşte bucla fără executarea
instrucţiunilor).
2. Se execută instrucţiunile din corpul buclei For.
3. Se testează dacă element este ultimul element din grup. Dacă răspunsul este afirmativ, se
părăseşte bucla.
4. Se defineşte element ca numind următorul element din grup.
5. Se repetă paşii 2 până la 4.
Observaţie:
Pot fi utilizate instrucţiunile Exit For pentru ieşirea forţată din ciclu.
Buclele ForEach...Next pot fi imbricate cu condiţia ca elementele utilizate la iterare să fie
diferite.
Pentru ştergerea tuturor obiectelor dintr-o colecţie se va utiliza For…Next şi nu For
Each…Next. Se va utiliza ca număr de obiecte colectie.Count.

Programarea orientată pe obiecte produce, datorită calificărilor succesive, construcţii foarte


complexe atunci când se numesc proprietăţile unui obiect. În cazul modificărilor succesive ale
mai multor proprietăţi ale aceluiaşi obiect, repetarea zonei de calificare poate produce erori de
scriere şi conduce la un text greu de citit.
În acest caz codul este simplificat prin utilizarea structurii With…End With.
O asemenea structură execută o serie de instrucţiuni pentru un obiect sau pentru o variabilă
de tip utilizator.
Sintaxa este:
With object
[instrucţiuni]
End With
unde:
- object - este numele unui obiect sau a unui tip definit de utilizator;
- instrucţiuni - sunt instrucţiunile care se execută pentru entitatea precizată.
Permiţând omiterea calificărilor din referinţele la obiectul precizat, orice construcţie de tipul
".nume" este interpretată în instrucţiunile structurii drept "object.nume".

Observaţii:
Într-un bloc With nu se poate schimba obiectul procesat.
La plasarea unui bloc With în interiorul altui bloc With, obiectul extern este mascat complet,
deci calificările eventuale la acest obiect vor fi efectuate.
Nu se recomandă saltul în şi dintr-un bloc With.

4.11. COMENZI PENTRU LUCRUL CU FIŞIERE

Fişierele conţin colecţii de date omogene ca natură şi criterii de prelucrare, memorate pe


discul magnetic. Fişierele stochează pentru folosire ulterioară date numerice, texte, imagini, etc.
Fişierele reprezintă principala formă de organizare a datelor pe disc. Atât programele scrise de
noi, scrise într-un limbaj de programare dorit, cât şi colecţiile de date necesare funcţionării
acestor programe sunt exemple de fişiere.
Accesul la datele unui fişier poate fi:
- Binary - caz în care programatorul trebuie să localizeze în fişier numărul de caractere ce
urmează a fi citite sau scrise – un mod de acces mai puţin utilizat.
- Secvenţial - situaţie în care pentru a ajunge la o anumită înregistrare din fişier, trebuie
parcurse una după alta toate înregistrările fişierului (până când se ajunge la cea dorită);
- Aleator – când e permis un acces direct la înregistrarea căutată, fără a fi necesară citirea
înregistrărilor precedente.

4.11.1. Deschiderea fişierului

Deschiderea fişierului – este o operaţie care trebuie executată înainte de orice prelucrare a
acestuia. Pentru operaţii de intrare sau ieşire, orice fişier trebuie deschis cu comanda FileOpen.
Sintaxa comenzii se prezintă astfel:

FileOpen ( numar_fişier As Integer, nume_fisier As String, mod_de_deschidere As OpenMode


[, acces As OpenAccess, blocare AsOpenShare, lung_inreg As RecordLength ] )

unde:
- nume fişier – este o expresie de tip şir de caractere (String) care specifică numele fişierului.
Acesta poate include întreaga cale: unitate de disc, director etc;
- mod de deschidere – specifică modul de deschidere a fişierului prin unul din următoarele
cuvinte cheie: Append (adăugare), Binary (binar), Input (citire), Output (scriere) sau Random
(aleator); Dacă lipseşte, instrucţiunea Open deschide fişierul în modul de acces Random.
- acces – specifică operaţiile permise asupra fişierului prin unul dintre următoarele cuvinte
cheie: Read (citire), Write (scriere) sau ReadWrite (citire-scriere);
- blocare – specifică operaţiile permise la deschiderea fişierului de către un alt proces prin unul
dintre următoarele cuvinte cheie: Shared (partajat), Lock Read (citire interzisă), Lock Write
(scriere interzisă), lock Read Write.
- numărFişier – un număr valid de fişier, cuprins între 1şi 511 inclusiv. Utilizând funcţia
FreeFile se poate obţine următorul număr disponibil.
- LungÎnreg- un număr mai mic sau egal cu 32767 (octeţi). Pentru fişierele deschise în acces
aleator această valoare este mărimea înregistrării. Pentru fişierele text reprezintă numărul de
caractere transferate în buffer.

Observaţie:
Instrucţiunea FileOpen alocă o memorie tampon pentru operaţiile de intrare/ieşire (I/O)
asupra fişierului şi determină modul de accces pentru memoria tampon.
Dacă fişierul specificat cu nume fişier nu există, atunci acesta va fi creat, dacă la mod de
deschidere s-a specificat Append, Binary, Output sau Random

În legătură cu aceste moduri de deschidere trebuie să reţinem următoarele:


- Append – permite adăugarea de noi înregistrări în fişierul cu numele specificat sau crearea
acestuia, dacă el nu există. Practic cursorul se plasează după ultimul caracter dacă este un
fişier cu acces secvenţial sau după ultima înregistrare dacă e vorba de un fişier proiectat
pentru acces aleator.
- Binary – permite scrierea sau citirea în valori numerice. De exemplu, dacă se deschide în
modul de acces Binary un fişier .bmp (imagine grafică), atunci ca efect se generează o
reprezentare numerică a imaginii din fişierul respectiv.
- Input – permite doar citirea fişierului, care se va face secvenţial, de la început spre sfârşit,
câte un caracter sau câte o înregistrare.
- Output – permite practic crearea fişierului, prin scrierea secvenţială în cadrul acestuia, pe
rând, a câte unui caracter sau câte o înregistrare. Dacă fişierul exista şi a fost deschis
Output, el va fi practic recreat, adică noul fişier se va suprascrie peste cel vechi. De aceea
se recomandă multă atenţie la utilizarea acestui mod de deschidere. Pentru a scrie noi
înregistrări într-un fişier existent vom deschide fişierul în modul Append.
- Random – permite fie crearea, fie citirea unui fişier în acces aleator.

Observaţie:
Un fişier deschis în mod Append sau Output trebuie neapărat închis înainte de a fi deschis cu
un alt număr. Fişierele deschise în mod Binary, Input sau Random pot fi deschise cu un alt
număr, fără a fi necesară închiderea lor prealabilă.

Pentru accesul secvenţial se poate specifica:


APPEND – pentru a adăuga înregistrări noi la sfârşit;
INPUT – pentru a citi înregistrările din fişier;
OUTPUT – pentru crearea unui nou fişier.
Pentru accesul binary se specifică accesul BINARY, iar pentru cel random se specifică
RANDOM. Dacă fişierul este deja deschis şi existent, la închidere şi salvare prin OUTPUT,
acesta rescrie fişierele existente,.
Pentru a lucra cu mai multe fişiere simultan, se va utilize funcţia FreeFile, care returnează
următorul număr de fişiere, care poate fi utilizat în instrucţiunea FileOpen.

4.11.2. Comenzi pentru fişiere aleatoare

Descrierea câmpurilor ce formează înregistrările unui fişier aleator se face utilizând o


declaraţie de tip utilizator.
STRUCTURE numetip
NumeVariabila1 as ......
.......
NumeVariabilak as ......
END STRUCTURE

PUBLIC nume_înregistrare As numetip


Această declaraţie trebuie făcută pentru a fi acceptată într-un modul, cu o procedură SUB
MAIN( ) (se adaugă la elementele proiectului un MODUL - Add Module din submeniul opţiunii
Project – în care se declară tipul utilizator şi în mod public înregistrarea de tipul respectiv. Astfel
declarată înregistrarea este accesibilă din toate componentele proiectului.
Reamintim că înregistrările dintr-un fişier pot fi uniform structurate prin intermediul unor
zone ce partajează lungimea înregistrării şi care se numesc câmpuri. În acelaşi câmp din
înregistrări diferite se înregistrază acelaşi tip de date, de aceeaşi lungime. Spre exemplu, într-un
fişier în care sunt înregistrate date despre situaţia rezultatelor la examenele dintr-o sesiune,
informaţiile din înregistrări pot avea următoarea formă:

1 Nume An Grupa Matematică Algoritmi Arhitectură Economie


Prenume
2 Numpren An Gr Mate Algo Arhi Econ
3 Sir Num Sir Num Num Num Num

unde în rândul:
1. s-au trecut informaţiile din înregistrare ce corespund câmpurilor;
2. s-au trecut numele câmpurilor cum vor fi ele folosite în program;
3. s-au trecut tipurile de date pentru fiecare câmp.

Descrierea acestei înregistrări printr-un tip utilizator poate fi făcută astfel:


STRUCTURE TIPSTUD
Numpren As string
An As integer
Gr As string
Mate As integer
Algo As integer
Arhi As integer
Econ As integer
END STRUCTURE
PUBLIC studenti AS tipstud

Scrierea unei înregistrări într-un fişier aleator se face cu instrucţiunea FilePut care are
următoarea sintaxă:

FilePut(NumeFişier, NumeVariabilă , NumărÎnreg)


unde:
NumărÎnreg este numărul înregistrării pe care dorim să o scriem.
NumeVariabilă este numele variabilei ce defineşte înregistrarea (declarată de tipul utilizator).
Scrierea datelor în fişierele binare se asemănă cu cea în fişierele aleatoare, folosind
instrucţiunea FilePut.

Poziţionarea pentru citire pe o înregistrare dintr-un fişier aleator se face cu instrucţiunea


FileGet care are următoarea sintaxă:

FileGet( numărFişier, varCitire [, numărInreg]


unde numărfişier este numărul de identificare al fişierului dat în instrucţiunea FileOpen,
varCitire este variabila în care se vor stoca datele citite din fișier, iar numărInreg este numărul
de înregistrare ce se doreşte accesată.

Observaţie:
La fişierele aleatoare accesul la înregistrări se poate face doar prin intermediul numărului de
înregistrare.

4.11.3. Închiderea fişierelor

Închiderea fişierelor se realizează cu comanda FileClose, a cărei sintaxă este:

FileClose [listă fişiere] sau altfel spus


FileClose( [ # numărFişier1] [, # numărFişier2] [, # numărFişier3…] )

Dacă lista fişierelor ce trebuie închise lipseşte, atunci toate fişierele deschise cu FileOpen
care sunt active în mod curent vor fi închise.
Când se închid fişierele care au fost deschise în mod Append sau Output, toate datele aflate
în zona tampon asociată fişierului vor fi scrise în fişier înaintea închiderii fişierului. Prin
închiderea unui fişier cu FileClose asocierea dintre fişier şi numărul său dispare.

4.11.4. Comenzi pentru fişiere secvenţiale

Fişierele secvenţiale sunt în general şiruri de caractere, dar pot fi şi combinaţii de şiruri de
caractere şi de numere. În general se pot folosi următoarele două instrucţiuni pentru a scrie date
într-un fişier cu acces secvenţial:
a). Scrierea datelor într-un fişier secvenţial se poate face cu comenzile:

Print(NumărFişier, listă_expresii)
sau
Write( NumărFişier, listă_expresii)
unde:
listă_expresii este o listă de variabile a căror valoare urmează să fie trecută în fişier.
Pentru a scrie o înregistrare goală, după număr fişier se precizează numai virgule.
Instrucţiunea WRITE este similară cu instrucţiunea PRINT , singura diferenţă între cele
două instrucţiuni fiind că WRITE inserează virgule între termeni, şirurile de caractere sunt
delimitate de ghilimele, iar numerele pozitive nu sunt precedate de spaţii.

Exemplu:
Fiind date două liste (una de nume şi corespunzător una de vârste) să se creeze un fişier
secvenţial în care să se memoreze aceste date (numele şi vârsta fiecărui student).

Rezolvare:
Am proiectat forma şi am executat aplicaţia.

Codul sursă asociat evenimentului click al butonului de comandă Scrie în fişier este:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button1.Click
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Output)
PrintLine(nrF, "PRIMUL TEST DE SCRIS INTR-UN FISIER")
PrintLine(nrF, "LA DATA DE", TAB(20), CDate(Today()))
PrintLine(nrF, New String(CChar("_"), 35))
PrintLine(nrF, "NUME PRENUME", TAB(20), "VARSTA")
PrintLine(nrF, New String(CChar("_"), 35))
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), _
Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End Sub
Codul asociat evenimentului click al butonului Exit:
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
End
End Sub
Verificând pe disc, fişierul fis1.txt există:

Conţinutul fişierului creat se prezintă astfel:

PRIMUL TEST DE SCRIS INTR-UN FISIER


LA DATA DE 12.02.2010
___________________________________
NUME PRENUME VARSTA
___________________________________
Student 1 20
Student 2 22
Student 3 18
Student 4 22
Student 5 24
Student 6 20

b) Citirea informaţiilor din fişiere cu acces secvenţial

Citirea informaţiilor din fişierele secvenţiale se face cu ajutorul instrucţiunilor:

Input(NumărFişier, ȘirCaractere)

LineInput(NmărFişier)
unde:
ŞirCaractere este o variabilă de tip String în care este preluată înregistrarea, ca şir de caractere;
LineInput returnează un șir de caractere
Citirea datelor dintr-un fişier binar se realizează într-un mod asemănător cu cel aleatoriu.

4.11.5. Alte funcţii pentru lucrul cu fişiere

În lucrul cu fişierele deosebit de importante sunt o serie de funcţii.


Funcţia Seek(NumărFişier) returnează ca valoare poziţia curentă de citire/scriere în
cadrul uni fişier deschis cu instrucţiunea Open.
Funcţia LOF(NumărFişier) returnează mărimea fişierului exprimată în octeţi.
Funcţia EOF(NumărFişier) returneză valoarea logică True dacă s-a ajuns la sfârşitul unui
fişier deschis în mod aleatoriu sau secvenţial şi False în caz contrar. Aceasta înseamnă că pentru
a citi toate înregistrările de date dintr-un fişier ne vom folosi de testarea valorii acestei funcţii,
într-o construcţie cum ar fi:
Exemplu:
Să se dezvolte aplicaţia anterioară şi să se completeze astfel încât, pe lângă crearea unui fişier
secvenţial, să permită noi funcţiuni şi anume:
- citirea şi vizualizarea datelor din fişierul creat;
- adăugarea de noi înregistrări în fişier;
- modificarea conţinutului unor înregistrări (selectate de utilizator);
- ştergerea unor înregistrări care nu mai sunt de actualitate (selectate de utilizator).
Rezolvare:
Am proiectat forma, am prevăzut pentru fiecare dintre funcţiunile aplicaţiei câte un buton de
comandă şi am scris codul sursă asociat acestora:

Executând aplicaţia se obţine:


Dacă se doreşte adăugarea de noi înregistrări în fişier, atunci se precedează astfel: se
activează butonul de opţiuni ADAUGARE INREGISTRĂRI ÎN FIŞIER, se completează sus, în
casetele de text datele (nume, vârstă) şi, pentru preluarea lor în listă se acţionează butonul ok.
După ce am preluat în listă datele studenţilor pe care vrem să-i adăugăm în fişier, acţionîm
butonul SCRIE LISTA ÎN FIŞIER.
Vom vizualiza apoi datele existente în fişier acţionând butonul LISTEAZĂ.
Ca efect în lista din dreapta sunt afişate înregistrările existente acum în fişier, inclusiv cele
adăugate.

Dacă se doreşte crearea din nou a fişierului cu elementele din listă, atunci se selectează
opţiunea CREARE FIŞIER urmată de acţionarea butonului SCRIE LISTĂ ÎN FIŞIER. La
acţionarea butonului LISTEAZĂ se vor vedea doar aceste înregistrări.
Se poate şterge apoi lista (din stânga) acţionând butonul STERGE LISTA.

Dacă se doreşte modificarea unei înregistrări din listă se procedează astfel:


- se apasă butonul MODIFICARE ÎNREGISTRĂRI. Ca efect se deschide o nouă formă,
Form2, în care conţinutul fişierului este trecut într-o listă. Utilizatorul selectează înregistrarea
de modificat (al cărei conţinut se trece în caseta de text de deasupra listei) şi face modificările
dorite.
Apăsând pe butonul ACCEPTA MODIFICARILE înregistrarea corectată trece din nou în listă şi
se aşteaptă ca utilizatorul să efectueze, pe rând toate modificările dorite.

Urmează apoi preluarea în fişier a înregistrărilor din listă, deci cu corecţiile efectuate,
acţionând butonul SCRIE MODIFICĂRILE ÎN FIŞIER. Se afişează din nou forma 1, cu lista
fără elemente. Dacă cerem din nou o listare a fişierului (opţiunea LISTEAZĂ) se va observa că
toate corecţiile noastre au fost preluate în fişier.
Pentru a şterge o înregistrare se procedează în mod similar: se apasă butonul STERGERE
ÎNREGISTRĂRI , se afişează o nouă formă (FORM3) cu conţinutul fişierului afişat în listă; se
alege din listă înregistrarea dorită şi ca efect ea va fi dusă în caseta de text pentru confirmare cu
butonul ACCEPTA STERGERE. apoi se apasă butonul RESCRIE FISIER.

Ca efect apare din nou forma principală, în care putem lista din nou conţinutul fişierului,
pentru a ne convinge că ştergerea a fost efectuată..
Cu EXIT se iese din aplicaţie.
Codul sursă asociat controalelor din cadrul aplicaţiei se prezintă astfel:
FORM1
'Declaraţii
Dim A1 As String
Dim I1 As Integer

Private Sub Button6_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button6.Click
'Evenimentul click al butonului “Scrie în fişier”/ Form1
If Me.RadioButton1.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Output)
PrintLine(nrF, "PRIMUL TEST DE SCRIS INTR-UN FISIER")
PrintLine(nrF, "LA DATA DE", TAB(20), CDate(Today()))
PrintLine(nrF, New String(CChar("_"), 35))
PrintLine(nrF, "NUME PRENUME", TAB(20), "VARSTA")
PrintLine(nrF, New String(CChar("_"), 35))
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End If
If Me.RadioButton2.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Append)
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End If
End Sub

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button7.Click
'Evenimentul click al butonului EXIT
End
End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button5.Click
'Evenimentul click al butonului “MODIFICARE INREGISTRARI” din FORM1
Dim nrF As Integer = FreeFile()
Me.Hide()
Form2.listModif.Items.Clear()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Form2.listModif.Items.Add(A1)
Loop
FileClose(nrF)
Form2.Show()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs)


Handles Button1.Click
'Evenimentul click al butonului “OK” din FORM1
If Len(Trim(Me.TextBox1.Text)) > 0 Then
Me.nume.Items.Add(Me.TextBox1.Text)
Me.varsta.Items.Add(Me.TextBox2.Text)
Me.TextBox1.Text = ""
Me.TextBox2.Text = ""
End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs)


Handles Button2.Click
'Evenimentul click al butonului “CLEAR LISTA” din FORM1
Me.nume.Items.Clear()
Me.varsta.Items.Clear()
End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs)


Handles Button4.Click
'Evenimentul click al butonului “LISTEAZA” din FORM1
Me.ListBox1.Items.Clear()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Me.ListBox1.Items.Add(A1)
Loop
FileClose(nrF)
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e _ As


System.EventArgs) Handles Button3.Click
'Evenimentul click al butonului “STERGERE INREGISTRARI” din ‘FORM1
Me.Hide()
Dim nrF As Integer = FreeFile()
Form3.LISTSTERG.items.Clear()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Form3.listSterg.Items.Add(A1)
Loop
FileClose(nrF)
Form3.Show()
End Sub

Form2
‘Formă pentru modificarea înregistrărilor din fişier, preluate într-o listă care apoi se trece iar în
fişier, modificată
'Declaraţii la nivel de formă
Dim I1 As Integer

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button3.Click
'Evenimentul click al butonului “SCRIE MODIFICARILE IN FISIER” din FORM2
Me.Hide()
Form1.Show()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Output)
For I = 0 To Me.listModif.Items.Count - 1
PrintLine(nrF, Me.listModif.Items.Item(I))
Next I
FileClose(nrF)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e _As System.EventArgs)
Handles Button2.Click
'Evenimentul click al butonului “Anuleaza” din FORM2
Form1.Show()
Me.Hide()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button1.Click
'Evenimentul click al butonului”Accepta Modificarile” din FORM2
If Len(Trim(Me.TextBox1.Text)) > 0 Then
Me.listModif.Items.Item(I1) = Me.TextBox1.Text
Me.TextBox1.Text = ""
End If

End Sub

Private Sub listModif_Click(ByVal sender As Object, ByVal e _


As System.EventArgs) Handles listModif.Click
'Evenimentul click al controlului casetă listă ”LISTMODIF” din FORM2 ‘prin care se preia
în caseta text înregistrarea selectată din listă
I1 = Me.listModif.SelectedIndex
Me.TextBox1.Text = Me.listModif.Items.Item(I1)

End Sub

FORM3
‘Formă pentru ştergerea înregistrărilor din fişier, preluate într-o listă care ‘apoi se trece iar în
fişier, modificată (fără înregistrările şterse)
‘Declaraţii la nivel de formă
Dim I1 As Integer

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button3.Click
'Evenimentul click al controlului “RESCRIE FISIER” ‘din FORM3
Me.Hide()
Form1.Show()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Output)
For I = 0 To Me.listSterg.Items.Count - 1
PrintLine(nrF, Me.listSterg.Items.Item(I))
Next I
FileClose(nrF)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button1.Click
'Evenimentul click al butonului “Accepta stergere” din FORM3
Me.listSterg.Items.RemoveAt(I1)
Me.TextBox1.Text = ""
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button2.Click
'Evenimentul click al butonului “Anuleaza”din FORM3
Me.Hide()
Form1.Show()
End Sub

Private Sub listSterg_Click(ByVal sender As Object, ByVal e _


As System.EventArgs) Handles listSterg.Click
'Evenimentul click al controlului casetă listă “LISTSTERG” din FORM3 ‘prin care se preia
pentru ştergere, în caseta text, înregistrarea selectată în ‘listă
I1 = Me.listSterg.SelectedIndex
Me.TextBox1.Text = Me.listSterg.Items.Item(I1)
End Sub

Exemplu pentru fişierele cu acces direct (RANDOM) :

Problemă:
Completaţi şi dezvoltaţi aplicaţia de mai sus pentru a permite şi crearea şi actualizarea unui
fişier aleator.
Rezolvare:
Am adăugat pe forma principală opţiunea FIŞIER RANDOM.
Executând aplicaţia am creat fişierul, apoi am adăugat noi înregistrări, le-am vizualizat, le-
am corectat întocmai ca în aplicaţia anterioară.

Codul sursă asociat obiectelor din FORM1 ce este forma prezentată mai sus se prezintă astfel:
.
'Declaraţii la nivel de formă
Dim A1 As String
Dim I1 As Integer
Structure persoana
Dim rNr As String
Dim rNume As String
Dim rVarsta As String
End Structure

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button7.Click
'Evenimentul click al butonului “SCRIE LISTA IN FISIER”
If Me.RadioButton1.Checked = True Then 'fisier secvential
If Me.RadioButton3.Checked = True Then 'creare fisier
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Output)
PrintLine(nrF, "PRIMUL TEST DE SCRIS INTR-UN FISIER")
PrintLine(nrF, "LA DATA DE", TAB(20), CDate(Today()))
PrintLine(nrF, New String(CChar("_"), 35))
PrintLine(nrF, "NUME PRENUME", TAB(20), "VARSTA")
PrintLine(nrF, New String(CChar("_"), 35))
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), _
Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End If
If Me.RadioButton4.Checked = True Then 'adaugare inregistrari
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Append)
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), _
Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End If
End If
If Me.RadioButton2.Checked = True Then 'fisier random
If Me.RadioButton3.Checked = True Then 'creare fisier
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Output)
FileClose(nrF)
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim scrie As persoana
For I3 = 0 To Me.nume.Items.Count - 1
scrie.rNr = I3 + 1
scrie.rNume = Me.nume.Items.Item(I3)
scrie.rVarsta = Me.varsta.Items.Item(I3)
FilePut(nrF, scrie, I3 + 1)
Next I3
FileClose(nrF)
End If
If Me.RadioButton4.Checked = True Then 'adaugare inregistrari
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim I4 As Integer = 1
Dim scrie As New persoana
Do While Not (EOF(nrF))
FileGet(nrF, scrie, I4)
I4 = I4 + 1
Loop
For I3 = 0 To Me.nume.Items.Count - 1
scrie.rNr = I4 + I3
scrie.rNume = Me.nume.Items.Item(I3)
scrie.rVarsta = Me.varsta.Items.Item(I3)
FilePut(nrF, scrie, I4 + I3)
Next I3
FileClose(nrF)
End If

End If
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles
Button4.Click
'Evenimentul click al butonului “Exit”
End
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button6.Click
'Evenimentul click al butonului “MODIFICARE INREGISTRARI” ce ‘deschide “FORM2” formă în
care se vor efectua modificările după ce ‘încarcă în lista “LISTMODIF” din această formă înregistrările
din fişier
Me.Hide()
Form2.ListModif.Items.Clear()
Form2.ListBox1.Items.Clear()
Form2.ListBox2.Items.Clear()

If Me.RadioButton1.Checked = True Then


Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Form2.ListModif.Items.Add(A1)
Loop
FileClose(nrF)
Form3.Show()
End If
If Me.RadioButton2.Checked = True Then
Form2.ListModif.Items.Clear()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim I4 As Integer = 1
Dim scrie As New persoana
Do While Not (EOF(nrF))
FileGet(nrF, scrie, I4)
Form2.ListBox1.Items.Add(scrie.rNr)
Form2.ListModif.Items.Add(scrie.rNume)
Form2.ListBox2.Items.Add(scrie.rVarsta)
I4 = I4 + 1
Loop
FileClose(nrF)
Form2.Show()
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles


Button1.Click
'Evenimentul click al butonului “OK”
If Len(Trim(Me.TextBox2.Text)) > 0 Then
Me.nume.Items.Add(Me.TextBox1.Text)
Me.varsta.Items.Add(Me.TextBox2.Text)
Me.TextBox2.Text = ""
Me.TextBox1.Text = ""
End If
Me.TextBox1.Focus()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs)
Handles Button2.Click
'Evenimentul click al butonului “CLEAR LISTA”
Me.nume.Items.Clear()
Me.varsta.Items.Clear()
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button3.Click
'Evenimentul click al butonului “LISTEAZA INREGISTRARILE DIN
'FISIER”
If Me.RadioButton1.Checked = True Then
Me.List1fis.Items.Clear()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Me.List1fis.Items.Add(A1)
Loop
FileClose(nrF)
End If
If Me.RadioButton2.Checked = True Then
Me.List1fis.Items.Clear()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim I4 As Integer = 1
Dim scrie As New persoana
Do While Not (EOF(nrF))
FileGet(nrF, scrie, I4)
A1 = Str(scrie.rNr) + scrie.rNume + Str(scrie.rVarsta)
Me.List1fis.Items.Add(A1)
I4 = I4 + 1
Loop
FileClose(nrF)
End If
End Sub

Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles


Button5.Click
'Evenimentul click al butonului “STERGERE INREGISTRARI” ce ‘deschide “FORM3” formă în
care se vor efectua ştergerile după ce încarcă ‘în lista “LISTSTERG” din această formă înregistrările din
fişier
Me.Hide()
If Me.RadioButton1.Checked = True Then
Me.Hide()
Form3.ListSterg.Items.Clear()
Form3.ListBox1.Items.Clear()
Form3.Listbox2.items.Clear()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Form3.ListSterg.Items.Add(A1)
Loop
FileClose(nrF)
Form3.Show()
End If
If Me.RadioButton2.Checked = True Then
Form3.ListSterg.Items.Clear()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim I4 As Integer = 1
Dim scrie As persoana
Do While Not (EOF(nrF))
FileGet(nrF, scrie, I4)
Form3.ListBox1.Items.Add(scrie.rNr)
Form3.ListSterg.Items.Add(scrie.rNume)
Form3.ListBox2.Items.Add(scrie.rVarsta)
I4 = I4 + 1
Loop
FileClose(nrF)
Form3.Show()
End If
End Sub

FORM2 este o formă în care se efectuează operaţiile necesare pentru modificarea înregistrărilor din
fişierul ales (FIS1.DAT ca fişier secvenţial şi FIS2.DAT ca fişier RANDOM).
Codul sursă asociat acestei forme şi controalelor ce le conţine este:

'Declaraţii la nivel de formă


Dim I1 As Integer
Structure persoana
Dim rNr As String
Dim rNume As String
Dim rVarsta As String
End Structure
Private Sub Button8_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs)
Handles Button8.Click
'Evenimentul click al butonului “Scrie modificarile in fisier"
Me.Hide()
Form1.Show()
If Form1.RadioButton1.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Output)
For I = 0 To Me.ListModif.Items.Count - 1
PrintLine(nrF, Me.ListModif.Items.Item(I))
Next I
FileClose(nrF)
End If
If Form1.RadioButton2.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Output)
FileClose(nrF)
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim scrie As persoana
For I3 = 0 To Me.ListModif.Items.Count - 1
scrie.rNr = I3 + 1
scrie.rNume = Me.ListModif.Items.Item(I3)
scrie.rVarsta = Val(Me.ListBox2.Items.Item(I3))
FilePut(nrF, scrie, I3 + 1)
Next I3
FileClose(nrF)
End If
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles


Button1.Click
'Evenimentul click al butonului “CANCEL” din FORM2
Form1.Show()
Me.Hide()
End Sub

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button7.Click
'Evenimentul click al butonului “OK” din FORM2 prin care se preia în listele
“Form2.List1”,“form2.LISTMODIF” şi “form2.List2” înregistrarea modificată în casetele de text
“form2.text1” şi “Form2.text3”
If Len(Trim(Me.TextBox1.Text)) > 0 Then
Me.ListBox1.Items.Item(I1) = Me.TextBox2.Text
Me.ListModif.Items.Item(I1) = Me.TextBox1.Text
Me.ListBox2.Items.Item(I1) = Me.TextBox3.Text
Me.TextBox1.Text = ""
Me.TextBox2.Text = ""
Me.TextBox3.Text = ""
End If
End Sub

Private Sub ListModif_Click(ByVal sender As Object, ByVal e _


As System.EventArgs) Handles ListModif.Click
'Evenimentul click al listei “Form2.LISTMODIF” prin care se preiau în ‘casetele de text
“Form2.text1”, “Form2.text2” şi “Form2.Text3” datele de ‘modificat selectate prin evenimentul click din
lista “Form2.LISTMODIF”
I1 = Me.ListModif.SelectedIndex
Me.TextBox2.Text = Me.ListBox1.Items.Item(I1)
Me.TextBox1.Text = Me.ListModif.Items.Item(I1)
Me.TextBox3.Text = Me.ListBox2.Items.Item(I1)
Me.TextBox1.Focus()
End Sub
FORM3 este forma în care se efectuează operaţiile necesare pentru ştergerea de înregistrări.

Codul sursă asociat acestei forme şi controalelor ce le conţine este:


'Declaraţii la nivel de formă
Dim I1 As Integer
Structure persoana
Dim rNr As String
Dim rNume As String
Dim rVarsta As String
End Structure

Private Sub Button8_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button8.Click
'Evenimentul click al butonului “RESCRIE FISIER” din FORM3 prin ‘care se rescriu în fişierul ales
înregistrările din listele “Form3.List1”, ‘Form3.LISTSTERG” şi “Form3.List2” după ce s-au efectuat
ştergerile
Me.Hide()
Form1.Show()
If Form1.RadioButton1.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Output)
For I = 0 To Me.ListSterg.Items.Count - 1
PrintLine(nrF, Me.ListSterg.Items.Item(I))
Next I
FileClose(nrF)
End If
If Form1.RadioButton2.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Output)
FileClose(nrF)
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim scrie As persoana
For I3 = 0 To Me.ListSterg.Items.Count - 1
scrie.rNr = I3 + 1
scrie.rNume = Me.ListSterg.Items.Item(I3)
scrie.rVarsta = Val(Me.ListBox2.Items.Item(I3))
FilePut(nrF, scrie, I3 + 1)
Next I3
FileClose(nrF)
End If
End Sub

Private Sub Button7_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button7.Click
'Evenimentul click al butonului “OK” din FORM3 prin care se confirmă
‘şi se efectuează ştergerea din liste a înregistrării selectate şi trecute în
‘casetele de text
Me.ListSterg.Items.RemoveAt(I1)
Me.ListBox1.Items.RemoveAt(I1)
Me.ListBox2.Items.RemoveAt(I1)
Me.TextBox1.Text = ""
Me.TextBox2.Text = ""
Me.TextBox3.Text = ""
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _


As System.EventArgs) Handles Button1.Click
'Evenimentul click al butonului “CANCEL” din FORM3 prin care se ‘revine în forma “Form1”
Form1.Show()
Me.Hide()
End Sub
Private Sub ListSterg_Click(ByVal sender As Object, ByVal e _
As System.EventArgs) Handles ListSterg.Click
'Evenimentul click al listei “Form3.LISTSTERG” prin care se ‘selectează o înregistrare din
“Form3.LISTSTERG” şi se trec în casetele de ‘text valorile înregistrării selectate.
I1 = Me.ListSterg.SelectedIndex
Me.TextBox2.Text = Me.ListBox1.Items.Item(I1)
Me.TextBox1.Text = Me.ListSterg.Items.Item(I1)
Me.TextBox3.Text = Str(Me.ListBox2.Items.Item(I1))
Me.TextBox1.Focus()
End Sub