|
Cand executati calcule in Visual Basic de foarte multe ori este necesar sa stocati tenporar valorile. Spre exemplu, este posibil sa calculati cateva valori, sa le comparati si in functie de rezultatul comparatiei sa executati diferite operatii cu ele. Trebuie sa pastrati valorile daca vreti sa le comparati, dar nu trebuie sa le stocati intr-o proprietate a unui control.
In Visual Basic, la fel ca majoritatea limbajelor de programare, stocarea temporara a valorilor se realizeaza folosind variabile, constante si tablouri.
In Visual Basic, puteti folosi variabilele pentru stocarea temporara a valorilor pr timpul executiei unei aplicatii. Variabilele au un nume (cuvantul pe care-l folositi pentru a referi valoarea continuta de variabila) si un tip de data (care determina tipul de data pe care il poate stoca variabila).
Va puteti gandi la o variabila ca la un loc din memorie pentru a valoare necunoscuta. Spre exemplu, imaginati-va ca trebuie sa creati un program pentru un magazin de fructe care sa urmareasca vanzarea lor. Pana cand nu se produce vanzarea, nu cunoasteti cantitatea vanduta si valoarea vanzarilor. Puteti utiliza doua variabile, sa le denumim PretFructe si CantFructe. De fiecare data cand se ruleaza programul, utilizatorul introduce valorile pentru cele doua variabile. Pentru a calcula si afisa valoarea vanzarii intr-o caseta de text, denumita txtTotal, codul ar trebui sa arate astfel:
txtTotal.Text = PretFructe * CantFructe
In functie de valorile introduse de utilizator expresia va returna de fiecare data un rezultat diferit. Variabilele va permit sa faceti calcule fara a cunoaste dinainte ce valori se introduc.
In acest exemplu, tipul de data pentru PretFructe poate fi Currency; tipul de data pentru CantFructe ar putea fi un intreg sau real. Variabilele pot reprezenta multe alte valori, cum ar fi: text, date calendaristice, diferite tipuri numerice, chiar si obiecte.
Pentru a executa calcule si a atribui rezultatul unei variabile puteti folosi instructiunea de atribuire. Sintaxa unei instructiuni de atribuire este urmatoarea:
<variabila> <expresie>
unde: <variabila> reprezinta numele variabilei in care se va stoca rezultatul calculului indicat prin <expresie>.
Spre exemplu:
CantFructe = 10 ' Valoarea 10 este atribuita variabilei.
CantFructe = CantFructe + 1 ' Variabila este incrementata.
Remarcati faptul ca, in acest exemplu semnul egal (=) este un operator de atribuire, nu un operator de egalitate.
In Visual Basic, in mod prestabilit tipul de date al variabilelor este Variant. Pentru a declara o variabila si eventual a-i asocia un tip de data diferit de Variant se folosesc instructiunile de declarare Public, Dim, Private sau Static. Sintaxa instructiunii de declarare a unei variabile este urmatoarea:
Public | Dim | Private | Static <nume_var> [As <tip_data>
unde <nume_var> este numele asociat variabilei si trebuie sa respecte urmatoarele conditii:
Sa inceapa cu o litera
Sa nu contina caracterul punct sau caractere de declarare tip (#, $).
Sa nu contina mai mult de 255 caractere.
Sa fie unic in acelasi domeniu (in engleza, scope), care este locul unde variabila poate fi referita - o procedura, un modul etc.
Clauza optionala As <tip_data> din instructiunea de declarare permite definirea tipului de data sau de obiect al variabilei; adica tipul informatiei ce se va stoca in variabila. Exista cateva moduri de a declara variabilele:
Declararea unei variabile in sectiunea Declarations a unui modul de formular, standard sau de clasa in loc sa fie declarata in interiorul unei proceduri face ca variabila sa fie accesibila tuturor procedurilor din modulul respectiv.
Declararea variabilelor folosind cuvantul cheie Public face ca ele sa fie accesibile in toata aplicatia.
Declararea unei variabile folosind cuvantul cheie Static determina pastrarea valorii acesteia chiar si dupa terminarea procedurii in care ea a fost definita.
Nu este obligatoie declararea unei variabile inainte de utilizarea ei. Spre exemplu, puteti scrie o functie unde nu trebuie sa declarati variabila ValTmp inainte de utilizarea ei:
Function Radical(num)
ValTmp = Abs(num)
Radical = Sqr(ValTmp)
End Function
Visual Basic creaza automat o variabila cu numele specificat, pe care o puteti utiliza ca si cand ar fi fost declarata explicit. Totusi acest procedeu poate determina aparitia in cod a unor erori subtile atunci cand scrieti gresit un nume de variabila. Spre exemplu, sa presupunem ca ati scris functia anterioara astfel:
Function Radical(num)
ValTmp = Abs(num)
Radical = Sqr(ValTp)
End Function
La prima vedere, pare identica. Dar, variabila ValTemp a fost scrisa gresit in ultima linie (ValTp in loc de ValTmp) si ca urmare functia va returna intotdeauna 0. Cand Visual Basic intalneste un nou nume, el nu poate determina daca declarati implicit o noua variabila sau ati scris gresit un nume de variabila existenta, astfel ca va crea o noua variabila cu numele respectiv.
Pentru a evita problemele care pot sa apara in cazul declararilor implicite de variabile, puteti indica mediului Visual Basic ca intotdeauna sa va avertizeze atunci cand intalneste un nume care nu a fost declarat ca variabila. Pentru a forta declararea explicita a variabilelor se foloseste instructiunea Option Explicit
Avand aceasta instructiune in modulul de fromular sau standard care contine functia Radical, Visual Basic va interpreta variabilele ValTmp si ValTp ca fiind variabile nedeclarate si va genera eroarea corespunzatoare pentru ambele variabile. Pentru a elimina erorile trebuie sa declarati explicit variabila ValTmp:
Function Radical(num)
Dim ValTmp
ValTmp = Abs(num)
Radical = Sqr(ValTp)
End Function
Acum va rezulta o eroare datorita faptului ca ValTp a fost tastat gresit. Deoarece instructiunea Option Explicit va ajuta sa detectati erorile cauzate de tastarea gresita a unor nume de variabile, este indicat sa o folositi peste tot in codul dumneavoastra.
Nota Deoarece instructiunea Option Explicit opereaza in modul, ea trebuie plasata in sectiunea Declarations a oricarui modul de formular, standard si de clasa in care vreti ca Visual Basic sa forteze declararea explicita a variabilelor. Daca activati caseta de validare Require Variable Declaration din eticheta Editor a casetei de dialog Options (se afiseaza selectand comanda Options din meniul Tools) Visual Basic insereaza instructiunea Option Explicit in toate modulele de formular, standard si de clasa ce se vor crea ulterior, dar nu o adauga in codul deja existent. In modulele deja existente in proiect trebuie sa adaugati manual Option Explicit.
Domeniul unei variabilei defineste ce parte a codului va recunoaste variabila respectiva. Cand declarati o variabila in interiorul unei proceduri, numai codul din procedura respectiva poate accesa sau schimba valoarea variabilei; deci variabila are un domeniu ce este local in procedura respectiva. Totusi, de foarte multe ori aveti nevoie de o variabila cu un doemniu mai larg, cum ar fi o variabila a carei valoare sa fie accesibila tuturor procedurilor dintr-un modul sau chiar intregii aplicatii. Visual Basic va permite sa definiti domeniul unei variabile atunci cand o declarati, prin utilizarea cuvintelor cheie Public si Private.
In functie de modul de declarare a variabilei, domeniul ei este fie la nivel de procedura (local) fie la nivel de modul.
Domeniu
Private (locale)
Public (globale)
Nivel procedura
Variabilele sunt recunoscute doar in procedura in care apar.
Nu se aplica. Intr-o procedura nu se pot declara variabile globale.
Nivel modul
Variabilele sunt recunoscute doar in modulul in care apar.
Variabilele sunt recunoscute in toate modulele.
Variabilele de nivel procedura sunt recunoscute doar in procedura in care ele au fost declarate. Ele sunt cunoscute si sub numele de variabile locale. Variabilele de acest nivel se pot declara intr-o procedura prin utilizarea cuvintelor cheie Dim sau Static. Spre exemplu:
Dim intTemp As Integer
Static intPermanent As Integer
Valorile din variabilele declarate cu Static exista pe tot timpul rularii aplicatiei, in timp ce variabilele declarate cu Dim exista numai cat timp procedura respectiva este in executie.
Variabilele locale sunt foarte bune pentru orice gen de calcule temporare. Spre exemplu, puteti crea o duzina de proceduri continand o variabila numita intTemp. Cat timp fiecare intTemp este declarata ca o variabila locala, fiecare procedura va recunoaste propria sa versiune a lui intTemp. Oricare procedura poate altera doar valoarea variabilei intTemp proprii, fara a afecta variabilele intTemp din alte proceduri.
In mod prestabilit, o variabila de nivel modul este accesibila tuturor procedurilor din acel modul, dar nu si in codul din celelalte module. Puteti crea variabile de nivel modul declarandu-le in sectiunea Declarations a modulului folosind cuvantul rezervat Private sau Dim. Spre exemplu:
Private intTemp As Integer
La nivel de modul, nu exista nici o diferenta intre cuvintele cheie Private si Dim, dar este preferat Private deoarece contrasteaza mai bine cu Public si face codul mai usor de inteles.
Pentru a face ca o variabila de nivel modul sa fie accesibila din toate modulele se foloseste cuvantul cheie Public la declararea varabiulei. Valorile din variabilele publice sunt disponibile pentru toate procedurile din aplicatia respectiva. La fel ca toate variabilele de nivel modul, variabilele publice sunt declarate in sectiunea Declarations a modulului. Spre exemplu:
Public intTemp As Integer
Nota Nu puteti declara variabile publice in interiorul unei proceduri, ci numai in sectiunea Declarations a unui modul.
Daca variabilele publice din module diferite au acelasi nume, este posibil sa le diferentiati in cod prin referirea lor atat cu numele modulului cat si cu numele variabilelor. Spre exemplu, daca exista o variabila publica intX de tip Integer atat in formularul Form1 cat si in modulul Modul1, le puteti referi ca Form1.intX si Modul1.intX pentru a obtine valorile lor corecte. Acest mod de adresare se numeste adresare cu calificare.
Pentru a vedea cum lucreaza acest mod de referire, inserati doua module standard intr-un nou proiect si plasati trei butoane de comanda pe un formular.
O variabila, intX, este declarata in primul modul standard, Modul1.Procedura Test seteaza valoarea acesteia:
Public intX As Integer' Declararea variabile intX in Modul1.
Sub Test()
' Setarea valorii pentru intX in Modul1.
intX = 1
End Sub
A doua variabila, care are acelasi nume, intX, este declarata in al doilea modul standard, Modul2. Din nou, o procedura standard numita Test seteaza valoarea acesteia:
Public intX As Integer' Declararea variabile intX in Modul2.
Sub Test()
' Setarea valorii pentru intX in Modul2.
intX = 2
End Sub
A treia variabila intX este declarata in modulul formularului. Si din nou, o procedura numita Test seteaza valoarea acesteia.
Public intX As Integer' Declararea variabilei intX in formular.
Sub Test()
' Setarea valorii pentru intX in formular.
intX = 3
End Sub
Fiecare dintre procedurile evenimentului Click a celor trei butoane de comanda apeleaza procedura Test corespunzatoare si foloseste procedura MsgBox pentru a afisa valorile celor trei variabile.
Private Sub Command1_Click()
Module1.Test ' Apeleaza Test din Modul1.
MsgBox Module1.intX ' Afiseaza valoarea intX din Modul1.
End Sub
Private Sub Command2_Click()
Module2.Test ' Apeleaza Test din Modul2.
MsgBox Module2.intX ' Afiseaza valoarea intX din Modul2.
End Sub
Private Sub Command3_Click()
Test ' Apeleaza Test din formular.
MsgBox intX ' Afiseaza valoarea intX din formular.
End Sub
Rulati aplicatia si executati clic pe fiecare din cele trei butoane de comanda. Veti vedea referirea separata a celor trei variabile publice. Remarcati faptul ca in procedura evenimentului Click a celui de-al treilea buton de comanda nu este necesara referirea sub forma Form1.Test cand este apelata procedura Test a formularului sau Form1.intX cand este apelata variabila intreaga a formularului. Daca exista mai multe proceduri si variabile cu acelasi nume, Visual Basic ia in considerarea variabilele cele mai locale, care in acest caz, este variabila lui Form1.
Pe langa domeniu de acces (in engleza scope), variabilele au si o durata de viata (in engleza lifetime), perioada de timp in care ele retin valoarea atribuita. Valorile din variabilele publice si de nivel modul pastreaza valorile pe toata durata executiei aplicatiei. Totusi, variabilele locale definite cu Dim exista numai cat timp procedura in care au fost declarate se executa. In mod normal, la terminarea procedurii, valorile variabilelor sale locale nu sunt pastrate si memoria ocupata de aceste variabile este eliberata. La urmatorul apel al procedurii, toate variabilele sale locale sunt initializate.
Totusi, puteti pastra valoarea unei variabile locale prin declararea ei ca fiind statica, folosind cuvantul cheie Static la declararea variabilei in interiorul unei proceduri.
Spre exemplu, urmatoarea functie realizeaza o totalizare prin adaugarea noii valori la totalul anterior stocat in variabila statica Total:
Function TotalVanzari(num)
Static Total
Total = Total + num
TotalVanzari = Total
End Function
Daca Total ar fi fost declarat cu Dim in loc de Static, valoarea cumulata anterior nu s-ar fi pastrat de-a lungul apelurilor functiei si functia ar fi returnat chiar valoarea cu care a fost apelata.
Puteti obtine acelasi rezultat declarand Total in sectiunea Declarations a modulului, facand-o astfel o variabila de nivel modul. In acest caz, domeniul variabilei este schimbat si ea ar putea fi accesata si de alte proceduri din modul, alterand astfel rezultatul corect. Daca este declarata ca variabila statica ea va putea fi apelata doar de procedura in care a fost definita.
Pentru a face ca toate variabilele locale dintr-o procedura sa fie statice se plaseaza cuvantul Static la inceputul antetului procedurii. Spre exemplu:
Static Function TotalVanzari(num)
determina ca toate variabilele locale definite in procedura sa fie statice, indiferent daca ele sunt declarate cu Static, Dim, Private sau sunt declarate implicit. Puteti plasa cuvantul Static in fata oricarui antet de procedura Sub sau Function, inclusiv in fata antetului procedurilor eveniment.
De foarte multe ori veti constata ca in cod apar valori constante care se repeta. Sau este posibil sa observati ca programul depinde de valori ce sunt dificil de memorat - valori, care nu sugereaza o anumita semnificatie.
In asemenea cazuri, puteti mari gradul de intelegere al codului si il puteti face mai usor de intretinut prin utilizarea constantelor. Constanta este un nume sugestiv plasat in locul unui numar sau sir de caractere. Constanta se deosebeste de o variabila prin faptul ca unei constante nu-i puteti atribui o noua valoare si nici nu-i puteti modifica valoarea pe timpul executiei. Exista doua surse pentru constante:
Constantele intrinsici (sau definite de sistem) - sunt furnizate de aplicatii si controale. Constantele Visual Basic se gasesc in bibliotecile obiect din Visual Basic (VB) si Visual Basic pentru aplicatii (VBA). Alte aplicatii care furnizeaza biblioteci obiect, cum ar fi Microsoft Excel si Microsoft Project, au o lista de constante pe care o puteti utiliza cu obiectele, metodele si proprietatile acestora. De asemenea, in biblioteca obiect a fiecarui control ActiveX sunt definite constante specifice
Constantele simbolice (sau definite de utilizator) - sunt specifice fiecarei aplicatii si sunt definite de catre programator prin utilizarea declaratiei Const
In Visual Basic, constantele intrinseci sunt denumite folosind un format mixt (cu litere mari si mici), avand un prefix ce indica biblioteca obiectului in care sunt definite. Constantele din bibliotecile obiect Visual Basic si Visual Basic pentru Aplicatii sunt prefixate cu 'vb'; spre exemplu, vbTileHorizontal. Prefixele sunt destinate evitarii coliziunilor accidentale in cazurile cand au nume identice si reprezinta valori diferite. Chiar si cu aceste prefixe, este posibil ca doua biblioteci obiect sa contina constante identice care sa reprezinta de fapt valori diferite. In acest caz valoarea constantei referite va depinde de biblioteca obiect care are prioritatea mai mare. Pentru a fi absolut siguri ca se evita coliziunile de nume ale constantelor, puteti califica referintele la constante folosind urmatoarea sintaxa:
[<nume_biblioteca>.][<nume_modul>.]<nume_constanta>
unde:
<nume_biblioteca> este, in mod normal, numele clasei controlului sau bibliotecii.
<nume_modul> este numele modulului in care se defineste constanta.
<nume_constanta> este numele propriu-zis al constantei.
Pentru a crea in aplicatii constante simbolice proprii se foloseste instructiunea Const care are urmatoarea sintaxa:
[Public|Private] Const <nume_const> [As <tip> <expr>
unde:
<nume_const> este numele asociat constantei (respectand aceleasi reguli ca si la denumirea variabilelor)
<tip> este tipul de data al constantei
<expr> este o expresie care prin evaluare furnizeaza valoarea constantei (de tip numeric, sir de caractere sau data/timp). In <expr> nu se pot utiliza apeluri de functii.
Exemple
Const conPi = 3.14159265358979
Public Const conMaxPlanete As Integer = 9
Const conDataVersiune = #1/1/95#
Public Const conVersiune = '07.10.A'
Const conNumeCod = 'Enigma'
Nota Pentru ca unei constante sa i se atribuie o valoare de tip data calendaristica sau timp, este necesar ca valoarea sa fie inclusa intre doua caractere #.
Cu o singura instructiune de declarare a constantelor simbolice, Const, se pot preciza mai multe constante prin separare lor cu virgule. Spre exemplu, urmatoarea linie de cod declara trei constante:
Public Const conPi = 3.14, conMaxPlanete = 9, conPopLumii = 6E+09
De cele mai multe ori, expresia din dreapta semnului egal este un literal numeric sau sir, dar poate fi si o expresie al carui rezultat este un numar sau un sir de caractere. Puteti defini constante in termenii constantelor definite anterior:
Const conPi2 = conPi * 2
Dupa definirea constantelor, le puteti utiliza in cod pentru a-l face mai usor de inteles. Spre exemplu:
Static SistemSolar(1 To conMaxPlanete)
If numPopulatie > conPopLumii Then Exit Sub
O declaratei Const are acelasi domeniu ca si o declaratie de variabila si aceleasi reguli de aplicare:
Pentru a crea o constanta care sa existe numai in interiorul unei proceduri, se declara constanta in procedura respectiva.
Pentru a crea o constanta accesibila tuturor procedurilor dintr-un modul, dar nu si in afara modulului, se declara constanta in sectiunea Declarations a modulului.
Pentru a crea o constanta accesibila in intreaga aplicatie (constanta globala), se declara constanta intr-un modul standard si se plaseaza Public in fata declaratiei Const. Intr-un modul de formular sau de clasa nu se pot declara constante globale.
Variabilele sunt locatii de memorie folosite pentru stocarea valorilor; ele au un nume si un tip de date. Tipul de data al unei variabile determina spatiul de memorie necesar pentru stocarea datelor, modul de reprezentare in memorie a datelor, limitele valorilor permise si operatiile ce se pot aplica asupra datei respective.
In mod prestabilit, daca nu furnizati un tip de data, o variabila va fi de tipul Variant. Tipul de data Variant este asemenea unui cameleon - el poate reprezenta, in situatii diferite, multe tipuri de date. Nu este necesar sa executati conversii intre aceste tipuri de date atunci cand le atribuiti unei variabile Variant. Visual Basic executa in mod automat conversia necesara.
Totusi, daca stiti ca o variabila va stoca intotdeauna un anumit tip de data, Visual Basic poate manipula mult mai eficient data respectiva, daca declarati o variabila a acelui tip. Spre exemplu, variabila pentru stocarea numelui unei persoane este cel mai bine reprezentat ca un tip de data sir de caractere, deoarce un nume este intotdeauna format din caractere.
Tipurile de date se aplica si altor lucruri in afara variabilelor. Cand atribuiti o valoare unei proprietati, acea valoare are un tip de data; argumentele pentru functii au de asemenea tipuri de date. De fapt, orice din Visual Basic care invoca date presupune si tipuri de date.
Pentru a declara o variabila de un tip diferit de Variant se foloseste clauza As <tip> in declaratia Private, Public, Dim sau Static a variabilei respective. Spre exemplu, urmatoarele declaratii definesc un tip Integer, Double, String si respectiv Currency:
Private I As Integer
Dim Amt As Double
Static NumePrenume As String
Public ValoareFactura As Currency
O instructiune de declarare poate combina mai multe declaratii:
Private I As Integer, Amt As Double
Private NumePrenume As String, ValoareFactura As Currency
Private Test, Cantitate, J As Integer
Nota Daca unei variabile nu-i precizati un tip de data, variabilei i se va asocia tipul prestabilit. In exemplul anterior, variabilele Test si Cantitate sunt de tip Variant. Aceasta poate sa va surprinda, daca aveti experienta in alte limbaje de programare, unde toate variabilele din aceasi instructiune de declarare au acelasi tip, cel specificat la sfarsitul sau inceputul (in acest caz, Integer), in functie de limbajul de programare utilizat.
Visual Basic are cateva tipuri de date numerice: Integer (intreg), Long (intreg lung), Single (virgula mobila simpla precizie), Double (virgula mobila dubla precizie) si Currency (monetar). Tipul de data numeric foloseste, in general, mai putin spatiu decat un Variant, in care se stocheaza o data de tip numeric.
Datele de tip Integer sunt stocate ca numere intregi cu semn pe 16 biti (2 bytes), cu valori cuprinse intre -32768 si 32767. Pentru declararea implicita a unei variabile de tip Integer se foloseste caracterul %.
Vaiabilele Integer pot fi utilizate si pentru a reprezenta valori enumerate. O valoare enumerata poate contine un set finit de numere intregi, fiecare avand o smnificatie speciala in contextul in care este folosit. Valorile enumerate asigura o metoda convenabila de a selecta dintr-un numar limitat de optiuni; spre exemplu, black = 0, white = 1 etc. In practica, pentru fiecare valoare enumerata se foloseste o instructiune Const, pentru a declara constanta respectiva.
Datele de tip Long (intreg lung) sunt stocate pe 32 biti (4 byte) ca numere intregi cu semn avand valori cuprinse intre -2147483648 la 2147483647. Pentru declararea implicita a unei variabile de tip Long se foloseste caracterul &.
Datele de tip Single sunt stocate ca numere reale in virgula mobila pe 32 biti (4 bytes) in format IEEE[1]. Domeniul de valori permise este cuprins intre -3.402823E38 si
-1.401298E-45 pentru numere negative si intre 1.401298E-45 si 3.402823E38 pentru numere pozitive. Pentru declararea implicita a unei variabile de tip Single se foloseste caracterul !.
Datele de tip Double (virgula mobila dubla precizie) sunt stocate ca numere reale in virgula mobila pe 64 biti (8 bytes) in format IEEE. Domeniul valorilor permise este cuprins intre -1.79769313486232E308 si -4.94065645841247E-324 pentru valorile negative si intre 4.94065645841247E-324 si 1.79769313486232E308 pentru cele pozitive. Pentru declararea implicita a unei variabile de tip Single se foloseste caracterul #.
Nota Valorile in virgula mobila simpla precizie (de tip Single) pot fi exprimate sub forma mmmEeee iar cele in dubla precizie (de tip Double) sub forma mmmDeee, in care mmm este mantisa iar eee este exponentul (o putere a lui 10). Literele E si D sunt folosite atat drept caractere de separare intre mantisa si exponent cat si pentru a indica precizia.
Datele de tip Currency sunt stocate pe 64 biti (8 bytes) ca numere in virgula fixa, scalate cu 10000, obtinandu-se astfel valori cu 15 cifre la partea intreaga si 4 cifre la cea zecimala. Aceasta forma de reprezentare a datelor asigura un interval de valori cuprins intre -22337203685477.5808 si 922337203685477.5807. Caracterul de declarare implicita a tipului pentru Currency este @. Tipul de date Currency este util pentru calcule care implica valori monetare si pentru calcule in virgula fixa in care precizia este importanta .
Datele de tip Decimal sunt stocate pe 96 biti (12 bytes) ca intregi fara semn scalati cu o putere variabila a lui 10. Exponentul factorului de scalare (puterea lui 10) specifica numarul de zecimale si poate fi o valoare in intervalul 0 la 28. Cu un factor de scalare 0 (fara zecimale), cea mai mare valoare posibila este +/-79228162514264337593543950335. Cu 28 zecimale cea mai mare valoare posibila este +/-7.9228162514264337593543950335, iar ce mai mica diferita de zero este +/-0.0000000000000000000000000001.
Nota In acest moment, datele de tip Decimal pot fi folosite numai ca un Variant, adica nu nu puteti declara o variabila de tip Decimal. Totusi, puteti crea un Variant al carui subtip este Decimal folosind functia CDec.
Datele de tip Byte sunt stocate pe 8 biti (1 byte) ca intregi fara semn, putand avea valori intre 0 si 255. Acest tip de date este util atunci cand se prelucreaza binar datele, spre exemplu manipularea datelor din fisierele binare. Utilizarea variabilelor Byte pentru stocarea datelor binare le pastreaza pe timpul conversiei formatului. Cand variabilele de tip String sunt convertite intre formatele ANSI si Unicode, toate datele binare din variabila sunt deformate. Visual Basic poate converti autoamt intre formatele ANSI si Unicode atunci cand:
Se citeste din fisiere
Se scrie in fisiere
Se apeleaza biblioteci DLL
Se apeleaza metode si proprietati ale obiectelor
Toti operatorii care lucreaza asupra intregilor se pot aplica si tipului de date Byte, exceptand operatorul unar minus. Deoarece Byte este un tip fara semn cu domeniul 0-255, acesta nu poate reprezenta un numar negativ.
Observatie Toate variabilele numerice pot fi atribuite intre ele si tipului Variant. Visual Basic rotunjeste partea fractionara a numerelor in virgula mobila inainte de a realiza atribuirea la un intreg.
n Visual Basic 6.0 se pot folosi doua tipuri de siruri: de lungime variabila si de lungime fixa. Un sir de lungime variabila poate contine pana la 2 bilioane (231) caractere, in timp ce un sir de lungime fixa poate contine de la 1 la aproximativ 65536 (216) caractere.
Nota Un sir de lungime fixa nu poate fi declarat Public intr-un modul de clasa.
Codurile caracterelor dintr-un String au valori intre 0 si 255. Primele 128 de caractere (codurile 0 la 127) ale setului de caractere corespund literelor si simbolurilor de pe tastatura standard U.S. Aceste prime 128 caractere sunt aceleasi cu cele definite de catre setul de caractere ASCII . Urmatoarele 128 caractere (codurile de la 128 la 255) sunt caractere speciale, cum ar fi literele din alfabetul international, accentele, simbolurile monetare si fractiile.
Pentru declararea implicita a unei variabile de tip String se foloseste caracterul $.
In mod prestabilit, o variabila sau un argument sir este un sir de lungime variabila; sirul se mareste sau se micsoreaza in functie de noua valoare pe care o atribuiti acestuia. Puteti declara si siruri de lungime fixa, folosind o clauza As cu urmatoarea sintaxa:
As String * dimensiunea
Spre exemplu, pentru a declara un sir care va avea intotdeuana 50 caractere se foloseste o linie de cod de forma:
Dim NumeFunc As String * 50
Daca variabilei NumeFunc ii atribuiti o valoare care are mai putin de 50 de caractere, Visual Basic va adauga spatiile necesare, la sfarsitul sirului, pentru ca acesta sa aiba exact 50 de caractere. Daca unui sir de lungime fixa i se atribuie o valoarea care are mai mult de 50 caractere, Visual Basic truncheaza caracterele care exced lungimea declarata.
Deoarece sirurile de lungime fixa au spatii suplimentare la sfarsit, s-ar putea ca uneori sa fiti nevoiti sa apelati la functia RTrim pentru a le elimina, in special atunci cand se executa operatii de comparare intre siruri.
Sirurile de lungime fixa din modulele standard pot fi declarate folosind cuvintele cheie Public sau Private. In modulele de formular si clasa, sirurile de lungime fixa trebuie sa fie declarate cu Private.
Puteti atribui o valoare sir unei valori numerice, daca aceasta reprezinta un numar. De asemenea, este posibil sa atribuiti o valoare numerica unui sir. Spre exemplu, pe un formular plasati un buton de comanda, o caseta de text si o caseta cu lista. In procedura evenimentului Click a butonului de comanda introduceti codul prezentat in continuare.
Private Sub Command1_Click()
Dim intX As Integer
Dim strY As String
strY = '100.23'
intX = strY' Transmite un sir unei variabile numerice.
List1.AddItem Cos(strY)' Adauga cosinusul numarului in lista.
strY = Cos(strY)' Transmite cosinusul variabilei sir.
Text1.Text = strY ' Variabila sir este afisata in caseta de text
End Sub
Rulati aplicatia si executati clic pe butonul de comanda. Visual Basic va converti automat variabilele la tipul de data corespunzator. Acest procedeu, conversia automata, trebuie folosit cu precautie atunci cand schimbati intre ele sirurile si numerele; transmiterea unei valori nenumerice intr-un sir va determina aparitia unei erori de executie.
Datele de tip Boolean sunt stocate in memorie ca numere pe 16 biti (2 bytes), insa ele pot avea doar doua valori True sau False. Variabilele Boolean sunt afisate sub forma True sau False (cand se foloseste Print) sau sub forma #TRUE# sau #FALSE# (cand se utilizeaza Write #). Pentru a atribui unui Boolean una din cele doua stari se folosesc cuvintele cheie True sau False.
Cand alte tipuri numerice sunt convertite in Boolean, 0 devine False iar toate celelalte valori devin True. Cand un Boolean este convertit in alte tipuri de date, False devine 0 iar True devine -1.
Valoarea prestabilita a unei variabile de tip Boolean este False.
Tipul de date Date asigura stocarea datelor calendaristice si a timpului sub forma de numere in virgula fixa pe 64 biti (8 bytes). Domeniul de valori permise pentru datele calendaristice este cuprins intre 1 Ianuarie 100 si 31 Decembrie 9999, iar pentru timpi valorile permise sunt cuprinse intre 0:00:00 si 23:59:59. Literalii de tip Date se includ intre caracterele #; spre exemplu, #January 1, 1993#.
Variabilele Date afiseaza datele in concordanta cu formatul scurt al datelor recunoscut de sistem. Timpii sunt afisati in concordanta cu formatul timpului (pe 12 sau 24 ore) impus de sistem. Cand alte tipuri de date sunt convertite la tipul Date, partea intreaga reprezinta data calendaristica, iar partea zecmala reprezinta timpul. Miezul noptii este 0, iar miezul zilei este 0.5. Numerele negative reprezinta date calendaristice inainte de 30 Decembrie 1899.
Variabilele de tip Object permit stocarea de numere ce reprezinta adrese de 32 biti (4 bytes) care se refera la obiecte din interiorul unei aplicatii sau din alte aplicatii. O variabila declarata ca Object este una careia in continuare i se va atribui o adresa (folosind o instructiune Set) pentru a referi un obiect real recunoscut de aplicatie. Spre exemplu:
Dim objDb As Object
Set objDb = OpenDatabase('c:Vb6Biblio.mdb')
Cand declarati variabile Object, incercati ca in locul tipului generic Object sa folositi clasele specifice (cum ar fi, TextBox in loc de Control sau in exemplu anterior, Database in loc de Object). Visual Basic poate rezolva astfel, referintele la proprietatile si metodele obiectelor cu tipuri specificate inainte de rularea aplicatiei.
Cand lucrati cu obiecte ale altor aplicatii, in loc sa folositi un Variant sau un generic Object, declarati obiectele asa cum sunt ele prezentate in lista Classes din Object Browser. Aceasta va asigura ca Visual Basic sa recunoasca tipul specific de obiect pe care-l referiti; referinta propriu-zisa fiind rezolvata la executie.
Visual Basic dispune de functii de conversie (vezi tabelul urmator) pe care le puteti utiliza pentru a transforma valorile in tipul de data specificat. Spre exemplu, pentru a converti o valoare Currency, folositi functia CCur
PayPerWeek = CCur(hours * hourlyPay)
Functie
Converteste o expresie la tipul
CBool
Boolean
CByte
Byte
CCur
Currency
CDate
Date
CDbl
Double
CInt
Integer
CLng
Long
CSng
Single
CStr
String
CVar
Variant
CVErr
Error
Nota Valorile transmise unei functii de conversie trebuie sa fie corecte pentru tipul datei de destinatie; in caz contrar se produce o eroare. Spre exemplu, daca incercati sa convertiti un Long in Integer, valoarea Long trebuie sa fie in domeniul corect al tipului de date Integer.
O variabila de tip Variant poate stoca toate tipurile de date definite de sistem. Nu este necesara conversia valorilor, daca le atribuiti unei variabile tip Variant; Visual Basic executa automat conversiile necesare. Spre exemplu:
Dim SomeValue' Variabila de tip Variant prin definitie.
SomeValue = '17'' contine '17' (un sir de doua caractere).
SomeValue = SomeValue - 15 ' SomeValue contine acum valoarea 2.
SomeValue = 'U' & SomeValue ' SomeValue are acum caracterele "U2"
Cand executati operatii cu variabile de tip Variant, fara sa tineti seama de tipul datelor pe care le contin, trebuie totusi sa tineti cont de:
Un Variant trebuie sa contina ceva numeric daca asupra lui executati operatii numerice sau il transmiteti ca argument unei functii numerice.
Daca concatenati siruri, trebuie sa folositi operatorul "&" in locul operatorului "+".
Pe langa faptul ca variabilele de tip Varianta pot actiona ca orice tip de data standard, ele pot sa contina si trei valori speciale: Empty, Null si Error (valoarea Error nu face obiectul acestei lectii).
Uneori trebuie sa cunoasteti daca unei variabile i s-a atribuit o valoare pentru crearea ei. O variabila Variant are valoarea Empty inainte de a i se atribuie o valoare. Valoarea Empty este o valoare speciala diferita de 0, de un sir de lungime 0 ("") sau o valoare Null. Puteti testa daca o variabila de tip Variant are valoare Empty folosind functia IsEmpty
If IsEmpty(Z) Then Z = 0
Puteti folosi intr-o expresie un Variant ce contine valoarea Empty, insa ea va fi tratata ca 0 sau sir de lungime 0, in functie de expresie.
Valoarea Empty dispare in momentul cand unei variabile Variant i se atribuie o valoare (inclusiv 0, un sir de lungime 0 sau Null). Puteti seta o variabila Variant pe Empty atribuind cuvantul rezervat Empty unei variabile Variant.
O alta valoare speciala pe care o poate contine tipul de date Variant este Null, care este utilizata in special in aplicatiile bazelor de date pentru a indica o data necunoscuta sau lipsa. Valoarea Null are cateva caracteristici unice:
Expresiile care invoca Null dau intodeauna rezultat Null. Din acest motiv se spune ca Null se "propaga" prin expresie; daca o parte a expresiei este avaluata la Null, atunci intreaga expresie este evaluata la Null.
Transmiterea lui Null, a unui Variant ce contine Null sau a unei expresii ce este evaluata la Null ca un argument ll apelarea majoritatii functiilor determina ca functia sa returneze Null.
Valorile Null se trasmite prin functiile intrinseci care returneaza tipuri de date Variant.
Atribuirea valorii Null se poate face si prin intermediul cuvantului rezervat Null
Z = Null
Pentru a testa daca o variabila Variant contine valoarea Null se poate utiliza functia IsNull
If IsNull(X) And IsNull(Y) Then
Z = Null
Else
Z = 0
End If
Incercarea de atribuire a valorii Null unei variabile de alt tip decat Variant duce la producerea unei erori detectabile.
Variabilele nu sunt setate pe valoarea Null in afara cazului cand o atribuiti explicit Null acestora.
Tabelul urmator prezinta, in rezumat (spatiul necesar, domeniul de valori si caracterul de declarare implicita a tipului, tipurile de date admise de Visual Basic 6.0:
Tip data
Memorie
necesara
(in bytes)
Domeniul valorilor
Caracter declarare tip
Byte
1
[0, 255]
Boolean
2
[True, False]
Integer
2
[-32768, 32767]
Long (intreg lung)
4
[- 2147483648, 2147483647]
&
Single (virgula mobila simpla precizie)
4
valori negative [-3.402823E38, -1.401298E-45]
valori pozitive [1.401298E-45, 3.402823E38]
Double (virgula mobila dubla precizie)
8
valori negative [-1.79769313486232E308 ,
4.94065645841247E-324]
valori pozitive {4.94065645841247E-324,
1.79769313486232E308]
Currency (intreg scalat)
8
[-922337203685477.5808
922337203685477.5807]
Decimal
14
fara zecimale: +/-79228162514264337593543950335
cu 28 zecimale +/-7.9228162514264337593543950335
cea mai mica valoare diferita de zero este
+/-0.0000000000000000000000000001
Date
8
[01/01/100, 12/31/9999]
Object
4
Orice referinta Object
String (lungime variabila)
10 + lungime sir
[0, 231] caractere
String (lungime fixa)
Lungimea sirului
[1, 65536]
Variant (cu numere)
16
Orice valoare numerica ce se incadreaza in domeniul unui Double
Variant (cu caractere)
22 + lungime sir
Acelasi domeniu ca si String de lungime variabila
Definit de utilizator (folosind Type)
Numarul necesar elementelor
Domeniul fiecarui element al structurii este acelasi cu domeniul tipului de data al acestuia.
Nota Tablourile de orice tip de date necesita 20 bytes de memorie + 4 bytes pentru fiecare simensiune fata de numarul de bytes ocupati de datele insasi. Memoria ocupata de date se poate calcula inmultind numarul de elemente cu spatiul necesar fiecarui element. Spre exemplu, un tablou unidimensional avand 4 elemente de tip Integer ocupa 8 bytes (fiecare element ocupa 2 bytes). Rezulta ca totalul memoriei ocupat de tablou este 32 bytes (8 pentru date si 24 pentru tablou cu o dimensiune).
Tabloul de tip Variant necesita 12 bytes in plus fata de un tablou obisnuit.
Tablourile (numite uneori si liste de variabile) va permit sa referiti o serie de variabile prin acelasi nume si sa folositi un numar (numit indice) pentru a preciza pozitia variabilei in serie. Tablourile au doua limite: inferioara si superioara, iar elementele tabloului sunt dispuse unul in continuarea celulilat intre aceste limite.
Nota: Tablourile pe care le prezentam in continuare sunt tablouri de variabile, declarate in cod. Ele sunt complet diferite fata de tablourile de controale, care se pot crea la proiectare prin setarea proprietatii Index a controalelor.
Toate elementele dintr-un tablou trebuie sa aiba acelasi tip de data. Desigur, cand tipul de data este Variant, fiecare element al tabloului poate sa contina tipuri de date diferite (obiecte, siruri, numere etc.). Puteti declara tablouri de orice tip fundamental de data, inclusiv de tip definit de utilizator si de tip obiect.
In Visual Basic exista doua tipuri de tablouri: tablou de lungime fixa, care ramane intotdeauna la aceeasi dimensiune si tablou dinamic, care isi poate schimba dimensiunea pe timpul executiei.
In functie de domeniul pe care vreti sa-l aiba tabloul, acesta se poate declara folosind una din urmatoarele procedee:
Pentru a crea un tablou public se foloseste instructiunea Public in sectiunea Declarations a unui modul.
Pentru a crea un un tablou de nivel modul se foloseste instructiunea Private sau Dim in sectiunea Declarations a unui modul.
Pentru a crea un tablou local se foloseste instructiunea Private sau Dim in sectiunea Declarations a unei proceduri.
La declararea unui tablou de lungime fixa, se specifica numele acestuia urmat de o valoare numerica inclusa intre paranteze. Valoarea numerica dintre paranteze indica limita superioara a indexului tabloului, care nu poate depasi limita superioara a unui tip Long. Spre exemplu, daca declaratiile:
Dim State(14) As Integer ' 15 elemente.
Dim Sume(20) As Double ' 21 elemente.
apar in sectiunea Declarations a unui modul, declara doua tablouri de tip privat avand 15 si respectiv 21 elemente, deoarece in mod prestabilit in Visual Basic limita inferioara a unui index este 0. Daca aceste declaratii sunt plasate in interiorul unei proceduri, ele definesc doua tablouri locale. Pentru a le declara publice se foloseste Public in loc de Dim:
Public State(14) As Integer
Public Sume(20) As Double
Folosind cuvantul To puteti specifica, in mod explicit, limitele indexului unui tablou. Spre execmplu, urmatoarele declaratii:
Dim State(1 To 15) As Integer
Dim Sume(100 To 120) As String
declara tabloul State cu indecsi cuprinsi intre 1 si 15 si respectiv Sume cu indecsi cuprinsi intre 100 si 200.
In Visual Basic este posibil sa creati un tablou de tip Variant si sa-l populati cu alte tablouri ale unor tipuri diferite de date. Spre exemplu, urmatorul cod creaza doua tablouri, unul continand intregi si altul siruri. Apoi se declara un al treilea tablou Variant care este populat cu tablourile anterioare.
Private Sub Command1_Click()
Dim intX As Integer' Variabila contor.
' Declararea si popularea unui tablou de intregi.
Dim contorA(5) As Integer
For intX = 0 To 4
contorA(intX) = 5
Next intX
' Declararea si popularea unui tablou de siruri.
Dim contorB(5) As String
For intX = 0 To 4
contorB(intX) = 'Testare tablou de tablou'
Next intX
Dim arrX(2) As Variant ' Declara un nou tablou.
arrX(1) = contorA() ' Popularea cu celelalte tablouri.
arrX(2) = contorB()
MsgBox arrX(1)(2)' Afisarea unui membru al fiecarui tablou
MsgBox arrX(2)(3)
End Sub
Pentru a testa acest exemplu, plasati pe formularul unui nou poriect un buton de comanda si introduceti codul de mai sus in procedura evenimentului Click a butonului de comanda.
Sunt cazuri in care intr-un tablou trebuie sa pastrati informatii corelate. Spre exemplu, pentru a stoca coordonatele unor puncte din sistemul cartezian se poate utiliza fie doua tablouri cu o singura dimensiune fiecare, fie un singur tablou cu doua dimensiuni. Spre exemplu, urmatoarea linie de cod:
Static coordXY(20,1) As Integer
declara un tablou cu doua dimensiuni, care poate stoca 21 perechi de coordonate.
Limitele ambelor dimensiuni sau numai a uneia dintre ele pot fi declarate explicit:
Static coordXY(1 To 20, 1 To 2) As Double
Se pot declara si tablouri cu mai mult de doua dimensiuni, dar spatiul necesar pentru stocarea lor creste foarte mult. Spatiul alocat unui tablou este egal cu produsul dintre limitele superioare ale dimensiunilor si spatiul necesar unui element. Spre exemplu, urmatorul tablou cu trei diemnsiuni:
Dim MultiD(3, 1 To 10, 1 To 15) As Double
are 4 * 10 * 15 elemente (600), fiecare ocupand 8 bytes (spatiul necesar unui tip Double), deci tabloul va ocupa 4800 bytes.
In Visual Basic exista posibilitatea ca dimensiunile unui tablou sa fie stabilite si modificate pe timpul executiei. Pentru a putea realiza acest lucru, este necesar sa declarati tablouri dinamice. Pentru a declara un tablou dinamic trebuie sa executati urmatoarele:
Dim Vector() As Integer
ReDim Vector(X + 1) As Integer
Instructiunea ReDim poate sa apara numai intr-o procedura. Spre deosebire de instructiunile Dim si Static, instructiunea ReDim este o instructiune executabila.
Instructiunea ReDim are urmatoarea sintaxa:
ReDim [Preserve] <nume_tablou> <limita1>[,<limita2> .] [As <tip>
Fiecare instructiune ReDim poate schimba numarul de elemente si limitele fiecarei dimensiuni. O instructiune ReDim nu poate schimba tipul de date si nici numarul de dimensiuni stabilit la prima declarare.
La fiecare executie a instructiunii ReDim toate valorile stocate in tablou se pierd. Pentru a pastra valorile unui tablou de la o redimensionare la alta, in instructiunea ReDim se foloseste cuvantul rezervat Preserve.
Puteti combina cateva tipuri diferite de date pentru a crea tipuri definite de utilizator (cunoscute ca structuri in limbajul de programare C). Tipurile definte de utilizator sunt utile cand vreti sa creati o singura variabila care sa stocheze piese corelate ale informatiei.
Tipul definit de utilizator se declara folosind o instructiune Type intr-o sectiune Declarations a unui modul. Spre exemplu:
Private Type SystemInfo
sau
Public Type SystemInfo
Spre exemplu, puteti declara un tip definit de utilizator care sa stocheze informatiile despre un calculator:
' In zona Declarations a unui modul standard
Private Type SystemInfo
CPU As Variant
Memorie As Long
CuloriVideo As Integer
Pret As Currency
DataCumparare As Variant
End Type
Pentru a declara o variabila a unui tip definit de utilizator se folosesc aceleasi instructiuni ca si in cazul variabilelor tipurilor standard. Spre exemplu:
Dim SistemulMeu As SystemInfo, SistemulTau As SystemInfo
declara doua variabile ale tipului SystemInfo definit anterior.
Tabelul urmator ilustreaza unde si cu ce domeniu puteti declara tipuri definite de utilizator si variabile ale acestora:
Procedura/Modul
Puteti crea un tip definit de utilizator ca
Variabile ale unui tip definit de utilizator pot fi declarate
Proceduri
Nu se poate declara
Numai local
Module standard
Privat sau public
Privat sau public
Module formular
Numai privat
Numai privat
Module de clasa
Privat sau public
Privat sau public
Nota Daca in modulele standard sau ale clasei declarati tipuri definite de utilizator folosind cuvantul rezervat Dim, acestea vor fi implicit Public. Folositi cuvantul rezervat Private pentru a declara tipuri definite de utilizator private.
Atribuirea si receptionarea valorilor elementelor unei variabile ale unui tip definit de utilizator se face la fel ca setarea si citirea proprietatilor:
SistemulMeu.CPU = '486'
If SistemulMeu.DataCumparare > #1/1/92# Then
De asemenea, puteti atribui o variabila altei variabile ale aceluiasi tip definit de utilizator, spre exemplu:
SistemulTau = SistemulMeu
va atribui toate valorile din elementele variabilei SistemulMeu elementelor corespondente din variabila SistemulTau.
Un tip definit de utilizator poate contine un tablou de dimensiune fixa sau un tablou dinamic. Spre exemplu:
Type SystemInfo
CPU As Variant
Memorie As Long
UnitatiDisc() As String' Tablou de dimensiune fixa
CuloriVideo As Integer
Pret As Currency
DataCumparare As Variant
End Type
Un tip de data definit de utilizator poate contine un element apartinand altui tip de dte definit de utilizator, obtinandu-se astfel structuri imbricate, asa cum se poate vedea si din exemplul urmator:
Type DriveInfo
Tip As String
Capacitate As Long
End Type
Type SystemInfo
CPU As Variant
Memorie As Long
UnitatiDisc (26) As DriveInfo
Pret As Currency
DataCumparare As Variant
End Type
[1] Numerele in virgula mobila folosesc formatul IEEE (
Tip Cifre semnificative Numar bytes
single 6 - 7 4
double 15 - 16 8