RECORD si structurile de tip STRUCT,din care s-au dezvoltat obiectele si
səhifə 5/10 tarix 03.11.2017 ölçüsü 0,98 Mb. #29921
RECORD si structurile de tip STRUCT,din care s-au dezvoltat obiectele si
mai apoi obiectele vizuale.
Instructiunile sunt extrem de simplu de apelat si ofera o destul de mare
flexibilitate in programare.Practic va scutesc de un volum destul de mare
de munca,executatnd o serie de operatii automat.Este bine sa cunoasteti
foarte bine intregul set de instructiuni.Pentru acest scop studiati cu
atentie toata documentatia din manualul Help,pentru fiecare instructiune
si apoi realizati unul sau mai multe exemple de implementare.Unele dintre
instructiuni pot executa operatii mai complexe,sau lucreaza mai eficient
prin conjunctie cu alte instructiuni.
-25-
EXEMPLE:
O instructiune cu eticheta transfera controlul executiei catre eticheta
respectiva.O astfel de instructiune este instructiunea Go To:
EXEMPLUL 1: -deschideti o fereastra si editati urmatoarea procedura Click
Private Sub Form_Click()
Dim valoare1
Randomize
valoare1 = 20*Rnd
If valoare1 < 10 Then GoTo Linia1 Else GoTo Linia2
Linia1:
Form1.Print valoare1
Form1.Print "Numarul este mai mic decat 10"
Exit Sub
Linia2:
Form1.Print valoare1
Form1.Print "Numarul este mai mare decat 10"
Exit Sub
End Sub
Executati exercitiul cu Run si Start.La fiecare click de mouse,se va
executa un salt la una dintre cele doua etichete: Linia1 si Linia2,in
functie de valoarea numarului returnat.
O instructiune este compusa,atunci cand include alte functii,proce-
duri sau comenzi,sub forma de bloc de instructiuni.De regula aceste
instructiuni au la sfarsit un cuvant cheie prin care marcheaza sfarsitul
blocului.Acest cuvant cheie poate fi: End,End If,Loop etc.Exemplele
cele mai comune sunt blocurile de tip IF...THEN,DO...LOOP,SELECT CASE...
END SELECT,etc.
EXEMPLUL 2: -deschideti o fereastra noua si editati procedura:
Private Sub Form_Click()
Dim valoare,numar
Randomize
Do While valoare < 30
valoare = valoare + 7 * Rnd
Form1.Print valoare
Beep
Select case valoare
Case 1 To 5
numar = valoare + 0.14159265
Case 5 To 10
numar = valoare + 0.331794
Case 10 To 20
numar = valoare + 0.1712357
Case 20 To 30
numar = valoare + 0.117753
End Select
Loop
Form1.Print "Valoarea pentru numar este:"
Form1.Print numar
End Sub
Exemplul contine doua blocuri de instructiuni intricate in Form_Click().
-26-
O instructiune de tip expresie,calculeaza valoarea unei expresii mate-
matice,sau a unei expresii complexe formata din diverse tipuri de data.
Prototipul este instructiunea Let,dar expresiile pot fi incluse si in
blocurile de instructiuni,sau in parametrul unor alte instructiuni.
EXEMPLUL 3: editati in fereastra View Code,urmatorul cod:
Private Sub Form_Click()
Dim valoare1
Let valoare1 = (3.141592 * Sin(0.37))/(2.73*Tan(3.2793))
Form1.Print "Valoarea calculata ="
Form1.print valoare1
End Sub
O instructiune de tip selectie se utilizeaza pentru a alege una sau
mai multe variante,dintre un numar oarecare de variante posibile.Se pot
utiliza pentru acest scop instructiunile: IF...THEN,DO...WHILE,SELECT CASE
...END SELECT,ON...GOSUB,ON...GOTO etc.
EXEMPLUL 4: deschideti o fereastra si editati urmatorul cod:
Private Sub Form_Click()
Call Selectie
End Sub
Sub Selectie()
Dim valoare
Randomize
valoare = 15 * Rnd
On valoare GoSub Eticheta1,Eticheta2,Eticheta3
Eticheta1:
If valoare < 5 Then
Form1.Print valoare
Form1.Print "este mai mica decat 5"
End If
Eticheta2:
If valoare > 5 And valoare < 10 Then
Form1.Print valoare
Form1.Print "este cuprinsa intre 5 si 10"
End If
Eticheta3:
If valoare > 10 Then
Form1.Print valoare
Form1.Print "este cuprinsa intre 10 si 15"
End If
End Sub
Executati exercitiul cu Run si Start.Procedura Selectie contine trei bucle
de selectie If...Then,ce au fost apelate cu ajutorul unei instructiuni de
tip GoSub.Acest gen de solutie este recomandabila atunci cand scontati sa
adaugati in viitor si alte bucle de selectie.In exemplul de mai sus,va
fi suficient sa adaugati bucla urmatoare cu o noua eticheta (Eticheta4) si
apoi sa adaugati la instructiunea GoSub si Eticheta4 in lista celor ce vor
fi apelate.Atunci cand utilizati bucle multiple,nu uitati sa inchideti
fiecare bucla cu End If.Atentie si la modul in care intricati una sau mai
multe instructiuni.Verificati fiecare bucla cu valori concrete.
-27-
Instructiunile iterative,se mai numesc si bucle de repetitie si se uti-
lizeaza atunci cand un set de operatii trebuie repetat de mai multe ori.
Fiecare set de operatii poarta si numele de ciclu.De obicei,la fiecare
ciclu de operatii,cel putin una dintre valori se modifica,sau se actuali-
zeaza,astfel incat rezultatul final al fiecarui ciclu va fi diferit de
cel al ciclului precedemt.Numarul de repetitii poate fi controlat cu
ajutorul unei formule fixe,cum este cazul instructiunilor de tip For...
Next si For Each...Next,sau poate fi controlat cu ajutorul unei conditii
ce trebuie sa fie indeplinita,cum este cazul instructiunii Do..While..Loop
sau Do..Until..Loop.In cazul iteratiilor conditionale,este obligatoriu sa
specificati o conditie,ce poate sa fie indeplinita in cursul executiei,
sau sa includeti si o iesire fortuita din bucla.In caz contrar,se va forma
o bucla infinita in care executia va stagna la nesfarsit.
EXEMPLUL 5: deschideti o fereastra si editati urmatorul cod:
Private Sub Form_Click()
Dim Arie1,xxx
Arie1 = Array(10,20,30,40)
For Each Element in Arie1
For xxx = 0 To 3
Arie1(xxx) = Arie1(xxx) + 3.14
Next
Next
For xxx = 0 To 3
Form1.Print Arie1(xxx)
Next
End Sub
Executati cu Run si Start si apoi cu un click in fereastra.Observati ca
pentru fiecare element din arie,operatia a fost executata de patru ori,
adica cate o data pentru fiecare element din arie.Daca am fi dorit sa
executam cele patru operatii doar asupra unui singur element din arie,
de exemplu asupra elementului Arie1(2),atunci bucla de atribuire ar fi
fost de genul"
For Each Element in Arie1
Arie1(2) = Arie1(2) + 3.14
Next
Se pot intrica mai multe astfel de bucle de repetitie,dar trebuie sa
evaluati cu atentie rezultatul returnat dupa fiecare astfel de operatie.
Pentru depanarea unui program cu bucle intricate,este necesar uneori sa
verificati fiecare bucla separat,si doar apoi sa verificati actiunea lor
conjugata.
Buclele de repetitie pot simplifica enorm munca programatorului,dar pot
crea complicatii insurmontabile,atunci cand nu se evalueaza corect spatiul
de memorie consumat.Daca o astfel de bucla preia sau calculeaza niste date
temporare la fiecare ciclu de operatii,in scurt timp se va epuiza tot spa-
tiul din memoria de operare.Pentru ca programul sa nu se blocheze,este ne-
cesar ca bucla de repetitie sa contina si o procedura de eliberare a tam-
poanelor si de gestiune automata a memoriei de lucru,sau cel putin sa
descarce periodic toate datele in tampoane de memorie inscriptibila si
apoi sa elibereze memoria pentru restul de operatii.
Buclele de repetitie sunt indispensabile pentru operatiile de cautare
si sortare a datelor si a bazelor de date.
-28-
Instructiunile de salt in program,sunt cele utilizate pentru controlul
fluxului de executie: GoTo,GoSub,Call etc.Aceste instructiuni au un rol
deosebit in conceptia generala a programului,deoarece permit saltul de
la un bloc de date la altul,de la un obiect la altul sau de la un modul
la alt modul.Este esential ca toate aceste salturi sa fie executate in
ordinea corecta,astfel incat instructiunile dintr-un anumit bloc de date
sa reseteze anumite variabile publice,sau sa pregateasca mediul de memorie
pentru executia urmatorului bloc de date,sau pentru trecerea la un alt
modul.Reciproc,este la fel de impoartant ca atunci cand un modul apeleaza
la date arhivate in alt modul,sa se poata face si saltul inapoi la modulul
apelant,pe linia imediat urmatoare,astfel incat programul sa se continue
firesc.
In principiu nu trebuie sa abuzati de aceste salturi.Fiecare astfel
de salt presupune ca sistemul de operare sa pastreze intr-un tampon de
memorie adresa de la care a inceput saltul,pentru a putea reveni,dupa
epuizarea operatiilor efectuate,in modulul apelat.Cu cat un program exe-
cuta mai putine salturi,cu atat executia este mai cursiva si mai rapida.
Salturile sunt indispensabile atunci cand trebuie apelata o procedura
sau un obiect.
EXEMPLU 6: deschideti o fereastra si testati urmatorul cod:
Dim valoare1
Private Sub Form_Click()
Call Procedura1
Call Procedura2
Call procedura3
End sub
Sub Procedura1()
Form1.Print "Se executa Procedura 1"
valoare1 = 10
Form1.Print valoare1
End Sub
Sub Procedura2()
Form1.Print "Se executa Procedura 2"
valoare1 = (valoare1 * valoare1) / 3.72
Form1.Print valoare1
End Sub
Sub Procedura3()
Form1.Print "Se executa Procedura 3"
valoare1 = valoare1 + 55.55
Form1.Print valoare1
End Sub
Executati cu Run si Start si apoi cu un click de mouse.Evident ca toate
operatiile executate ar fi putut fi grupate intr-o singura procedura.
Acest gen de solutie,schiteaza simplist conceptul de programare modulara
si prezinta urmatoarele avantaje: 1.Fiecare dintre cele trei proceduri
poate fi modificata,actualizata,verificata si/sau depanata independent de
celelalte. 2.Orice eroare este mult mai usor de localizat si sau remediat.
Pur si simplu,se executa fiecare procedura separat cu un set de valori de
control si se identifica sursa erorii. 3.O eventuala eroare generata de
un conflict local nu intereseaza datele prelucrate de restul procedurilor.
Solutia practica va depinde doar de experienta programatorului.
-29-
OPERATII CU FILE SI FISIERE (de tip DOS)
Visual Basic contine si un grup de functii si instructiuni prin care
se pot executa operatii la nivelul sistemului de operare DOS.Acestea sunt:
ChDir,ChDrive,FileCopy,MkDir,RmDir,Name,CurDir,FileDateTime,GetAttr,File-
Len,Dir si SetAttr.
EXEMPLU: pentru a afisa calea de acces,puteti utiliza functia CurDir
Private Sub Form_Click()
Form1.Print CurDir
End Sub
Aceste functii si instructiuni sunt echivalente cu cele ale sistemului de
operare DOS.De exemplu,daca apelati MkDir "Director1" se va crea un direc-
tor nou,de tip DOS,denumit Director1.Daca doriti sa creati un director de
tip Windows,va trebui sa utilizati functiile Windows.
OPERATII DE INTRATRE-IESIRE (I/O)
Majoritatea operatiilor executate de Visual Basic au loc in memoria
de operare si sunt arhivate in tampoane de memorie temporare.In momentul
in care se inchide aplicatia,sau programul Visual Basic,toate datele
temporare se pierd (se sterg dim memorie).Pentru ca datele calculate,sau
obtinute cu ajutorul unei aplicatii sa fie permanente,este necesar sa fie
arhivate in memoria inscriptibila,in file separate.Pentru acest scop se
pot utiliza operatiile de intrare-iesire a datelor,controlate prin urma-
toarele functii si instructiuni: Open,Close,Reset,Format,Print,Print#,Spc,
Tab,Width,FileCopy,EOF,FileAttr,FileDateTime,FileLen,FreeFile,GetAttr,Loc,
LOF,Seek,Dir,Kill,Lock,Unlock,Name,Get,Input,Input#,Line Input#,FileLen,
FileAttr,GetAttr,SetAttr,Seek,Print#,Put,Write#.
Toate aceste operatii sunt operatii de nivel inferior si utilizeaza
file de tip DOS.Nu se pot utiliza aceste functii pentru operatii cu file
si fisiere Windows de tip Word,sau NotePad.Aceste functii si instructiuni
au fost preluate pentru a realiza compatibilitatea cu programele mai vechi
dar reprezinta un mijloc extrem de economic de arhivare a datelor.
EXEMPLU: deschideti o fereastra si editati urmatoarea procedura Click:
Private Sub Form_Click()
Form1.Print "Operatie Input/Output :"
Open "Test1.txt" For Append As #5
Dim text1,text2 As String
text1 = "textul introdus in fila !"
Write #5,1,text1
Close #5
Open "Test1.txt" For Input As #1
Do While Not EOF(1)
Line Input #1,text2
Loop
Close #1
Form1.Print text2
End Sub
Executati cu Run si Start.In prima etapa,Open creaza fila specificata si
apoi deschide fila pentru editare.In cea de a doua etapa,redeschide fila
si citeste textul arhivat.Puteti verifica deschizand directorul curent si
apoi fila Test1.text.Daca doriti,puteti crea un director special cu MkDir
in care arhivati fila dupa ce selectati noul director cu ChDir.
-30-
Este recomandabil sa utilizati aceste functii si instructiuni mai ales
pentru datele pe care doriti ca programul sa le arhiveze intern,fara ca
utilizatorul sa poata avea acces la aceste file.Pentru datele la care
utilizatorul va avea acces,este mai eficient sa utilizati file si fisiere
de tip Windows,create cu functii din nucleul API Windows.
FUNCTII PENTRU OPERATII CU SIRURI DE CARACTERE
Sirurile de caractere pot fi arhivate in variabile de tip String sau
in variabile de tip Variant.Exista diverse mijloace de prelucrare a date-
lor de tip sir de caractere,dar cele mai eficiente sunt functiile de nivel
inferior,create special pentru acest scop.Aceste functii sunt: StrComp,
StrConv,Format,LCase,UCase,Space,String,Len,Format,LSet,RSet,InStr,Left,
LTrim,Mid,Right,RTrim,Trim,Option Compare,Asc,Chr.
EXEMPLU: deschideti o fereastra si editati urmatorul cod:
Private Sub form_Click()
Form1.Print "Sirul de caractere:"
Dim text1 As String
text1 = "ABCDE.....1234567..."
Form1.Print text1
Form1.Print "Contine urmatorul numar de caractere:"
Form1.Print Len(text1)
Form1.Print "Iar al treilea caracter este:"
Form1.Print Mid(text1,3,1)
End Sub
Exista un set destul de larg de aplicatii pentru aceste functii.In princi-
pal se utilizeaza pentru a verifica si corecta file de tip text sau pentru
a verifica si filtra datele introduse in obiecte sau arhivate in file,dar
se pot utiliza si pentru a crea sisteme de securitate,programe de analiza
automata,parole,compilatoare si sisteme de conversie a datelor etc.
CONVENTII PENTRU EDITAREA CODULUI
Editarea liniilor de cod,este in general destul de simpla,cu conditia
sa se respecte toate regulile de sintaxa in alcatuirea liniilor de cod.
Pentru adaugarea comentariilor se utilizeaza semnul apostrof ('),iar
pentru a separa o linie de cod pe doua randuri se utilizeaza un spatiu gol
urmat de o liniuta de subliniere ( _),apoi apasati tasta ENTER (pentru
a adauga si un caracter carriage return).Pentru a grupa doua linii de cod
pe un singur rand se pot utiliza cele doua puncte (:).
Pentru formarea identificatorilor se pot utiliza doar caractere alfanu-
merice (cifre si litere) si liniuta de subliniere.Primul caracter trebuie
sa fie o litera,sau liniuta de subliniere urmata ce cel putin o litera.
Exista urmatoarele limite:
lungimea unui identificator = maxim 1023 de caractere
lungimea unei linii de cod = maxim 65 535 de caractere
dimensiunile unei arii = maxim 32 de dimensiuni
lungimea unui sir = maxim 2 miliarde de caractere
lungimea unei instructiuni = maxim 32 768 de caractere
In rest,nu exista reguli fixe.Pentru formarea identificatorilor puteti
utiliza fie limba romana,fie limba engleza(pentru aplicatiile comerciale).
-31-
Pentru ca sa creati un cod cat mai lizibil,se pot utiliza si urmatoare-
le sugestii (optionale):
-este bine ca fiecare identificator sa descrie cat mai sugestiv elementul
pe care il denumeste (Exemple: Fereastra,Buton sau Form si Button)
-este bine ca fiecare cuvant din denumire sa inceapa cu litera mare
(Exemple: FereastraPrincipala,ButonulStart etc.)
-daca este vorba despre o metoda sau procedura,este bine ca denumirea sa
inceapa cu actiunea pe care o determina sau controleaza
(Exemple: InitiazaObiectul sau InchideFereastra etc.)
-daca elementul denumit este nou creat,e bine ca numele sau sa fie cat
mai sugestiv (Exemple: AngajatNume,DateFisier etc.)
-daca elementul respectiv face parte din interfata grafica,se poate spe-
cifica acest fapt incepand denumirea cu un I mare (Exemplu: IButonStart)
-pentru evenimente,este bine ca numele sa includa si evenimentul exploatat
(Exemple: EvenimentStart sau EvenimentStop)
-pentru denumirile foarte lungi se pot utiliza abrevierile curente
(Exemple: FilaHTML,SelectiaSQL etc.)
-utilizati denumiri diferite pentru elementele care au vizibilitate dife-
rita,pentru a evita conflictele de identificator
(Exemplu: ExternXXX si InternXXX pentru variabila publica si privata)
-evitati sa utilizati numele unor functii si proceduri implicite,chiar
daca este posibil si nu exista riscul imediat al unui conflict de identi-
ficator (Exemplu: evitati sa denumiti o data de genul : Date)
-pentru programele pe care presupuneti ca le vor utiliza si persoane din
alte tari sau alte culturi,este recomandabil sa utilizati toate denumirile
si comenatriile in limba engleza,pentru a simplifica munca de verificare
si control,sau pe cea de actualizare si depanare a programelor
-pentru programele de uz comercial este bine sa respectati si notatia
hungara de formare a denumirilor (utilizati prefixele:c(char),n(short),
i(int),b(bool),l(long),s(string),fn(function),sz si str(string),lp(pointer
long),h(hamdle),msg(message),p(pointer),c(class),w(word)).
-este bine ca liniile de cod sa nu fie prea lungi (sa fie usor de citit)
-este bine sa nu includeti mai mult de o instructiune per linia de cod
-este bine sa nu utilizati mai mult de o singura declaratie per linie cod
-este bine sa nu adaugati comentariile in continuarea liniilor de cod,ci
sa utilizati un rand distinct si pentru comentarii
-pentru buclele de repetitie este bine sa declarati variabila counter in
interiorul buclei:
EXEMPLU: For count As Integer = 0 To 2
MsgBox(count)
Next
-este bine sa evidentiati etichetele cu cateva spatii goale
EXEMPLU: Jump: FileOpen(1,"testFile",OpenMode,Input)
.....
120: FileClose(1)
-este bine sa utilizati parantezele pentru a reglementa explicit ordinea
de executie a operatorilor,mai ales atunci cand au aceeasi precedenta
-este bine sa respectati aceleasi reguli in toate aplicatiile (sa va
formati un set de tabieturi,preferabil respectand si regulile de mai sus)
-respectati si munca celor ce vor verifica/utiliza programele d-voastra
Informatii suplimentare se gasesc pe Internet,la adresa Microsoft.com.
-32-
PROGRAMAREA ORIENTATA SPRE OBIECT (module,clase,obiecte)
Limbajele de programare au urmat o evolutie lenta,dar progresiva.In
prima faza,se utilizau doar valori numerice reprezentate binar,pentru a
efectua calcule matematice.Apoi,incepand cu limbajul denumit Fortran
(FORmula TRANslator) s-a dezvoltat conceptul de limbaj de nivel superior,
in care se utilizeaza conventii de limbaj pentru a desemna seturi intregi
de operatii elementare.Urmatorul nivel de structurare,a fost reprezentat
de functii,proceduri,inregistrari de tip RECORD si structuri de date.Toate
aceste forme de organizare a datelor,erau incluse intr-un singur modul de
program,sub forma de lista de coduri ("listing").Programul putea sa exe-
cute salturi de la un bloc de date la altul,cu ajutorul functiilor si al
instructiunilor pentru controlul fluxului de executie (gen GO TO...etc.).
Pe masura ce programele au devenit din ce in ce mai complexe,a aparut
necesitatea de a putea reutiliza fragmente tot mai mari de cod,fara sa
fie necesar sa fie scrise in lista,pentru fiecare program sau aplicatie.
Astfel s-a dezvoltat conceptul de programare modulara.Practic,programele
au fost fragmentate in mai multe module,ce puteau fi apelate succesiv sau
simultan in functie de necesitatile de moment.Fiecare astfel de modul,
grupa toate datele si functiile necesare pentru a executa o anumita ope-
ratie,sau pentru a solutiona un anumit gen de problema.Ca rezultat,lista
unica a fost inlocuita prin mai multe file si o procedura principala,
denumita Main(),din care se apelau toate aceste module in momentul nece-
sar.Modulele nu mai trebuia sa fie rescrise pentru fiecare program,ci se
puteau copia gata editate.
Acest gen de implementare era grefat de urmatorul inconvenient:-fiecare
modul trebuia incarcat in memoria de operare,astfel incat spatiul ramas
liber pentru operatii se limita progresiv,pana cand se bloca intreaga me-
morie doar cu datele din aceste module.Pentru a putea elibera memoria cat
mai eficient,s-a dezvoltat conceptul de biblioteci alocate dinamic (DLL).
Cu ajutorul filelor (modulelor) de tip .dll,nu mai este necesar sa fie
incarcat intregul modul pentru a apela o functie oarecare,ci se poate
incarca doar definitia functiei respective,doar in momentul executiei.Ca
rezultat,modulele de acest tip au putut creste pana la dimensiuni consi-
derabile,fara sa afecteze cu nimic executia programului.Pentru a ilustra
acest concept,cel mai bun exemplu il reprezinta sistemul de operare Win-
dows,in care se utilizeaza zeci sau sute de astfel de biblioteci cu alo-
care dinamica.
Cu toate aceste dezvoltari si modernizari,programarea modulara a cunos-
cut o dezvoltare exponentiala.Totusi,modulele nu pot rezolva complet toate
problemele de programare,deoarece structura lor este fixa iar continutul
lor nu poate fi modificat,decat prin formarea unui alt modul.Ori de cate
ori se va apela un astfel de modul,va contine aceleasi date,organizate in
aceeasi maniera.Pentru a putea remedia acest inconvenient s-a apelat ini-
tial la un mic artificiu.Astfel,pentru a putea obtine o varianta usor
modificata a unui modul,se copia intregul modul si apoi se efectuau toate
operatiile necesare pentru a obtine varianta dorita (personalizata).
Astfel s-a creat conceptul de "sablon",utilizat pentru a deriva un alt
modul,asemanator cu cel initial,dar si cu un grup de particularitati.Ca
rezultat,se poate utiliza un modul de date oarecare,pentru a realiza un
numar nelimitat de clone asemanatoare,dar totusi distincte intre ele.Acest
tip de "sablon" poarta numele de clasa,iar modulul derivat este un obiect.
-33-
Asadar,un modul este o structura ce contine date si metodele prin care
se actioneaza asupra acestor date.O clasa,este o reprezentare abstracta a
unui astfel de modul,in care sunt grupate definitiile necesare pentru a
forma un modul functional.Clasa este "sablonul" din care se dezvolta un
obiect.Obiectul este o instanta a unei clase,sau altfel spus este o copie
functionala a modulului de tip "sablon".
Asadar,diferenta dintre un modul si o clasa consta in faptul ca un mo-
dul este intotdeauna unic si identic cu el insusi,in timp ce o clasa poate
crea nenumarate instante distincte,dar care pastreaza structura de baza,
nucelul de date si de functii din clasa de baza.In plus,modulele contin
mai ales variabile de tip Public,ce pot fi apelate din orice alt modul,in
timp ce clasele si obiectele contin mai ales variabile de tip Private,ce
nu au vizibilitate in alte module din program.Ca rezultat,daca o variabila
dintr-un modul simplu isi schimba valoarea,aceasta schimbare va afecta si
restul modulelor in care variabila respectiva are vizibilitate,in timp ce
in cazul obiectelor,o variabila care isi modifica valoarea nu afecteaza
cu nimic restul obiectelor sau modulelor din program.
Acest procedeu simplu,asigura o maleabilitate mult mai mare,cu un consum
minim de memorie.
EXEMPLU: -clasa X ocupa 100 Kb de memorie
-din clasa X se creaza 100 de obiecte distincte,la care se va
adauga cate o proprietate distincta.Pentru a crea cele 100 de obiecte,nu
se vor consuma decat cei 100 Kb de memorie + memoria necesara pentru fie-
care proprietate distincta.
-pentru a crea aceleasi 100 de obiecte,cu ajutorul unor module
simple,ar fi fost necesare 100 de module a cate 100 Kb + spatiul necesar
pentru fiecare proprietate distincta (adica de 100 de ori mai mult).
Pentru a avea o imagine de ansamblu,va imaginati ca o clasa gata creata
va putea fi utilizata nu doar in acelasi program,ci in zeci sau sute de
mii de astfel de programe,realizate de mii si mii de programatori.Toate
bibliotecile de clase sunt accesibile prin Internet.Programarea incepe sa
fie din ce in ce mai mult un fel de joc de "puzzle" in care programatorul
nu trebuie decat sa gaseasca piesele potrivite si sa le grupeze corespun-
zator,pentru a putea obtine imaginea dorita.
Indiferent de limbajul utilizat,o clasa contine urmatoarele tipuri de
date: campuri de date,proprietati,metode si evenimente.
Campurile de date sunt formate din variabile si constante simple,ce
pot fi manipulate la fel ca si cele dintr-un modul obisnuit.
Proprietatile sunt variabile sau constante de un tip mai special,si
anume,nu pot fi manipulate direct,ci doar prin intermediul unor functii
speciale,denumite Get() si Set().Cele doua functii realizeaza un fel de
filtru intre program si obiect,astfel incat aceste date sa nu poata fi
modificate "accidental".De obiecei,functiile Set() si Get() sunt astfel
concepute incat proprietatile pe care le controleaza sa nu poata fi acce-
sate decat respectand un anumit protocol,sau doar dupa ce datele au fost
verificate si filtrate de o procedura special conceputa (sau o parola).
Metodele sunt functii si proceduri obisnuite,prin care se reglemen-
teaza actiunile si operatiile executate asupra datelor.Nu este strict
obligatoriu,dar se obisnuieste ca fiecare clasa sa contina si doua metode
speciale,denumite constructor si destructor.Constructorul se apeleaza
pentru a crea un obiect,destructorul se apeleaza pentru a elibera memoria.
-34-
In versiunea Visual Basic 4.0 constructorul este Class_Initialize,iar
destructorul este denumit Class_Terminate.Pentru a crea o clasa noua,
alegeti din meniul Project optiunea Add Class Module si confirmati cu
Open optiunea New.Pentru a putea edita constructorul si destructorul
clasei,alegeti in prima caseta de editare optiunea Class (in loc de Gene-
ral) iar in cea de a doua caseta de editare,alegeti Initialize sau res-
pectiv Terminate.In versiunile mai noi (dupa 2005),constructorul este
denumit Sub New iar destructorul este Sub Finalize.
Constructorul este utilizat pentru a initializa datele din obiect.Ori
de cate ori se creaza un obiect,se apeleaza automat si functia construc-
tor pentru a initializa datele.Daca functia constructor este goala,toate
datele vor avea valorile implicite (neinitializate).
Evenimentele sunt mesaje pe care obiectul le receptioneaza sau le emite
intr-un anumit context.Aceste mesaje sunt preluate si interpretate de
catre o functie specializata si sunt utilizate pentru a declansa o proce-
dura de raspuns la evenimentul respectiv.Practic exista urmatoarea inlan-
tuire de operatii:
1. -un eveniment oarecare determina eliberarea unui mesaj specific
2. -mesajul este preluat de o functie specializata (gen GetMessage() )
3. -functia interpreteza si filtreaza mesajul si activeaza un pointer spre
o porocedura specializata de raspuns la mesaj
4. -procedura accesata prin pointer executa operatiile de raspuns la eve-
niment.
O parte dintre evenimente sunt determinate de mesajele eliberate de
sistemul de operare Windows,sau de programul Visual Basic,iar celelalte
evenimente sunt specifice pentru fiecare obiect.Exista o gama foarte va-
riata de astfel de evenimente.De exemplu,evenimentele care se refera la
obiecte ca unitati distincte sunt: Activate,Deactivate,Initialize,Resize,
QueryClose si Terminate.
Fiecare obiect are un set predefinit de evenimente ce pot fi programate
direct.Nu trebuie decat sa alegeti din fereastra Code,evenimentul dorit si
sa editati procedura de raspuns la eveniment.De exemplu,pentru o fereastra
oarecare (Form1) se pot utiliza urmatoarele evenimente: Activate,Click,
DblClick,Deactivate,DragDrop,DragOver,GotFocus,Initialize,KeyDown,KeyPress
KeyUp,LinkClose,LinkError,LinkExecute,LinkOpen,Load,LostFocus,MouseDown,
MouseMove,MouseUp,OLECompleteDrag,OLEDragDrop,OLEDragOver,OLEGiveFeedback,
OLESetData,OleStartDrag,Paint,QueryUnload,Resize,Terminate,Unload.
Acest set de evenimente implicite,este suficient de generos pentru a
rezolva majoritatea necesitatilor de programare.Daca doriti totusi sa
creati evenimente noi,personalizate,puteti utiliza instructiunea Event.
Puteti sa utilizati functiile API Windows si pentru a redefini functia de
preluare si interpretare a mesajelor precum si pointerii catre procedurile
de raspuns la mesaje.In versiunile mai noi de Visual Basic,inlantuirea se
realizeaza cu ajutorul variabilelor de tip delegat (un fel de pointeri
spre proceduri).Este insa recomandabil sa utilizati evenimentele implicite
(mai ales daca sunteti incepator),deoarece procedurile si functiile de
filtrare si interpretare a mesajelor Windows pot crea dificultati extrem
de mari atunci cand se depaneaza sau se verifica programul.Verificati cu
maximum de atentie aceste functii,sau utilizati doar functii gata veri-
ficate in alte programe.Fiabilitatea programului va depinde in mare masura
de modul in care selectati si exploatati aceste evenimente.
-35-
Atunci cand proiectati o interfata grafica,trebuie sa alegeti cu aten-
tie obiectele pe care doriti sa le utilizati.Puteti sa creati obiecte cu
ajutorul claselor pre-existente,sau puteti sa creati clase noi.Pentru o
orientare rapida si eficienta,este bine sa apelati la utilitarul denumit
Object Browser.Din meniul View,alegeti Object Browser.Se va deschide fe-
reastra Object Browser.In prima caseta de editare,puteti alege bibliote-
cile sau programele din care doriti sa selectati clasele de obiecte,iar
in cea de a doua puteti edita numele clasei cautate si apoi apasati bu-
tonul de cautare (cel cu binoclu).
In cele doua casete de afisare,se vor prezenta lista completa a claselor
si respectiv lista de proprietati,metode si evenimente pentru fiecare
dintre aceste clase.De exemplu,pentru a vedea ce clase sunt incluse in
proiectul activ,alegeti in prima caseta de editare (in loc de All Libra-
ries) numele proiectului d-voastra (De exemplu: Proiect1).Pentru a vedea
continutul unei anumite metode,selectati clasa,apoi selectati metoda do-
rita si apasati butonul View Definition.
Pentru a crea o clasa noua,cel mai simplu este sa utilizati instrumentul
Add Class Module:
EXEMPLU: deschideti un nou proiect de tip Standard EXE.Din meniul Pro-
ject alegeti Add Class Module si apoi confirmati cu Open.In
caseta de editare "General" alegeti Class.Se va afisa direct
constructorul clasei.Scrieti procedura dorita:
Private Sub Class_Initialize()
Form1.Print "Text inclus din Clasa Mea"
End Sub
Din meniul File,alegeti Save Class As si salvati modulul cu
un nume oarecare (De exemplu Class2).
Apoi selectati fereastra Form1,executati un click drept,des-
chideti fereastra View Code si editati procedura Click():
Private Sub Form_Click()
Dim obiect1 AS Class2
Set obiect1 = New Class2
End Sub
Executati fereastra cu Run si Start si apoi executati un click de mouse.
In momentul click-ului,se va crea automat obiectul denumit obiect1.Pentru
a crea acest obiect,se va apela functia constructor.Textul afisat din in-
teriorul obiectului,confirma faptul ca obiect1 a fost creat si este activ.
Acest exemplu,prezinta doar pasii ce trebuiesc urmati pentru a crea o
noua clasa,si apoi pentru a crea un obiect(o instanta a clasei respective)
derivat din clasa nou creata.O clasa completa trebuie sa contina cel putin
constructorul si destructorul,la care se vor adauga date,proprietati si
metode.
Pentru a verifica noua clasa,puteti utiliza si Object Browser.Deschi-
deti fereastra object Browser si apoi selectati in prima caseta de editare
optiunea Project1.Se vor afisa urmatoarele clase: Form1,Module1 si Class2.
Pentru definitia metodei,alegeti Class2,apoi alegeti Class_Initialize si
apoi apasati butonul View Definition.
Noua clasa a fost creata automat.Daca doriti sa verificati si codul
clasei,deschideti cu un editor oarecare fila salvata in proiect cu
extensia .cls.Observati ca definitia seteaza cateva atribute implicite si
apoi specifica definitia constructorului.
-36-
Clasele sunt necesare pentru a putea deriva obiecte.Obiectele se pot
crea atat in etapa de design cat si in timpul executiei programului:
EXEMPLU: deschideti un nou proiect de tip Standard.exe:
Daca bara de componente Toolbox nu este afisata,alegeti din meniul View
optiunea Toolbox.Cautati in bara de componente butonul de tip Command-
Button si executati un dublu click pe reprezentarea grafica.In fereastra
Form1 se va adauga automat un buton denumit Command1.Acesta este cel mai
simplu exemplu de obiect creat in etapa de design.
Apoi exectuati un click drept in fereastra si alegeti View Code.Editati
pentru fereastra Form1 urmatoarea procedura Click():
Private Sub Form_Click()
Dim Fereastra1 As new Form1
Randomize
Fereastra1.BackColor = RGB(Rnd*250,Rnd*250,Rnd*250)
Fereastra1.Show
End Sub
Daca doriti,puteti sa adaugati o procedura Click si pentru butonul de
comanda (Command1):
Private Sub Command1_Click()
MsgBox("Fereastra nou creata")
End Sub
Apoi executati exemplul cu Run si Start.La fiecare click de mouse in fe-
reastra,se va crea o noua fereastra (o noua instanta a clasei Form1).
Daca apasati butonul,se va afisa un mesaj.Ferestrele nou create vor avea
o culoare de fond aleatorie si sunt obiecte create in timpul executiei.
Se pot utiliza si bucle de repetitie,pentru a crea grupuri de obiecte,
dar in acest caz,trebuie sa adaugati si o procedura de control pentru
gestionarea memoriei libere (exista riscul de a consuma toata memoria).
Clasele si implicit si obiectele generate din ele,se bucura de trei
caracteristici fundamentale: encapsulare,mostenire si polimorfism.
Conceptul de incapsulare se refera la faptul ca o clasa,sau un obiect
grupeaza un set oarecare de date si metode ce pot fi apelate sub forma de
modul independent.Mai mult decat atat,clasa sau obiectul creaza un spatiu
de vizibilitate distinct de restul programului.Marea majoritate a datelor
dintr-o clasa sunt de tip Private si nu au vizibilitate decat in cadrul
clasei respective.O alta parte dintre date,pot fi accesate dar numai dupa
ce au fost filtrate cu ajutorul unor functii speciale (Set si Get).Doar
o mica parte dintre date,vor fi de tip Public sau Friend si vor putea fi
accesate direct din program sau din alte module.Acest gen de comparti-
mentare a spatiului de memorie,are o valoare exceptionala si previne o
mare parte dintre conflictele de identificator si suprascrierile acciden-
tale.Spre deosebire de modulele simple,clasele prezinta avantajul ca pot
fi clonate in nenumarate instante,in care datele de un anumit fel pot
avea valori diferite.Exemplu: in exemplul de mai sus,fiecare fereastra
nou creata va contine o alta valoare pentru proprietatea BackColor.Se
pot crea milioane de variante diferite.Pentru a obtine acelasi rezultat
cu module obisnuite,ar fi fost necesar cate un modul pentru fiecare
astfel de fereastra.In plus,clasa poate contine si date ce nu sunt utili-
zate in program,dar pot fi apelate in orice moment.Exemplu: clasa contine
si un numar important de proprietati si metode ce nu sunt exploatate in
aplicatia respectiva (fara sa ocupe spatiu suplimentar in memorie).
-37-
Conceptul de mostenire,se refera la abilitatea de a putea crea noi
clase,pe baza celor pre-existente.Noua clasa va mosteni toate proprieta-
tile,metodele si evenimentele clasei de baza (numita si clasa ancestoare).
Asadar,clasele sunt un fel de "sablon" nu numai pentru a deriva obiecte,ci
si pentru a crea noi clase.O astfel de noua clasa,se creaza cu instruc-
tiunea Class...End Class.Visual Basic 5.0 este un program de pionierat in
programarea structurata sub forma de obiecte vizuale si nu contine inca
aceasta instructiune (apare incepand cu Visual Basic 6.0).Conceptul de
clase derivate a fost exploatat mult mai amplu in alte programe visuale,
cum sunt Visual C++ si Visual FoxPro,etc.In aceste programe,clasele sunt
structurate sub forma de arbori genealogici.Din fiecare obiect cap de
serie se dezvolta progresiv mai multe clase descendente,cu proprietati
specifice.Clasa descendenta,mosteneste toate atributele claselor ances-
toare.Mai mult decat atat,este posibil ca o clasa noua sa fie formata prin
acumularea atributelor de la doua sau mai multe clase ancestoare,caz in
care poarta numele de mostenire multipla.Visual Basic 5.0 este doar un
program educativ.Pentru a aprofunda acest concept,este necesar sa achizi-
tionati o versiune mai noua de Visual Basic.
Conceptul de polimorfism,este derivat din cel de mostenire si se refera
la faptul ca o clasa poata contine mai multe metode care au acelasi iden-
tificator,dar sunt definite diferit.Acest gen de situatie se intalneste
mai rar in cazul claselor nou definite,dar este relativ frecvent in cazul
claselor ce mostenesc proprietati si metode de la doua sau mai multe clase
ancestoare.Pentru a exclude orice conflict de identificator,este necesar
ca in cele doua metode sa existe cel putin un parametru diferit.Daca in
ambele metode exista acelasi numar de paramtrii formati din acelasi tip
de data,in cazul unui apel al functiei respective,procesorul nu va sti pe
care sa o execute si va returna un mesaj de eroare (executia este intre-
rupta la nivelul liniei din care se face apelul).
EXEMPLU: o clasa poate contine urmatoarele metode:
Metoda1 (Nume As String,Varsta As Integer) si
Metoda1 (Nume As String,Prenume As String,Varsta As Integer)
deoarece in cele doua metode exsita un numar diferit de parametri.Pentru
a apela metoda,se va utiliza una dintre formulele:
Metoda1 (x,y) sau
Metoda1 (x,y,z)
In momentul executiei,procesorul va alege dintre cele doua variante pe
cea care corespunde cu numarul de parametrii solicitati.
daca o clasa contine insa urmatoarele metode:
Metoda1 (Nume As String,Varsta As Integer) si
Metoda1 (Produs As String,Cantitate As Integer)
apelul nu se poate face decat prin:
Metoda1 (x,y)
In acest caz,in momentul executiei,procesorul nu va sti sa aleaga dintre
cele doua metode si se va forma un conflict de identificator.
In ansamblu,fenomenul poarta numele de "supraincarcare a identificato-
rului".O clasa poate sa contina si doua sau mai multe astfel de metode
conflictuale,cu conditia conditia ca nici una dintre ele sa nu fie apelata
in program.Este preferabil insa sa redenumiti orice metoda sau proprietate
ce prezinta riscul de a genera un conflict de identificator,sau sa inlocu-
iti metoda respectiva cu o metoda noua (pentru a evita apelul).
-38-
Din conceptul de polimorfism deriva trei situatii posibile,denumite:
Overloading (supraincarcare),Overridding(suprapunere) si Shadow(inlocuire)
Toate cele trei situatii apar atunci cand o clasa contine doua metode cu
acelasi identificator.
Daca in cele doua metode exista parametri diferiti,situatia poarta
numele de supraincarcare si ambele metode pot fi apelate,cu conditia ca
sa se faca apelul prin Call (cu numarul complet de parametri).
Daca in cele doua metode exista acelasi numar de parametrii,de acelasi
tip,dar metodele sunt definite diferit si exista o conditie de precedenta
pentru una dintre metode (de exemplu este definita Private),atunci situa-
tia poarta numele de suprapunere.Pentru toate apelurile se va executa doar
metoda care are precedenta (de obicei cea locala).
Daca cele doua metode contin acelasi numar de parametri,de acelasi tip
si actioneaza asupra unui membru local ce are vizibilitate si in afara
obiectului,atunci functia locala va avea efect doar in interiorul obiectu-
lui dar va lasa nemodificata valoarea externa a membrului respectiv.Acest
gen de situatie poarta numele de inlocuire locala,sau "umbrire".
In toate situatiile este insa preferabil sa evitati utilizarea unui
identificator comun pentru doua sau mai multe metode.Exceptie fac doar
metodele importate dinamic din filele de tip .dll.In acest caz,nu se poate
evita fenomenul de supraincarcare,sau cel de suprapunere.Singura solutie
este sa apelati metoda prin parametri distincti,sau sa evitati apelul.
Este esential si modul in care realizati trecerea fluxului de exe-
cutie de la un obiect la altul.Sa presupunem ca doriti sa lucrati in pa-
ralel cu doua ferestre distincte:
EXEMPLU: deschideti un proiect nou,apoi alegeti din meniul Project
optiunea Add Form si confirmati cu Open.Proiectul va contine acum cele
doua ferestre Form1 si Form2.Selectati fereastra Form1 si editati urma-
torul cod in fereastra Project1 - Form1 (Code):
Private Sub Form_Click()
Form2.Show
End Sub
Private Sub Form_DblClick()
Form2.Hide
End Sub
Executati cu Run si Start.Cu un click de mouse in Form1 se va afisa si
fereastra Form2,iar cu un dublu click se va ascunde.Acelasi efect se poate
obtine si cu urmatorul cod:
Private Sub Form_Click()
Load Form2
Form2.Show
End Sub
Private Sub Form_DblClick()
Unload Form2
End Sub
Executati cu Run si Start.Rezultatul este acelasi.Diferenta consta in
faptul ca in primul caz,fereastra Form2 este prezenta in memorie si in
momentul in care nu este afisata,in timp ce in cel de al doilea caz,Form2
este eliberata din memorie cu Unload,sau respectiv este incarcata cu Load.
In prima solutie este posibil sa efectuati operatii si aspra ferestrei
ascunse,iar cea de a doua solutie face economie de memorie activa.
-39-
Visual Basic manipuleaza obiectele la fel ca pe niste variabile oare-
care.O variabila de tip Object ocupa 32 de biti(4 bytes) si contine doar
adresa de memorie la care este arhivat obiectul respectiv.Ca rezultat,
este usor de tinut evidenta unui numar mare de astfel de variabile,cu un
consum minim de memorie.Lucrurile se schimba insa atunci cand obiectul
trebuie sa fie incarcat in memorie (cand este activat).Obiectul propriu
zis,poate avea dimensiuni variabile.Atunci cand se lucreaza cu obiecte
complexe ce ocupa saptii mari de memorie,este necesar si un control per-
manent al memoriei libere.Din acest motiv,este indicat ca orice obiect ce
nu mai este necesar in program sa fie eliberat din memorie,pastrand doar
adresa sa de referinta.
Intre obiecte pot exista mai multe tipuri de relatii,dar cele mai
frevente sunt cele ierarhice si cele de contentie.Relatiile ierarhice
reglementeaza datele mostenite de la un obiect la altul,iar cele de con-
tentie permit operatii asupra unor grupuri de obiecte continute in acelasi
obiect container.Intr-un container,obiectele pot fi de acelasi tip,caz in
care sunt foarte usor de sortat si organizat,sau pot fi din tipuri complet
diferite,fara nici un fel de atribut comun.In acest caz,obiectele sunt
greu sau imposibil de organizat,dar pot fi referite in grup cu ajutorul
unei singure adrese de memorie (cea a containerului).Acest gen de grup de
obiecte se realizeaza pentru a putea incarca sau descarca mai usor un
grup de astfel de date (Exemplu: programul de instalare a unei aplicatii).
Obiectele intrinseci (cele din Toolbox),nu pot fi create cu ajutorul
operatorului New.Aceste obiecte se recomanda sa fie utilizate numai in
etapa de design a unei interfete.Obiectele derivate din clase,se pot crea
fie in etapa de design,fie in etapa de executie a programului.
Atunci cand se cunoaste exact tipul de obiect construit,este preferabil
sa se declare o variabila din tipul respectiv de data (din clasa respec-
tiva).Atunci cand nu se cunoaste exact ce tip de obiect ce se va crea,se
poate declara o variabila din tipul general Object,urmand ca tipul exact
de obiect sa fie specificat intr-o etapa ulterioara.Acest gen de solutie
este mai lent si are o prioritate de executie secundara fata de obiectele
construite in etapa de design.
EXEMPLU: deschideti o noua fereastra si editati urmatorul cod:
Private Sub Form_Click()
Dim Fereastra1 As Object
Set Fereastra1 = New Form1
f.Show
End Sub
Exemplul va functiona la fel ca si cel precedent.Diferenta consta in
faptul ca variabila Fereastra1 poate fi utilizata pentru a crea orice tip
de obiect.Conexiunea dintre variabila si adresa de memorie la care este
definit obiectul,se va face insa doar in momentul executiei unui click de
mouse,fenomen denumit "late binding = legare intarziata".In cazul in care
o fereastra este adaugata in etapa de design,cu Add Form (din meniul Pro-
ject),legatura dintre variabila ce manevreaza obiectul si adresa de memo-
rie la care este definit se face imediat,fenomen denumit "early binding =
legare precoce".In primul caz,fereastra se va incarca in memorie doar
atunci cand este necesara,in cel de al doilea caz,fereastra va fi prezenta
in memorie inca inainte de a incepe executia programului.Cea de a doua va-
rianta permite o evaluare mai simpla a memoriei consumate de program.
-40-
Obiectele pot fi create sau eliberate,automat,in serii.Se pot utiliza
variabile diferite,sau se poate aloca si elibera succesiv aceeasi varia-
bila.
EXEMPLU: deschideti un nou proiect si editati urmatorul cod in Form1:
Private Sub Form_Click()
Dim n
For n = 1 to 3
Dim f As New Form1
f.Top = n * 500
f.Left = n * 1000
f.Caption = "fereastra " + Str(n)
f.Show
MsgBox( "Fereastra " + Str(n))
f.Print n
Next
End Sub
Executati fereastra cu Run si Start.Observati ca se creaza succesiv trei
ferestre.La fiecare realocare,fereastra precedenta dispare din memorie.
Ca rezultat,fereastrele 1 si 2 au o existenta efemera,strict in interio-
rul buclei For...Next.Orice apel la aceste ferestre,facut din exteriorul
buclei For...Next,va genera un mesaj de eroare.
Exemplul de mai sus,atrage atentia asupra faptului ca intr-un program,
obiectele pot avea o existenta determinata temporar.Pentru a putea face
referire la un anumit obiect,este necesar sa fie in spatiul de vizibili-
tate actual al fluxului de executie si obiectul sa existe temporar in
acel moment.Orice referire la un obiect ce nu a fost creat inca,sau a fost
deja eliberat din memorie,va determina o eroare.In etapa de verificare si
depanare a programelor,va trebui sa urmariti si componenta temporala a
obiectelor apelate.In situatiile mai dificile,puteti utiliza niste puncte
de reper.De exemplu,amplasati cate un measj de tip MsgBox() atat in mo-
mentul in care este creat obiectul,cat si in momentul in care este elibe-
rat din memorie.Apoi executati programul si urmariti relatia temporala cu
obiectul care va intereseaza (uneori,obiectele pot fi create si eliberate
automat si este greu de evaluat momentul exact).
Pentru programele mici,este recomandabil sa utilizati doar obiecte
intrinseci,create in etapa de design si prezente in memorie pentru intrea-
ga perioada de executie a programului.Acest gen de programe sunt extrem
de usor de depanat si este foarte putin probabil sa genereze erori de exe-
cutie.Cu cat programele devin mai complexe si cu cat obiectele sunt mai
mari (de exemplu baze de date),cu atat este mai important ca o parte din-
tre obiecte sa fie eliberate din memorie,pentru a permite executia ope-
ratiilor necesare.Dinamica prin care se incarca sau se elibereaza din
memorie obiectele necesare este determinata de resursele hardware,dar si
de experienta programatorului.Nu are rost sa apelati la acest procedeu,
decat atunci cand volumul de date se apropie de volumul memoriei de ope-
rare.In general,este bine sa pastrati un spatiu liber in memoria de ope-
rare,de cel putin 10 % din volumul total (sau mai mult).
Pentru orice program mai mare,este bine sa faceti si o mica schita cu
volumul de memorie ocupata,in dinamica.Eventual,puteti utiliza programe
automate,ce afiseaza o lista cu procentul de memorie consumata in timpul
executiei (harta dinamica a memoriei de operare ).
-41-
Obiectele pot fi: vizuale,non-vizuale sau de tip ActiveX.Cele vizuale
(visuale) se caracterizeaza prin faptul cau au si o reprezentare grafica,
ce poate fi afista pe ecran.Toate obiectele vizuale au si o proprietate
denumita Visible,prin care se reglementeaza afisarea obiectului sau de-
rularea acestuia in fundal (background),fara afisarea componentei grafice.
Obiectele vizuale prezinta o serie de avantaje: 1.-sunt usor de identifi-
cat 2.-sunt usor de exploatat 3.-sunt usor de combinat pentru a forma o
interfata grafica cu utilizatorul.Pentru realizarea lor se utilizeaza si
una sau mai multe imagini grafice de tip BitMap,sau chiar efecte de ani-
matie.In rest,obiectele vizuale sunt la fel ca si cele nonvizuale:au pro-
prietati,metode si evenimente.
Obiectele nonvisuale nu au nici o reprezentare grafica in timpul exe-
cutiei.Existenta lor nu poate fi remarcata de catre utilizator si executa
toate operatiile in fundal (background).Se poate actiona asupra lor doar
la nivel de cod.
Obiectele de tip ActiveX,sunt in general obiecte vizuale (nu obliga-
toriu) si sunt astfel implementate incat sa poata fi utilizate pe plat-
forme diferite de exploatare.In general,se realizeaza tot cu ajutorul
unor reprezentari grafice de tip BitMap,la care se adauga proprietati,me-
tode si evenimente de tip Windows,implementate cu ajutorul functiilor API
Windows.In aceste obiecte,toate operatiile se executa strict in interio-
rul obiectului si au ca rezultat o valoare de un anumit tip,ce poate fi
returnata catre programul apelant.Ca rezultat,indiferent din ce program
se face apelul,obiectul va functiona ca un program independent si va re-
turna valoarea obtinuta.
In general,intre module si obiecte se vor prefera intotdeauna obiectele
(deoarece au si metode sau evenimente),iar dintre obiecte se vor prefera
cele vizuale (sunt simple,clare,se preteaza mai rar la erori).Pentru a
realiza programe ce urmeaza sa fie utilizate de persoane fara pregatire de
specialitate,se vor utiliza exclusiv obiecte vizuale,cu cat mai putine
optiuni si actiuni.In general,utilizatorii prefera sa poata realiza toate
operatiile cu ajutorul indicatorului mouse.Modulele se pot utiliza fie
pentru a exploata un program mai vechi,fie pentru a compartimenta codul:
EXEMPLU: - deschideti un proiect nou
-pentru a adauga un modul,alegeti din meniul Project optiunea
Add module si apoi New,confirmati cu Open,si editati urmatoarea procedura:
Sub Main()
MsgBox("Se executa modulul 1")
End Sub
Inchideti modulul.Pentru ca modulul sa fie executat,trebuie sa fie conec-
tat la fereastra Form1(care se executa implicit).Pentru acest scop,se pot
utiliza evenimentele ferestrei.De exemplu,pentru ca modulul sa fie exe-
cutat la inceputul programului,selectati fereastra Form1,deschideti View
Code si edutati urmtoarea procedura Load():
Private Sub Form_Load()
Main
End Sub
Executati cu Run si Start.
In module,se obisnuieste ca procedura principala sa fie denumita Main,
pentru a fi cat mai usor de identificat in etapa de depanare.Daca doriti,
puteti sa executati modulul prin evenimentul Click() in loc de Load().
-42-
In programele liniare,procedura Main() trebuia sa fie localizata in
modulul principal al programului si avea un rol cheie.Din aceasta proce-
dura sa faceau toate apelurile spre alte proceduri,functii sau module,dupa
care fluxul de executie se returna intotdeuna in Main().In plus,procedura
Main() trebuia sa contina si toate rutinele pentru managementul memoriei,
precum si solutiile de iesire din program,sau de tratare a erorilor.Orice
operatie de depanare,se facea urmarind secvential fluxul de executie din
aceasta procedura.
In programarea orientata spre obiect,controlul fluxului de executie nu
se mai realizeaza din procedura Main(),ci este determinat de evenimentele
din interfata grafica (este "event driven").Ca rezultat,programul poate
sa contina mai multe module,fiecare dintre ele cu cate o procedura Main(),
fara sa fie afectata functionalitatea programului.De exemplu,puteti uti-
liza o fereastra si cateva butoane,pentru a lansa in executie mai multe
programe mai vechi,realizate in module independente.Pur si simplu,conec-
tati fiecare program la evenimentul Click al unuia dintre butoane.
Fiecare obiect vizual are atasat si un modul pentru editarea codului.
In mod normal,nu este necesar sa adaugati module suplimentare,decat daca
doriti sa compartimentati codul(pentru a evita erorile prin suprascriere).
Utilizarea unui numar mare de obiecte vizuale prezinta si o serie de
dezavantaje.Fiecare obiect vizual,o data introdus in interfata grafica
este complet functional.Asta inseamna ca in momentul executiei va functio-
na la potential maxim,chiar daca nu se exploateaza decat o mica parte din
potentialul sau.De exemplu,fiecare obiect va emite permanent toate mesa-
jele generate de indicatorul mouse.Simplul fapt ca utilizatorul deplaseaza
indicatorul mouse deasupra obiectelor,fara sa selecteze nici unul dintre
ele,va genera o serie intrega de mesaje si evenimente.Toate aceste mesaje
vor fi preluate de functia Peek() si vor fi arhivate in stiva,in linie de
asteptare,pana cand vor fi prelucrate.Ca rezultat,procesorul executa si
un numar foarte mare de operatii inutile,prin care se intarzie executia
programului.Cu cat numarul de obiecte este mai mare,cu atat este mai mare
si numarul de evenimente inutile (mesaje fara corespondent).Exista doua
solutii:-fie reduceti numarul de obiecte,fie editati un filtru de mesaje,
prin care eliminati toate mesajele inactive.In general,nu este bine sa
utilizati obiecte vizuale doar pentru a "infrumuseta" aspecul aplicatiei.
Situatia se mutiplica exponential,atunci cand o anumita aplicatie este
Dostları ilə paylaş: