Variabile
Programele Visual Basic declara si folosesc variabile in moduri similare cu alte
limbaje de programare.
O variabila este locul din memorie rezervat pentru o valoare necunoscuta.
A declara o variabila inseamna a-i spune programului despre ea de la bun inceput. O
variabila poate fi declarata cu instructiunea Dim, prin furnizarea unui nume pentru
variabila:
Dim numeVariabila As tip
Variabilele declarate prin Dim in cadrul unei proceduri exista doar atata timp cat
executa procedura. La incheierea procedurii, valoarea variabilei dispare. In plus, valoarea
unei variabile dintr-o procedura este locala acelei proceduri – adica accesul la o variabila
dintr-o anumita procedura nu poate fi permis din cadrul altei proceduri. Aceste
caracteristici permit folosirea acelorasi nume de variabile in proceduri diferite, fara a
exista conflicte sau modificari ale continutului lor.
Declaratii si atribuiri. Variabilele pot fi declarate folosind cuvintele cheie Dim,
Private, Public sau Static.
Dim se foloseste in interiorul unei proceduri pentru a declara o variabila
locala care este vizibila numai in cadrul acelei proceduri.
Private impreuna cu Dim pot fi folosite in afara procedurilor, dar in interiorul
claselor sau modulelor pentru a crea variabile care pot fi accesate de oriunde
din interiorul clasei sau modulului respectiv.
Public se poate folosi in interiorul modulelor pentru a crea variabile globale,
adica variabile care exista pe toata durata programului si care pot fi accesate
de oriunde in proiectul curent. Daca se foloseste cuvantul cheie Public in
interiorul unei clase se va crea un camp public pentru acea clasa.
Static se foloseste pentru a declara variabile statice in interiorul procedurilor.
Static nu se poate folosi la declararea procedurii pentru a face toate variabilele
declarate in acea procedura statice.
Urmatoarea secventa de cod demonstreaza cele cinci tipuri de variabile:
Module MyModule
Public myGlobalVar As String
' Aceasta variabila globala este vizibila pentru intreaga aplicatie.
Private myModuleVar As String
Dim myModuleVar2 As String
' Aceste variabile sunt vizibile numai in interiorul modulului curent.
Sub MyProcedure()
Dim myPrivateVar As String
' Aceasta variabila private este vizibila numai in interiorul acestei
proceduri.
Static counter As Integer
' Aceasta variabila statica isi mentine valoarea intre apeluri
' consecutive ale procedurii
…
End Sub
End Module
Visual Basic deriva din limbajul Basic, mai exact din versiunea Microsoft a
limbajului numita QuickBasic. Aceste versiuni mai vechi nu forteaza utilizatorul sa
declare toate variabilele folosite in program si aceasta optiune a fost pastrata si in
versiunile mai recente inclusiv VisualBasic .NET 2005 desi declararea variabilelor este
implicit obligatorie. Puteti controla aceasta optiune cu ajutorul directivei Option Explicit
plasata pe prima linie de cod a modulului.
' Forteaza declararea explicita a tuturor variabilelor din modul.
Option Explicit On
Option Explicit ' Clauza On poate fi omisa.
In mod implicit variabilele trebuie declarate cu clauza explicita As, dar aceasta
poate fi omisa daca se seteaza un tip de date implicit. Tipul Object este tipul implicit.
Dim obj ` variabila de tip object
Este insa recomandat ca toate variabilele sa fie declarate cu tipul propriu si nu ar
trebui schimbat comportamentul implicit fara a avea un motiv bun.
Exista cateva restrictii privind numele de variabila, si anume:
trebuie sa inceapa cu o litera;
nu poate contine caracterul punct sau un caracter rezervat, de declaratie de tip;
nu trebuie sa depaseasca 255 de caractere;
trebuie sa fie unic in cadrul aceluiasi domeniu, care este spatiul in cadrul
caruia o variabila poate fi apelata – o procedura, un formular etc.
Pot fi declarate mai multe variabile in cadrul aceleiasi instructiuni Dim, Private
sau Public sau poate fi folosita o singura clauza As daca variabilele declarate pe aceeasi
linie sunt de acelasi tip:
Dim cantitate As Long, greutate As Single, adresa As String
Dim x, y, z As Long
varNume poate fi orice nume posibil de variabila care a fost declarata, iar expresie se
refera la o valoare imediata sau o variabila.
In continuare se prezinta un exemplu de atribuire a unei valori unei variabile.
Dim varNume As Integer
varNume = 100 ’atribuie o valoare unei variabile de tip Integer
Variabilele locale sau cele declarate la nivel de clasa (campurile) pot fi declarate si
initializate folosind o singura instructiune. Aceasta optiune permite simplificarea codului.
Dim latime As Single=1000
Dim nume As String=”Ion”
Dim dataCurenta As Date=Now() ’atribuie variabilei valoarea datei curente
Dupa cum arata ultima instructiune valoarea care este asociata unei variabile nu
trebuie sa fie neaparat o constanta. Puteti initializa o variabila numai daca este singura
variabila declarata in instructiunea Dim, Private sau Public. Initializarea variabilelor este
extrem de folositoare mai ales in cazul variabilelor declarate la nivel de clasa
(campuri(fields)) si al variabilelor globale deoarece ofera o metoda simpla de a avea
valori implicite pentru campuri si proprietati.
Public Class Person
Public Country As String = "USA"
End Class
Initializatorii functioneaza de asemenea cu variabile care au un tip de data
complex (cum ar fi de exemplu o clasa ) cum ar fi de exemplu:
Dim txtBox As TestBox
txtBox = New TextBox()
Variabilele locale se declara in interiorul unei proceduri sau functii dupa cum
urmeaza:
Public Sub Suma()
Dim s As Indeger=0
EndSub
Aceste variabile sunt accesibile numai in cadrul procedurii in care au fost declarate.
Aceste variabile locale pot fi declarate prin cuvintele-cheie Dim sau Static, dupa cum
urmeaza:
Dim variabilaTempProc As tip
End Sub
End Class
Variabile statice
Pe langa un domeniu, variabilele au si o durata de viata, adica perioada de timp cat isi
pot pastra valoarea. Valorile variabilelor declarate la nivelul modulelor si al claselor se
pastraza pe toata durata aplicatiei. Cu toate acestea, variabilele locale declarate cu Dim
exista doar cat timp se executa procedura sau functia in care au fost declarate. La
inchiderea rularii unei proceduri, valorile variabilelor locale nu sunt pastrate, iar memoria
ocupata de ele este eliberata.
La urmatoarea executie a procedurii, toate variabilele locale se reinitializeaza. Dar si
asa, valoarea unei variabile locale poate fi pastrata facand-o statica. Cuvantul-cheie Static
va fi folosit exact la fel ca si declaratia Dim pentru a declara una sau mai multe variabile
de acest tip intr-o procedura.
De exemplu, urmatoarea functie va calcula un total in derulare adaugand o noua
valoare la totalul anterior in variabila statica Acumulat:
Function TotalInDerulare(num)
Static Acumulat
Acumulat = Acumulat + num
TotalInDerulare = Acumulat
End Function
Daca Acumulat ar fi fost declarat cu Dim in loc de Static, valorile insumate in pasii
anteriori nu ar fi fost pastrate intre apelurile functiei, iar functia ar fi returnat exact
aceeasi valoare cu care a fost apelata.
Acelasi rezultat putea fi obtinut declarand Acumulat la nivel de clasa sau de modul.
Dar in acest caz variabila ar fi putut fi alterata de alte proceduri sau functii ale clasei sau
modulului.
Constante
Deseori se constata prezenta in cod a unor valori constante care se repeta mereu.
Alteori se constata ca programul depinde de valorile anumitor numere greu de retinut –
valori care in sine nu au o semnificatie deosebita – sau de valori care s-ar putea sa se
schimbe in perioada de testare a programului, cum este de exemplu valoarea pentru o
scalare.
In astfel de cazuri, lizibilitatea codului creste spectaculos – si el devine mai usor de
intretinut – utilizand constantele. O constanta este un nume semnificativ care tine locul
unui numar sau sir de caractere care nu se schimba. Cu toate ca o constanta seamana
oarecum cu o variabila, o constanta nu poate fi modificata si nu i se poate atribui o alta
valoare, asa cum se intampla cu variabilele. Exista doua surse de constante:
Constante intrinseci sau definite de sistem care sunt furnizate de aplicatii sau
de controale. Constantele Visual Basic sunt enumerate in cadrul bibliotecilor
de obiecte Visual Basic (VB) si Visual Basic for Applications (VBA) din
cadrul utilitarului Object Browser. Celelalte aplicatii care ofera biblioteci de
obiecte, precum Microsoft Excel sau Microsoft Project, ofera si o lista de
constante care pot fi folosite impreuna cu obiectele, metodele si proprietatile
lor. Constantele sunt, de asemenea, definite in biblioteca de obiecte a fiecarui
control ActiveX.
Constantele simbolice sau definite de utilizator sunt declarate prin
instructiunea Const si vor fi descrise in paragraful urmator.
unde argumentul nume_constanta este un nume simbolic valid (aceleasi reguli ca pentru
variabile), iar expresie este compusa din constante numerice sau siruri de caractere si din
operatori, dar nu pot fi folosite apeluri de functii sau valori care nu se cunosc in
momentul compilarii. Pe langa aceste doua argumente este obligatoriu sa se foloseasca
cuvantul-cheie Const, restul sunt optionale.
Exemple de definiri de constante cu instructiunea Const:
Const conPi = 3.14159265358979
Public Const conNumarPlanete As Integer = 9
Const conDataCurenta = #08/21/02#
Const conNumeDeCod = ”Vultur”
Public Const conPiScurt = 3.14, conMaxPlanete = 9, conPopulatiaLumii = 6E+09
Const conPi2 = 2 * conPi
Tipuri de date
Variabilele sunt entitati destinate stocarii valorilor; ele se caracterizeaza prin nume si
tip de data. Tipul de data al unei variabile indica modul in care bitii care reprezinta
respectivele valori sunt stocati in memoria calculatorului. La declararea unei variabile,
acesteia i se poate asocia si un tip de data. Toate variabilele au un tip de data care
determina felul datelor pe care le poate stoca.
Daca nu este furnizat nici un tip de data, variabila capata implicit tipul de data
Object. Tipul de data Object este tipul din care deriva toate celelalte tiputi de date.
Daca o variabila memoreaza intotdeauna acelasi tip de data, Visual Basic o va
manevra mult mai eficient daca este declarata ca acel tip de data. De exemplu, o variabila
care memoreaza numele unei persoane este mai bine sa aiba tipul sir de caractere.
Tipurile de date pot fi aplicate nu numai variabilelor. La atribuirea unei valori pentru
o proprietate, acea valoare are un tip de data; argumentele au de asemenea tipuri de date.
De fapt, aproape orice componenta Visual Basic care implica date implica si un tip de
data. De asemenea, pot fi declarate matrice pentru oricare din tipurile fundamentale de
date.
Inainte de a utiliza o variabila de tip non-Object, trebuie folosita una dintre
instructiunile Private, Public, Dim sau Static pentru a-i declara tipul. In continuare se
prezinta cateva exemple de declaratii posibile de variabile cu tip de date:
Private i As Integer
Dim nrMare As Double
Static Nume As String
Public PlatiFacute As Currency
Privat n, Test As Integer, Prenume As String
O variabila de tip String careia nu i-a fost atribuita o valoare are valoarea
Nothing. Exista o diferenta intre o variabila String care contine un sir nul si o variabila
String careia nu i-a fost atribuita o valoare.
Dim s as String=”” ’sir nul
MessageBox.Show(s.Length) ’afiseaza 0
Dim t as String
MessageBox.Show(s.Length) ’genereaza o eroare de compilare
Pentru atribuirea unei valori unei variabile de acest tip se pot folosi si functiile
globale Now() si Today()
Dim d As Date=Now
Vectori(Arrays)
Vectorii permit apelarea la o serie de variabile avand acelasi nume si care folosesc
un numar(index) pentru a se deosebi unele de altele. Acest lucru este util in multe situatii
la scrierea codului, deoarece pot fi create bucle care lucreaza eficient cu orice element din
vector folosind indexul. Vectorii au atat limite inferioare cat si limite superioare, iar
elementele lor sunt continui in cadrul acelor limite.
Toate elementele dintr-un vector au acelasi tip de data. Daca, insa, tipul de data
este Object, elementele, luate individual pot contine tipuri diferite de date. Pot fi creati
vectori de orice tip de data inclusiv tipuri de date definite de utilizator.
In Visual Basic exista doua tipuri de vectori: vectori cu dimensiune fixa si vectori
dinamici, a caror dimensiune poate fi modificata.
Toti vectorii in VisualBasic au indexul primului element 0. Vectorii pot fi
unidimensionali, bidimensionali si jagged(vectori de vectori).
Dupa cum se observa din exemplul precedent valoarea care se pune intre
paranteze reprezinta cel mai mare index din vector, nu numarul de elemente din vector.
Deci vectorul arr(5) are indexul ultimului element 5 si deci are 6 elemente.
O alta modalitate de a declara un vector este:
Dim arr(0 To 10) As Integer ’vector de 11 elemente (se poate specifica si limita
inferioara)
Vectori dinamici
Apar situatii cand nu se poate sti dinainte cat de mare trebuie declarat un vector.
In aceste cazuri este necesar a schimba dimensiunea vectorului in timpul executiei.
Un vector dinamic poate fi redimensionat in orice moment. Vectorii dinamici sunt printre
cele mai flexibile si mai convenabile facilitati din Visual Basic si ele ajuta la o mai
eficienta administrare a memoriei.
Puteti declara un vector folosind instructiunea Dim si sa alocati memorie pentru el
intr-o instructuine ReDim ulterioara. O instructiune ReDim nu poate exista fara o
instructiune Dim pentru un anumit vector. Deoarece ReDim nu poate declara tipul de date
al vectorului aceasta instructiune nu contine clauza As.
’se declara vectorul
Dim arr() As Integer
....
’se creaza vectorul
ReDim arr(100)
Instructiunea If...Then...Else
Principala instructiune de decizie este blocul If...Then...Else...End If. Visual Basic
suporta mai multe variante ale acestei instructiuni inclusiv versiunile pe una sau mai
multe linii.
' Versiunea pe o singura linie, fara clauza else
If x > 0 Then y = x
' Versiunea pe o singura linie, cu clauza else
If x > 0 Then y = x Else y = 0
If conditie Then
instructiuni
End If
unde, conditie este de obicei o comparatie, dar poate fi si o expresie care se poate evalua
la o valoarea de tip boolean. Cand conditie este True Visual Basic executa toate
instructiunile care urmeaza dupa cuvantul cheie Then.
De exemplu, daca se doreste afisarea unui mesaj pentru utilizatorii care furnizeaza
parola corecta, atunci se poate folosi urmatoarea structura If ... Then:
If (strUserPass = strSystemPass) Then
MessageBox.Show(”Parola se afla in fisierul MyUser.txt!”)
End If
S-a considerat ca parola corecta se afla intr-un fisier si a fost depusa anterior in
variabila string strSystemPass. Parola furnizata de utilizator se citeste in variabila string
strUserPass. Daca utilizatorul a dat parola corecta se va semnaliza sonor si se va afisa
mesajul ”Noua parola se afla in fisierul MyUser.txt!”. Daca, in schimb, parola a fost
gresita, programul continua cu instructiunile de dupa End If fara a executa instructiunile
din structura If.
Visual Basic testeaza intai conditie1. Daca ea are valoarea False, continua testarea
cu conditie2 si asa mai departe pana ce gaseste o conditie cu valoarea True. In acel
moment, Visual Basic executa blocul de instructiuni corespunzator si apoi continua cu
codul care urmeaza dupa End If. Ca optiune, poate fi inclus un bloc de instructiuni Else,
care va fi executat in cazul in care nici una din conditii nu are valoarea True.
De exemplu, aceasta instructiune se poate folosi pentru a determina raspunsul
utilizatorului la o caseta de dialog simpla, cu doua butoane Yes si No:
If (MessageBox.Show("Sunteti gata", "", MessageBoxButtons.YesNo) =
Windows.Forms.DialogResult.Yes) Then
MessageBox.Show("Ati raspuns ""Yes"" !")
Else
MessageBox.Show("Ati raspuns ""No"" !")
End If
Asa cum se poate vedea, Select Case alege dintre cateva conditii. Pot exista oricat de
multe seturi de Case ValoareExpresie. Expresiile utilizare pot fi expresii numerice (cu
constante si variabile) sau siruri de caractere. Altfel spus, expresiile nu sunt expresii
conditionale (cu valori True sau False), ci expresii care au valori intregi sau de tip
caracter.
Linia Case Else este optionala, dar linia End Select este obligatorie, ca terminator al
instructiunii Select Case.
Aceasta instructiune nu este la fel de versatila ca si instructiunea If in privinta
faptului ca poate testa numai o singura expresie cu o lista de valori. Fiecare bloc Case
poate contine mai multe teste si poate de asemenea folosi cuvantul cheie “To” pentru a
specifica o gama de valori.
' Testeaza primul caracter din variabila firstName.
Dim ch As Char = firstName.Chars(0)
Select Case ch
Case "0"c To "9"c
' este o cifra.
Case "A"c To "Z"c, "a"c To "z"c
' este o litera.
Case "."c, ","c, " "c, ";"c, ":"c, "?"c
' este un spatiu sau un semn de punctuatie.
Case Else
' este altceva.
End Select
Cuvantul cheie Exit Select permite iesirea din structura Select inainte ca fluxul de
controlul sa ajunga la sfarsitul blocului Case.
Cea mai eficienta tehnica de optimizare cu blocul Select Case este sa mutati cele mai
fregvente cazuri in partea de sus a structurii. De exemplu, in exemplul de cod de mai sus
poate doriti sa testati daca caracterul este o litera inainte de a testa daca este o cifra.
Aceasta tehnica poate mari putin viteza de executie a codului in cazul in care lucrati cu
text care contine mai multe cuvinte decat numere.
In continuare se prezinta un exemplu simplu de folosire a acestei instructiuni.
Private Sub btnOk_Click(sender As Object, e as EventArgs)Handles btnOk.Click
'Pe baza varstei afiseaza ce vehicul se poate conduce
Dim intAge As Integer=0
intAge = Integer.Parse(txtAge.Text)
Select Case intAge
Case Is < 14
MessageBox.Show("Poti conduce o bicicleta!")
Case 14 To 18
MessageBox.Show ("Poti conduce un scuter!")
Case Is > 18
MessageBox.Show ("Poti conduce o masina!")
End Select
End Sub
In exemplul de mai sus utilizatorul introduce o varsta in caseta de text txtAge. Daca
varsta pe care a introdus-o este mai mica de 14 programul afiseaza mesajul „Poti conduce
o bicicleta”, daca varsta este intre 14 si 18 programul va afisa mesajul „Poti conduce un
scuter”, iar daca varsta introdusa este mai mare de 18 mesajul afisat este „Poti conduce o
masina”.
Bucla For...Next
Aceasta instructiune se poate folosi pentru a executa un bloc de cod de un numar
predefinit de ori. In continuare se prezinta sintaxa acestei instructiuni.
For contor [As tip de date] = startValue To endValue [Step increment]
' instructiuni care se executa in bucla...
Next
Visual Basic introduce cuvantul cheie Continue For, care permite trecerea la
urmatoarea iteratie din bucla fara a mai executa instructiunile care se gasesc dupa acest
cuvant cheie.
' Proceseaza numai elementele diferite de 0 din vector.
For i As Integer = 0 To UBound(arr)
If arr(i) = 0 Then Continue For
' Instructiunile urmatoare sunt procesate numai daca arr(i) <> 0.
…
Next
Variabila de control poate fi orice tip de date numeric, dar in practica este recomandat
sa se foloseasca numai variabile de tip Integer sau Long. Cand se foloseste, o variabila de
control de tip Integer sau Long este cu pana la 10 ori mai rapida decat una de tip Single,
Double sau Decimal.
In continuare se prezinta un exemplu de folosire a acestei instructiuni. Acest exemplu
realizeaza adunarea tuturor elementelor unui vector.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim arr() As Integer = {1, 4, 2, 7, 8} 'vector de 5 elemente
Dim suma As Integer = 0 'variabila care tine suma elementelor
For i As Integer = 0 To arr.Length - 1
suma = suma + arr(i)
Next
MessageBox.Show(suma)
End Sub
In exemplul de mai sus nu se specifica clauza Step si deci pasul de iteratie este
considerat in mod implicit 1. Programul de mai sus realizeaza insumarea tuturor
elementelor din vectorul arr, aceasta suma fiind depusa in variabila suma si apoi afisata
sub forma de masaj folosind functia MessageBox.Show.
In continuare se va prezenta un program care numara pana la 10 din 2 in 2. Dupa
cum se poate observa in codul de mai jos se va folosi clauza Step pentru a face pasul de
iterare 2.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
For i As Integer = 0 To 10 Step 2
MessageBox.Show(i)
Next
End Sub
Acest exemplu realizeaza afisarea fiecarui element din vector. In interiorul buclei
cand trebuie sa se faca referire la un element din vector se va folosi variabila de control
“i” in loc de arr(i).
Bucla Do…Loop
Structura Do…Loop este mai flexibila decat bucla For…Next prin faptul ca puteti
pune testarea conditiei de terminare fie la inceputul, fie la sfarsitul buclei. In cazul in care
conditia de terminare se testeaza la sfarsitul buclei instructiunile din bucla vor fi
executate cel putin o data.
Sintaxa acestei instructiuni este prezentata mai jos.
Do While conditie ’executa atata timp cat conditie este adevarata
Bloc de instructiuni
Loop
Do
Bloc de instructiuni
Loop Until conditie ’executa pana cand conditia este adevarata
Se poate folosi fie clauza Where, fie clauza Until ca in exemplele de mai jos.
' Exemplu de bucla Do loop care testeaza conditia de terminare la inceput
' Aceasta bucla nu se executa niciodata daca x <= 0.
Do While x > 0’executa atata timp cat x > 0
y = y + 1
x = x \ 2
Loop
Variabila contor care este testata in cadrul buclei este contor. Atata timp cat
contor are valoarea mai mica decat numarul de elemente din vector se executa
instructiunile din bucla. Bucla se executa pana cand valoarea lui contor devine egala cu
numarul de elemente din vector. Deci singurul mod prin care se poate termina este prin
variabila contor, aceasta fiind modificata in cadrul buclei. Instructiunea contor=contor+1
realizeaza incrementarea variabilei contor de fiecare data cand se executa bucla.
In general nu are nici un sens sa se foloseasca o bucla Do…Loop daca se poate
ajunge la acelasi rezultat prin folosirea unei bucle For…Next, dar exista o exceptie. Sa
presupunem ca aveti doua bucle For imbricate si ati vrea sa iesiti din ambele bucle din
interiorul celei de-a doua bucle.
For i As Integer = 1 To 10
For j As Integer = 1 to 20
' Daca functia Evaluate returneaza 0, vreti sa iesiti din amandoua
buclele, dar acest cod nu merge cum trebuie.
If Evaluate(i, j) = 0 Then Exit For
…
Next
Next
Instructiunea Exit For poate iesi numai din bucla cea mai din interior. Pentru a
obtine rezultatul dorit trebuie folosite 2 tipuri de bucle.
For i As Integer = 1 To 10
Dim j As Integer = 1
Do While j <= 10
' Iasa din bucla For
If Evaluate(i, j) = 0 Then Exit For
…
' Se pregateste pentru iteratia urmatoare.
j += 1
Loop
Next
Bucle imbricate
In interiorul unei bucle For…Next pot fi plasate orice instructiuni Visual Basic, chiar
si o alta bucla For…Next. Atunci cand in interiorul unei bucle se afla alta bucla, se spune
ca avem bucle imbricate(nested loops).
Buclele imbricate sunt folosite atunci cand programul trebuie sa repete o bucla de un
anumit numar de ori. In fig.2.9. se prezinta un exemplu de bucla imbricata. Se poate
spune ca bucla interioara este mai rapida, adica se executa mai repede, decat bucla
exterioara, care asteapta dupa cea interioara.
Bucla interioara este cea care numara de la 1 la 10. Aceasta bucla este mai rapida
deoarece variabila In parcurge intregul domeniul de la 1 la 10 inainte ca variabila Out a
buclei exterioare sa termine prima iteratie. Cand bucla exterioara trece la o noua iteratie,
bucla interioara porneste din nou. Astfel, bocul de instructiuni din bucla interioara se
executa de 40 de ori in total.
O sursa de erori o reprezinta plasare incorecta a instructiuni Next. Intotdeauna bucla
interioara este cea care se termina prima, deci primul Next trebuie sa fie al buclei
interioare.
In contionuare se prezinta un exemplu de utilizare a buclelor imbricate.
Private Sub nested2()
' Bucla interioara este controlata de variabila buclei exterioare
For intOut as Integer = 5 To 1 Step -1
For intIn as Integer= 1 To intOut
MessageBox.Show(intOut & ” ” & intIn)
Next intIn
Next intOut
End Sub
Definitia unei proceduri poate include parametri declarati cu cuvintele cheie ByVal,
ByRef, Optional si ParamArray.
Procedurile Sub
O procedura Sub este un bloc de cod executat ca raspuns la un eveniment. Divizand
codul unui modul in proceduri Sub, este mult mai usoara gasirea sau modificarea unei
portiuni de cod din cadrul aplicatiei.
Sintaxa unei proceduri Sub este urmatoarea:
Private|Public|Friend|Protected [Shared] Sub nume_procedura (argumente)
instructiuni
End Sub
La fiecare apel al procedurii vor fi executate instructiunile dintre Sub si End Sub.
Instructiunea End Sub este adaugata automat de Visual Basic atunci cand se scrie
instructiunea de declarare a procedurii Sub. Procedurile Sub pot fi inserate in module
standard, module clasa sau module formular.
In Visual Basic 2005 lista de argumente care sunt date procedurii trebuie scrisa intre
paranteze, fie ca este apelata o procedura Sub sau o procedura Function. Cuvantul cheie
Call este optional, iar in practica este rar folosit.
Sub ProcOne()
ProcTwo(123, "abc") ’se apeleaza procedura ProcTwo
' De asemenea se poate folosi si cuvantul cheie Call.
Call ProcTwo(456, "def")
End Sub
In Visual Basic se face distinctie intre doua tipuri de proceduri Sub, si anume:
proceduri generale;
proceduri eveniment.
Proceduri generale
O procedura generala spune aplicatiei cum sa efectueze o anumita operatie. O data ce
o procedura generala este definita, ea trebuie apelata explicit de catre aplicatie. O
procedura eveniment ramane inactiva pana cand este apelata pentru a raspunde la
evenimente determinate de utilizator sau declansate de sistem.
Unul dintre motivele pentru care procedurile generale sunt necesare este faptul ca
mai multe proceduri eveniment ar putea sa aiba nevoie sa execute aceleasi actiuni. O
strategie de programare corecta este plasarea instructiunilor comune intr-o procedura
distincta (o procedura generala) si apelarea ei de catre procedurile eveniment. Aceasta
elimina necesitatea de a duplica acel cod si face aplicatia mai usor de intretinut.
Proceduri eveniment
Cand un obiect Visual Basic recunoaste aparitia unui eveniment, el apeleaza automat
procedura eveniment folosind numele controlului care a generat evenimentul si numele
corespunzator evenimentului.
O procedura eveniment are urmatoarea sintaxa:
Private Sub numeCtrl_numeEvent(sender as Object, e As EventArgs)Handles
numeCtrl.numeEvent
End Sub
Proceduri Function
Visual Basic cuprinde functii incluse, sau intrinseci, precum Math.Sqrt, Math.Cos. In
plus, instructiunea Function poate fi folosita pentru a scrie propriile proceduri Function.
Sintaxa unei proceduri Function este urmatoarea:
Private|Public|Protected|Friend [Shared] Function nume_procedura (argumente) As
tip
Instructiuni
Return valoare
End Function
Aceasta procedura Function este apelata la fel cum este apelata orice functie
incorporata din Visual Basic. De exemplu:
lbl1.Text = Ipotenuza(Integer.Parse(Text1.Text),Integer.Parse(Text2.Text))
’valorile catetelor se introduc in doua casete de text
sau
strX = Ipotenuza (Width, Height) ’valorile catetelor se afla in doua
variabile
End Module
Singura deosebire intre acest cod si cel de dinainte este declararea parametrului
metodei folosind cuvantul cheie ByRef. Daca se mai ruleaza o data codul se observa o
diferenta si anume aceea ca valoarea variabilei „a” dupa chemarea metodei ProcUnu este
2 in loc de 0. Aceasta s-a intamplat din cauza ca, folosirea cuvantului cheie ByRef pentru
declararea parametrului face ca metoda sa nu mai foloseasca o copie a valorii variabilei
trecuta functiei ci chiar valoarea acestei variabile. Acest lucru duce la modificarea valorii
originale a variabilei date ca argument metodei.
Dupa cum se observa, metoda (functia) Suma are 2 parametrii optionali a caror
valoare implicita este 0. Aceasta metoda poate fi acum chemata fara a i se da vreun
argument, caz in care se folosesc valorile implicite specificate in semnatura metodei. A
doua linie de cod din metoda Main cheama metoda Suma fara nici un argument si
rezultatul returnat va fi 0, dupa cum se poate observa din rularea codului. A 4 a linie de
cod cheama metoda Suma dand o valoare numai parametrului x. Pentru parametrul y
metoda va folosi valoarea implicita. Rezultatul Sumei in acest caz va fi 2. A 6 a linie de
cod da valori ambilor parametrii ai metodei si prin urmare rezultatul returnat va fi suma
acestor doi parametri.
Metoda Suma are declarat un parametru de tip intreg folosind cuvantul cheie
ParamArray. Aceasta inseamna ca metodei i se poate da ca argument un vector de
numere intregi de orice lungime. Metoda Main arata 2 moduri de folosire a unei astfel de
functii: prin specificarea fiecarui argument in parte sau prin declararea unui vector si
trecerea lui ca argument pentru metoda respectiva.
Aceasta metoda de definire a parametrilor pentru metode (proceduri/functii) este
suportata numai de Visual Basic. O alta metoda, care este suportata de toate limbajele din
pachetul Visual Studio si care are acelasi rezultat poarta numele de method overloading.
Aceasta metoda este recomandata in locul celei care foloseste cuvantul cheie Optional.
Tehnica method overloading presupune crearea mai multor metode (proceduri sau
functii) cu acelasi nume si care difera numai prin semnatura lor. Semnatura unei metode
este formata din: numele metodei, numarul de parametrii si tipul de date al acestor
parametrii.
Public Function DoubleIt(ByVal x As Long) As Long
instructiuni
End Function
In exemplul de mai sus se prezinta o functie al carui nume este DoubleIt si care ia un
singur argument de tip Long. Semnatura acestei metode este formata din numele ei si
numarul si tipul argumentelor sale asa cum se prezinta mai jos.
DoubleIt(Long)’semnatura functiei
End Module
Dupa cum se observa cele doua metode Suma au o lista diferita de parametri.
Functionalitatea InteliSense oferita de mediul VisualStudio recunoaste acest tip de
metode si listeaza sintaxa de folosire pentru fiecare dintre ele.
Se poate iesi dintr-o metoda (functie, procedura) si reda controlul codului care a
chemat-o in 3 moduri distincte. Aceasta se face prin folosirea cuvintelor cheie ExitSub,
ExitFunction si Return. Procedurile de tip Function pot returna o valoare prin atribuirea
acelei valori numelui functiei sau prin folosirea cuvantului Return ca in exemplul de mai
jos.
Function DoubleIt(ByVal x As Long) As Long
DoubleIt = x * 2
End Function
Prima functie returneaza o valoare prin atribuirea acelei valori numelui functiei, iar
cea de a doua prin folosirea cuvantului Return.
Folosirea cuvantului Return este recomandata pentru returnarea unei valori dintr-o
functie mai ales in cazul in care o functie are mai multe puncte posibile de iesire,
deoarece scuteste programatorul de a mai scrie in mod explicit ExitFunction. Folosirea
cuvantului Return fara un argument cauzeaza iesirea imediata din procedura. Un alt
avantaj al folosirii cuvantului Return este ca se poate schimba numele metodei (functiei)
fara a fi nevoie sa se modifice toate instantele numelui metodei (functiei) in interiorul
functiei.
In continuare se prezinta un exemplu de metoda(functie) care are doua puncte
posibile de iesire.
Function DaSauNu(ByVal n As Boolean) As Integer
If(n=True) Then
Return 1 ’returneaza 1 daca n=true
Else
Return 0 ’returneaza 0 daca n=false
End If
End Function
Functia din exemplul de mai sus poate returna 1 sau 0 in functie de valoarea
argumentului boolean „n” care s-a dat functiei.
Functii numerice
Sunt functii care realizeaza conversii si calcule cu date numerice.
Ca orice functie si functiile numerice returneaza o valoare de un anumit tip si
majoritatea acestor functii necesita unul sau mai multe argumente.
Functiile numerice se impart in functii de conversie si functii matematice.
Functii de conversie.
Pentru realizarea conversiilor intre diferitele tipuri de date numerice se folosesc
metodele clasei Convert. Aceste functii convertesc argumentul dat lor in diferite tipuri de
date cum ar fi Boolean, Byte, Char, Decimal, Integer, DateTime etc. In continuare se
prezinta o lista a functiilor de conversie oferite de aceasta clasa.
Convert.ToBoolean() –converteste argumentul dat in echivalentul sau boolean
Convert.ToByte()-converteste argumentul la un intreg pe 8 biti fara semn
Convert.ToChar()-converteste argumentul la un tip de date caracter
Convert.ToDateTime()-returneaza data si /sau ora specificata. Nu se efectueaza o
conversie
Convert.ToDecimal()
Convert.ToDouble()
Convert.ToInt16()
Convert.ToInt32()
Convert.Toint64()
Convert.ToSingle()
Convert.ToString()
Convert.ToBoolean()
Conversia de la linia 6 reuseste deoarece chiar daca variabila „b” este de tip
Integer, aceasta contine o valoare care incape intr-un tip de date Byte. Conversia de la
liniile 8, 9 nu reuseste deoarece valorile variabilelor „b” si respectiv „obj” nu pot intra
intr-un tip de date Byte. Conversia de la linia 10 reuseste deoarece valoarea continuta in
variabila de tip Object „obj” incape intr-o variabila de tip Integer. Conversia de la linia 11
nu reuseste deoarece variabila obj2 contine o valoare de tip String („portocale”) care nu
poate fi convertita la o variabila de tip integer. Conversia de la linia 12 reuseste deoarece
continutul variabilei obj2 poate fi convertit la o variabila de tip String. Conversia de la
linia 13 reuseste deoarece cu toate ca variabila obj3 contine o valoare de tip string,
aceasta valoare este un numar ce poate fi convertit la tipul de date byte. Acest tip de
conversie se poate aplica si in cazul urmator:
Dim s As String=”234”
Dim a As Byte=Convert.ToByte(s)
Pe langa functiile de conversie expuse de clasa Convert, fiecare tip de date (fie ca
este tip primitiv de date sau un tip de date creat de utilizator) expune o metoda pentru
conversia tipului respectiv de date la un sir de caractere. Aceasta metoda se cheama
ToString.
Dim s As String=123’nu este corect
Dim a As Byte=100
Dim ss As String=a’nu este corect
Dim s As String=a.ToString()’ este Ok
Prima si a treia linie de cod de mai sus genereaza o eroare de conversie in alte
limbaje din pachetul Visual Studio 2005, dar nu genereaza o eroare in VB deoarece
functia ToString() este chemata in mod implicit pentru a face conversia de la tipul de date
numeric la tipul de date String. Cu toate ca nu se genereaza o eroare este recomandata
chemarea explicita a functiei ToString dupa cum se arata in ultima linie de cod.
Functii matematice
Functiile matematice predefinite sunt expuse de clasa Math. Cateva dintre acestea
sunt: Acos, Asin, Atan, Cos, Sin, Log, Sqrt, Tan, Exp.
Exp returneaza e ridicat la puterea specificata de argumentul functiei.
Sqrt returneaza radacina patrata din argumentul specificat.
Log returneaza logaritmul natural al argumentului specificat.
Clasa Math expune si doua constante matematice si anume e=2.718282 si pi=3.1415.
Exemple:
intVar1=Math.Sqrt(4) ’ intVar1=2
intVar1=Math.Sqrt(64) ’ intVar1=8
intVar1=Math.Sqrt(25) ’ intVar1=5
Exemplu:
Private Sub btnRnd_Click(sender As Object, e As EventArgs)Handles btnRnd.Click
min=Integer.Parse(txtMin.Text)
max=Integer.Parse(txtMax.Text)
MessageBox.Show(String.Format("Numarul random este: {0}", nr.Next(min, max)))
End Sub
In exemplul de mai sus utilizatorul introduce limitele intre care vrea sa genereze un
numar aleator in 2 casete de text txtMin si respectiv txtMax. Apoi programul afiseaza
numarul generat prin intermediul unei casete de mesaj.
In continuare se prezinta un exemplu de joc. Computer-ul genereaza un numar aleator
intre 1 si 100 si apoi, utilizand casete de mesaje, ofera utilizatorului sugestii pana cand
acesta ghiceste numarul. La sfarsit afiseaza un mesaj care informeaza utilizatorul la a cata
incercare a ghicit numarul.
Formularul utilizat contine o eticheta, o caseta cu text si doua butoane de comanda
(fig.2.2.), avand proprietatile setate ca in tabelul urmator.
End Class
Compararea sirurilor
Cea mai eficienta metoda de a vedea daca doua siruri sunt egale este sa vedem daca
variabilele care contin sirurile arata spre aceeasi zona de memorie. Aceasta se face
folosind functia String.ReferenceEquals(). Aceasta functie ia 2 parametrii de tip Object si
returneaza o valoare booleana in functie de rezultatul comparatiei.
Daca 2 variabile nu arata spre aceeasi adresa de memorie este necesara realizarea unei
comparatii caracter cu caracter. Pentru aceasta mediul .NET ofera metoda String.Equals()
care realizeaza atat o comparare a zonelor de memorie cat si a valorilor variabilelor.
Aceasta operatie se poate descrie in felul urmator: Daca variabilele arata spre aceeasi
zona de memorie atunci sirurile sunt egale, altfel daca adresele nu sunt egale compara
sirurile caracter cu caracter.
In continuare se prezinta un exemplu de folosire a acestei metode.
string poem1 = "Kubla Khan"
string poem2 = "Kubla Khan"
string poem3 = String.Copy(poem2)
string poem4 = "kubla khan"
’//
Console.WriteLine(String.Equals(poem1,poem2)) ’true
Console.WriteLine(poem1.Equals(poem3) ’true
Console.WriteLine(poem1 = poem3) ’echivalent cu Equals
Console.WriteLine(poem1 = poem4) ’false-deoarece un sir contine si litere mari
Transformarea sirurilor
Tabelul urmator prezinta un sumar al celor mai importante functii de modificare a
sirurilor.
Functia de formatare
Functia de formatare se numeste String.Format si este principala metoda folosita
pentru formatarea datelor numerice si calendaristice. Accepta un argument de tip string
compus din text si elemente speciale de formatare. Pe langa argumentul de tip string
accepta unul sau mai multe argumente care reprezinta datele supuse formatarii. In
continuare se prezinta un exemplu simplu de folosire a acestei metode.
Dim s as String=String.Format(„Radacina patrata a lui {0} este {1}.”,4,2)
’s va contine valoarea „Radacina patrata a lui 4 este 2.”
Aceasta metoda are mai multe variante, dar aceasta este cea mai comuna si ilustreaza
2 elemente importante prezente in toate variantele: un sir de formatare si o lista de
argumente.
Figura urmatoare desparte un exemplu de folosire al metodei Format in elementele
sale componente.
Format Example—
Specifier Description Example—English German
F Full date/time pattern (full time) Monday, January 19, Montag, 19 Januar,
2004 4:05:20 PM 2004 16:05:20
Functii speciale
Functiile speciale se refera la functiile care lucreaza cu date calendaristice si ore.
Functiile pentru lucrul cu aceste data sunt expuse de catre clasa Date. Acestea permit
citirea datei curente, operatii de adunare si scadere cu data calendaristice si multe altele.