Visual Basic 0 abc-doar


RECORD si structurile de tip STRUCT,din care s-au dezvoltat obiectele si



Yüklə 0,98 Mb.
səhifə5/10
tarix03.11.2017
ölçüsü0,98 Mb.
#29921
1   2   3   4   5   6   7   8   9   10

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


Yüklə 0,98 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   10




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin