Objekti i klase u VBA

Reference na objekte

U pojedinim programskim jezicima (PASCAL, C/C++ i sl) postoji tzv. pokazivački tip podataka (eng. Pointer data type) čije su vrednosti adrese podataka u memoriji. Vrednost pokazivačkog tipa se naziva pokazivač zato što referiše ("pokazuje") na neku memorijsku lokaciju. Npr, neka je na memorijskoj adresi koja odgovara promenljivoj x smeštena neka vrednost (npr. realan broj 3.14), a p je pokazivač koji pokazuje na x (tj. vrednost od p je upravo adresa od x). PASCAL i C pružaju mehanizam da se na osnovu vrednosti pokazivača p (tj. adrese x) ustanovi vrednost u memorijskoj lokaciji na koju pokazuje p (tj. vrednost koju sadrži memorijska lokacija x). Taj proces se naziva dereferenciranje i u spomenutim jezicima se koristi različita notacija za pokazivač i dereferenciranu vrednost:

pokazivačdereferencirana vrednost
("ono" na šta pokazivač "pokazuje")
pp^ (PASCAL notacija)
p*p (C/C++ notacija)

Dakle, naredba programskog jezika C/C++

*p = 5;
ima isti efekat kao i naredba
x = 5;
ako je p pokazivač čija je vrednost adresa memorijske lokacije x.

ptr.png, 2.0kB

U drugim programskim jezicima (npr. VBA, C++, JAVA) umesto pokazivača (ili zajedno sa njima) se uvode reference na objekat. One su u osnovi isto što i pokazivači (tj. implementiraju se kao adrese objekata u memoriji), ali se prilikom korišćenja u programu tretiraju kao dereferencirane vrednosti, tj. nema nikakve razlike u označavanju reference i dereferencirane vrednosti.

Npr, neka je na memorijskoj adresi koja odgovara promenljivoj x smeštena neka vrednost (npr. realan broj 3.14), a r je referenca na x (tj. vrednost od r je upravo adresa od x). Tada bi naredba programskog jezika C/C++

r = 5;
imala potpuno isti efekat kao i naredba
x = 5;

Koji je smisao pokazivača i referenci? Prilikom rada sa dinamički kreiranim podacima u programu (npr. objektima u VBA), često je zgodnije posredno operisati sa objektom preko njegove adrese umesto direktno. Naime, objekti mogu biti različite složenosti u pogledu svojstava i metoda koje sadrže i njihovo kopiranje (sa svim svojstvima koja takođe mogu biti složeni objekti) ponekad predstavlja izuzetno skupu i složenu operaciju koja zahteva i prostorne (memorijske) i vremenske resurse. To posebno dolazi do izražaja prilikom naredbe dodele ili prenosa argumenata potprograma po adresi, gde nije potrebno da se ceo objekat kopira , već je dovoljno samo omogućiti drugim delovima programa (promenljivama i potprogramima) da pristupe objektu ili da ga promene.

Deklaracija objektnih promenljivih (referenci na objekat) u VBA

Deklaracija objektnih promenljivih je ista kao i za promenljive prostog tipa


 Dim imePromenljive As objektniTipTjKlasa

Ono što je važno napomenuti jeste da se deklaracijom objektne promenljive ne kreira sam objekat, već samo referenca na objekat (tj. promenljiva koja će sadržati adresu objekta i preko koje se radi sa objektom). Drugim rečima, ova deklaracija odvaja u memoriji SAMO lokaciju u kojoj će se čuvati adresa objekta, a ne i memorijski prostor za sam objekat.

Pošto tako deklarisana objektna promenljiva ne referiše ni na šta, tj. nije joj pridružena nijedna validna adresa u memoriji, ona automatski dobija specijalnu vrednost Nothing. Testiranjem da li objektna promenljiva ima vrednost Nothing se zapravo proverava da li objektna promenljiva referiše na neki objekat ili ne. Testiranje se obavlja posebnim operatorom Is.

If objektnaPromenljiva Is Nothing Then

    MsgBox 'Objektna promenljiva ne referisxe ni na sxta'

End If

Operator Is se koristi za upoređivanje da li dve objektne promenljive referišu na isti objekat.

If objektnaPromenljiva1 Is objektnaPromenljiva2 Then

    MsgBox 'Objektne promenljive referisxu na isti objekat

End If

Ako su objektnaPromenljiva1 i objektnaPromenljiva2 reference na objekte, tada je

objektnaPromenljiva1 Is objektnaPromenljiva2
logički izraz čija je vrednost True ako i samo ako obe reference referišu na isti objekat.

vbaobjekti.png, 7.9kB

Ako dva objekta, objektnaPromenljiva1 i objektnaPromenljiva2, pripadaju istoj klasi i imaju istovetne vrednosti odgovarajućih svojstava, a pritom zauzimaju različite memorijske lokacije, tada je

objektnaPromenljiva1 Is objektnaPromenljiva2 = False

Naime, tada je jedan od tih objekata kopija onog drugog i u tom smislu izgledaju istovetno, ali su njihove adrese u memoriji različite, a samim tim su i reference na te objekte različite, pa VBA tretira te objekte kao dva različita objekta.

Inicijalizacija objekata u VBA

Inicijalizacija objekta se obavlja u dve faze:

  1. Odvajanje memorijskog prostora za objekat;
  2. Inicijalizacija svojstava objekta.

U mnogim programskim jezicima obe pomenute faze se obavljaju pozivom posebnog metoda u klasi koji se zove konstruktor. U programskom jeziku VBA ove dve faze su razdvojene.

Odvajanje memorijskog prostora za objekat se obavlja pomoću posebnog oblika naredbe dodele Set koji koristi ključnu reč New.

Set objektnaPromenljiva = New ImeKlase

Efekat ove naredbe je da se adresa kreiranog objekta u memoriji dodeljuje objektnoj promenljivoj koja se dalje koristi kao referenca na objekat.

Međutim, da bi se objekat koristio, neophodno je inicijalizovati njegova svojstva na odgovarajući način koji zavisi od klase kojoj objekat pripada.