Ivica Kartelo - Visual Basic 6 Objekti PDF

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 153

Ivica Kartelo

Visual Basic
6 objekti

KOLA E-92 SPLIT


SSpplliitt,, 22000033..

Mojim dragim roditeljima.

II

Autor:
Ivica Kartelo, dipl. ing.
Urednik:
Ivica Kartelo
Naslov:
Visual Basic 6 objekti
Nakladnik:
kola E-92 d.o.o.
0RVHND6SOLW
Fax/Tel.: 021 569-777, 021 569-333, E-mail: skola-e-92@st.tel.hr
web: http://www.e92.hr
Za nakladnika:
5XLFD.DUWHOR0DUXLGLSOLXU
Tisak:
Kartular Split
3ULSUHPDVORJD]DWLVDNLJUDILNRREOLNRYDQMHRPRWD
Ivica Kartelo
Lektor:
,YDQ-%RNRYLSURI
8RYRMNQML]LSRMDYOMXMHVHQHNROLNR]DWLHQLK]QDNRYDLQD]LYDLMDMHXSRUDED
RJUDQLHQD]DNRQRP3RSLVWLK]QDNRYDLQD]LYDNDRLQMLKRYLKYODVQLNDQDOD]LVH
kod nakladnika.
Ivica Kartelo
I izdanje/Naklada: 500 kom.
6SOLWYHOMDD
Sva imena firmi, osoba, proizvoda i usluga koja se pojavljuju u knjizi i u
primjerima koji prate knjigu na Internetu su izmiljena.
Autor i Nakladnik ne snose odgovornost za posljedice koritenja ove knjige, niti
]DPRHELWQHSRJUHNHQDVWDOHXSURFHVXVWYDUDQMDNQMLJH2YRVHRGQRVLNDNRQD
knjigu, tako i na pohranjene datoteke na Internetu.
III

ISBN 953 - 6245 - 41 - X

IV

Sadraj
6DGUDM

VII

Internet............................................................................................................. VIII
Lekcija 1 Classes

-1-

Hijerarhija objekata................................................................................. - 2 Kolekcije................................................................................................. - 2 Handling Errors....................................................................................... - 8 Inline Error Handling.............................................................................. - 9 Lekcija 2 Primjer naeg osobnog objekta tipa kolekcije

- 11 -

Deklariranje naeg objekta kolekcije .................................................... - 11 Punjenje naeg objekta kolekcije s Item-ima........................................ - 12 Kolekcija i For...Each petlja ................................................................. - 14 Argumenti Before i After...................................................................... - 16 8NODQMDQMH,WHPDL]NROHNFLMHSRPRXPHWRGH5HPRYH ..................... - 18 Kontrola Array je podvrsta objekta tipa kolekcija ................................ - 19 Lekcija 3 Objekt Global

- 22 -

Lekcija 4 Rad na projektu Ivamar - kolekcije

- 25 -

Ugradimo kolekcije umjesto array-a .......................................................... - 25 Najprije izmijenimo izgled dokumenta cjenik.txt................................. - 25 8LWDMPRFMHQLNW[WXREMHNWWLSDNROHNFLMH ........................................... - 26 Izmjene kda u subproceduri cmdPonisti_Click()XYRHQMHPREMHNW
varijabli ................................................................................................. - 33 Lekcija 5 Ivamar i objekt App

- 36 V

Rad na projektu Ivamar ................................................................................. - 36 6SULMHLPRSRNUHWDQMHGYDSURJUDPD,YDPDUH[H ...................................... - 36 Svojstvo Path objekta App.................................................................... - 38 Lekcija 6 Ivamar i Kolekcija Printers

- 40 -

Lekcija 7 Ivamar i osobna svojstva forme

- 44 -

Kreiranje novog svojstva forme u projektu Ivamar....................................... - 44 Lekcija 8 Ivamar i nova forma

- 56 -

Dodavanje kontrola formi..................................................................... - 56 Pisanje dokumenta 'tezina.txt'............................................................... - 58 Kodiranje forme.................................................................................... - 59 Dohvat nove forme s glavne forme....................................................... - 61 Lekcija 9 Ivamar i osobni objekt Knjiga

- 62 -

Kreiranje objekta Knjiga ............................................................................ - 62 Kreiranje class modula Knjiga.............................................................. - 62 Kreiranje svojstava class modula Knjiga.............................................. - 63 Kreiranje varijabli Private u class modulu Knjiga................................ - 63 Kreiranje procedure Initialize ............................................................... - 64 Kreiranje procedura Let i Get class modula Knjige.............................. - 66 Spajanje programa na objekt Knjiga ............................................................. - 67 Promjene u glavnom obrascu radi ugradnje objekta Knjiga ...................... - 68 5DDQMHLXPLUDQMHREMHNDWD.QMLJDXSURMHNWX,YDPDU ........................ - 68 Promjena objekta Knjiga kada korisnik odabere novi naslov............... - 70 Promjene kda u proceduri optKom_Click .......................................... - 72 Promjene u proceduri cmdIzracunaj ..................................................... - 73 Unitavanje objekt varijabli Knjiga ...................................................... - 75 /HNFLMD'RGDYDQMHGRJDDMDSURMHNWX,YDPDU
VI

- 77 -

.RGLUDQMHGRJDDMDXFODVVPRGXOX.QMLJDFOV..................................... - 77 ,QWHJUDFLMDGRJDDMDX,YDPDU ............................................................... - 79 .RGLUDQMHGRJDDMD3URPMHQD3RGDWDND ................................................ - 80 Lekcija 11 Gradnja objekta "Paket"

- 85 -

Svojstva objekta Tezina ........................................................................ - 85 .RGLUDQMHGRJDDMSURFHGXUH,QLWLDOL]HFODVVPRGXOD7H]LQD ............... - 86 Kreiranje svojstava class modula Tezina.............................................. - 87 Ugradnja objekta Tezina u program Ivamar ......................................... - 88 /HNFLMD.ROHNFLMD1DUXGED

- 90 -

Kreiranje class modula 'Narudzba'........................................................ - 90 Kreiranje varijabli Private u class modulu Narudzba ........................... - 91 .{GLUDQMHGRJDDMSURFHGXUD,QLWLDOL]HL7HUPLQDWH ............................. - 91 Kodiranje metoda class modula Narudzba ........................................... - 92 Analiza .................................................................................................. - 93 Kreiranje metode Item class modula Narudzba .................................... - 95 Kreiranje metode Remove class modula Narudzbenica ....................... - 95 Kreiranje metode Count class modula Narudzba.................................. - 96 Kreiranje metode NewEnum class modula Narudzbe .......................... - 96 Kreiranje metode Ukupno class modula Narudzba .............................. - 98 Promijenimo kd u sekciji General Declarations forme frmGlavniObrazac101 Promjene u proceduri Click kontrola check box chkFormatKnjige ... - 102 Promjene kda u proceduri Click kontrole lstKnjige ......................... - 104 Promjene u proceduri Click kontrole optKom.................................... - 105 Promjene u proceduri Form_QueryUnload......................................... - 106 Promjene u proceduri cmdPonisti_Click ............................................ - 107 Promjene kda procedure Click kontrole cmdIzracunaj..................... - 108 Analiza ................................................................................................ - 110 VII

Lekcija 13 ActiveX komponente Ivamar Word

- 111 -

Dodavanje referencije u Word Object Library.................................... - 112 Promjene kda metode Ukupno u kolekciji Narudzba ....................... - 113 Dodavanje svojstva Popust class modulu Narudzba .......................... - 116 Analiza................................................................................................ - 116 Ugradnja kontrole cmdKupujem na glavnu formu ............................. - 117 3URPMHQHXFPG,]UDFXQDMUDGLXNOMXHQMDYLGOMLYRVWLJXPEDFPG.XSXMHP117 U cmdPonisti sakrijmo gumb Kupujem ............................................. - 118 7LVNDQMHQDUXGEH............................................................................... - 118 Lekcija 14 ActiveX komponente Ivamar - Excel

- 129 -

Pravljenje ActiveX komponente od naeg class modula Tezina ........ - 129 Kreiranje projekta ActiveX.DLL ........................................................ - 131 Analiza................................................................................................ - 133 Novi projekt STANDARD.EXE i komponenta IvamarTezina.DLL.. - 133 Excel i naa komponenta ActiveX.DLL ............................................. - 137 Na kraju......................................................................................................... - 140 -

VIII

Internet
Programski kd projekta Ivamar napravljenog u knjizi Visual Basic 6
Ova knjiga je nastavak knjige Visual Basic 6. Svi koji su kupili prvu knjigu imaju
napravljenu aplikaciju Ivamar. Oni koji nisu kupili prvu knjigu mogu tu aplikaciju
VNLQXWLV,QWHUQHWDMHUHLPWUHEDWL]DUDGSRRYRMNQML]L
http://www.e92.hr/ivamar.htm
Na navedenoj URL moete skinuti ivamar.zip. Kad kopirate datoteku ivamar.zip
(35 kb) na svoje raunalo u njojete nai cijeli projekt Ivamar i sve potrebno za
njegov rad:

,YDPDU9LVXDO%DVLF3URMHFWQHNRPSDMOLUDQ0RHWHJDXLWDWLX9LVXDO
Basic i kopirati kd.

GlavniObrazac, Visual Basic Form File

cjenik.txt Notepad datoteka preko koje korisnici mijenjaju naslove


knjiga i cijene formata tih knjiga. Ovaj dokument morate pohraniti u mapu
C:\Ivamar\cjenik.txt.

-DYD6FULSWMSJ9LVXDO%DVLFMSJ+70/MSJWULJUDILNHGDWRWHNHPRUDWH
pohraniti u mapu C:\Ivamar\.

,]YUQDLOLSURJUDPVNDGDWRWHNDLYDPDUH[H0RHWHMHSRKUDQLWLJGMHHOLWH
Zaporka za izlaz: 1234.
6YHJRUHQDYHGHQHGDWRWHNHRVLPLYDPDUH[HDPRHWHLQMXNRSLUDMWHXPDSX
NRMXVWHSUHWKRGQRNUHLUDOLLLMLMHSXW&?,YDPDUQDYDHPUDXQDOX
IX

U ovoj knjizi mijenjate Visual Basic Project Ivamar, napravljen u knjizi Visual
%DVLFWDNRWRHLVWLELWLREMHNWQLMLQHJRGRVDGD
Programski kd projekta Ivamar napravljenog u ovoj knjizi
&LMHOL9LVXDO%DVLFN{GSURMHNWD,YDPDUNUHLUDQRJXRYRMNQML]LHWHQDLQD
Internetu na URL:
http://www.e92.hr/ivamarobjektno.htm

XI

Lekcija 1
Classes
U knjizi Visual Basic 6 gradili smo aplikaciju Ivamar od "temelja
GRNURYDSRPRXNRQWUROD.RQWUROHVPRX]LPDOLV7RRO%R[D
to su kontrole?
.RQWUROHVXREMHNWLNRMLJUDGHVXHOMHQDHDSOLNDFLMH7RVXHOMHMH
:LQGRZVVXHOMH*GMHMHQDSLVDQN{GWLKNRQWUROD"
Kd kontrola koje vidimo na Tool Box-u je napisan u modulima
koje je Microsoft nazvao classes0LWHPRGXOHQHPRHPRYLGMHWL
SDLKQHPRHPRQLWLPLMHQMDWL
0HXWLPPLPRHPRQDSUDYLWLQDHFODVVHVPRGXOHNRPSDMOLUDWL
ih u ActiveX kontroleLXLQLWLLKYLGOMLYLPQD7RRO%R[XNDRWR
VPRWRXLQLOLVNRQWURORP&RPPRQ'LDORJXNQML]L9LVXDO%DVLF
6.

Tool Box

Classes moduli su predloci kontrola. Dodate li formi na primjer


kontrolu command button drugi put, nova kontrola command
EXWWRQHVHSRMDYLWLQDLVWRPPMHVWXQDIRUPLL]QDGSUYH
NRQWUROH7R]QDLGDVXWLPNRQWURODPDVYDVYRMVWYDMHGQDNDSD
DNLRQDNRMDRGUHXMXSR]LFLMXNRQWUROHQDIRUPL0LMHQMDVH
samo svojstvo Name: Command1, Command2 itd.
Command1, Command2 itd. su instance class modula command
button.

U prvoj knjizi o Visual Basicu koristili smo kontrole, mijenjali njihova svojstva,
NRGLUDOLQMLKRYHGRJDDMSURFHGXUH.RQWUROHVXJRWRYLXJUDHQLREMHNWLLMHVX
FODVVPRGXOHQDSUDYLOL0LFURVRIWRYLSURJUDPHUL8RYRMHPRNQML]LQDSUDYLWL
VYRMHREMHNWHRGQXOH3LVDWHPRQDHFODVVPRGXOH1DLPREMHNWLPDHPR
NUHLUDWLVYRMVWYDPHWRGHLGRJDDMHSUHPDSRWUHEL7HNHPRXRYRMNQML]L
upoznati pravu sliku objektno orijentiranog programiranja i njegove prednosti
SUHGNODVLQLPVWUXNWXUQLPSURJUDPLUDQMHP
HPXWRNDGQDDDSOLNDFLMD,YDPDULEH]WLKREMHNDWDGREURUDGL"=DWRHPR
SUDYLWLVYRMHREMHNWHLXJUDLYDWLLKX,YDPDU"

=DWRWRHVH]QDWQRSRMHGQRVWDYQLWLFLMHOLN{GSURMHNWD,YDPDURODNDWL
RGUDYDQMHLXQDSUHHQMHSURMHNWD7RHWHVYHPRLGRLYMHWLLQDQDHPSURMHNWX
,YDPDUNRMLMHWHNGMHOLYHOLNLKNRUSRUDFLMVNLKSURMHNDWD8YHOLNLPMHSURMHNWLPD
objektno orijentirano programiranjeGRQLMHORYHOLNHXWHGH1H]QDLWRXYLMHN
PDQMHNRGLUDQMDLDNRMHLWRMHGQRRGSRVWLJQXDSRVHEQRNRGYHOLNLKSURMHNDWD
2EMHNWQRRULMHQWLUDQRSURJUDPLUDQMHMHSULMHVYHJDXQLMHORYLHORJLNRJUHGDX
FMHORNXSQLN{G+LMHUDUKLMDREMHNDWDRPRJXDYDODNLGRKYDWVNXSLQHREMHNDWD
SUHNRQDGUHHQRJREMHNWD6GUXJHVWUDQHFMHORYLWRVWREMHNWDLILOR]RILMD
VYHVYRMH
QRVLPVDVRERP
RPRJXDYDHWDQMHREMHNDWDNDNRXQXWDUMHGQHDSOLNDFLMHWDNRL
L]PHXSRHOMLYLHDSOLNDFLMD
To je dovelo do eksplozije radnih mjesta na kojima se 'proizvode' objekti po
QDUXGEL1D]LYDMXVH$FWLYH;NRPSRQHQWH3RMDYRP,QWHUQHWDPQRJLVXQDL
programeri ostali u svom rodnom gradu i proizvode komponente za svjetsko
WULWHVRIWZDUHD
8RYRMNQML]LLPLHPRQDSUDYLWLVYRMH$FWLYH;NRPSRQHQWHLLVSUREDWLLKXUDGX
s Wordom, Excelom i naom Visual Basic aplikacijom.
Hijerarhija objekata
Visual Basic je hijerarhija objekata koja se najbolje vidi u dot notaciji. Postoje
XJUDHQLREMHNWLLRQLNRMHHPRPLQDSUDYLWL8JUDHQLREMHNWLVXQDSULPMHU
NRQWUROHLIRUPHDXRYRMNQML]LHPRQDSUDYLWLLVYRMHREMHNWH
6YDNLREMHNWLPDVYRMHPMHVWRXKLMHUDUKLML6YDNDIRUPDQDSULPMHUPRHLPDWL
YLHNRQWUROD2EMHNW
)RUP
MHQDGUHHQREMHNWLPDNRQWUROD6YDNDIRUPDLPD
VYRMHNRQWUROH,]PHXQMLKSRVWRMLMRMHGDQREMHNWControls. Svim formama u
MHGQRMDSOLNDFLMLMHQDGUHHQREMHNWForms.
Forms i ControlsVXXJUDHQLREMHNWLWLSDNROHNFLMH
Kolekcije
Collection (kolekcija) je objekt. Objekt tipa kolekcije ima jedno svojstvo
(property) imenovano s Count i tri metode: Add, Item i Remove. Visual Basic
DXWRPDWVNLQDNRQSRNUHWDQMDDSOLNDFLMHNUHLUDVSHFLILQHNROHNFLMHPHXNRMLPDL
)RUPVL&RQWUROV7HXJUDHQHNROHNFLMHVHQD]LYDMXkolekcije sustava.
8NQML]L9LVXDO%DVLFVPRUDGLOLVDUUD\LPDSDQDPVHQDPHHSLWDQMHXHPX
VHUD]OLNXMHNROHNFLMDRGDUUD\D5D]OLNDMHXVOMHGHHP

Kolekcija je objekt koji kao i svaki objekt ima svojstva i metode.

$UUD\QLMHREMHNWMHUQHPDQLWLMHGQRVYRMVWYRPHWRGXLOLGRJDDM7RMH
jedna struktura.

ODQRYLNROHNFLMHPRJXELWLUD]OLLWRJWLSD1DSULPMHUNROHNFLMD&RQWUROV
LPD]DODQRYHVYHNRQWUROHQDMHGQRMIRUPLFRPPDQGEXWWRQRSWLRQ
button itd.

$UUD\PRHVDGUDYDWLSRGDWNHLVWRJWLSD1DSULPMHUDUUD\VDPRRG
kontrola check box, samo od kontrola option button itd.

,NROHNFLMDLDUUD\EURMHVYRMHODQRYHRGQXOHDLQGHNVLUDQMHODQRYDWLP
EURMHYLPDMHMHGLQLQDLQGRKYDDQMDLVWLKXDUUD\X

8NROHNFLMLVYDNLODQLPDVYRM.H\MHGLQVWYHQLNOMX'RKYDDQMHODQRYD
SRPRXMHGLQVWYHQRJNOMXDMHPQRJREROMHUMHHQMHQHJRSRPRXEURMHYD

I array i kolekcija su 'izmiljeni' za petlju For...Each.

Pogledajmo primjer kolekcije Controls.


Kolekcija Controls jest kolekcija svih kontrola na jednoj formi. Preciznije, svaka
NROHNFLMDMHNROHNFLMDUHIHUHQFLMDLMLKUHIHUHQFLMD"5HIHUHQFLMDREMHNDWD7HVX
UHIHUHQFLMHXKYDHQHPHWRGRPItem. Dakle, svaka kolekcija je kolekcija Item-a, a
svaki Item u jednoj kolekciji je referencija jednog objekta. Prema tome, Controls
MHNROHNFLMDLML,WHPLVDGUHUHIHUHQFLMHNRQWURODQDMHGQRMIRUPL
Jasno, svaki objekt zauzima svoje mjesto u memoriji i ima svoju adresu. Zato bi
VDGNROHNFLMDSRQRYRVDGUDYDODLVWHWHREMHNWHQDQHNRPVYRPPMHVWXX
memoriji. Kolekciji su dovoljne referencije adresa u memoriji. Kolekcija je neka
vrsta telefonskog imenika.
=DWR,WHPHMHGQHNROHNFLMHVPDWUDPRSRND]LYDLPDLOLSRLQWHULPDMHU
SRND]XMX

QDDGUHVHREMHNDWDODQRYDNROHNFLMH
3RND]LYD]DX]LPDVYHJDHWLULEDMWDELWDUDXQDOQHPHPRULMH 5$0D 
Primjer.
1. Pokrenite Visual Basic i otvorite novi projekt Standard.EXE.
2. Na Form1 ugradite po jednu kontrolu option button, check box, command
button i list box:

3. Pokrenimo projekt.
4. Pauzirajmo projekt.
5. U prozor Immediate tipkajmo ? Form1.Controls.Count i pritisnimo Enter:

'RELOLVPRUH]XOWDWMHUNROHNFLMD&RQWUROVVDGUL,WHPD3RMHGDQ,WHP
za svaku kontrolu na formi Form1.
6. Zaustavite Projekt1.
7. Obriite list box.
8. Pokrenite projekt.
9. Pauzirajte projekt.
10. 3RQRYLWHLVWLLVSLVXSUR]RUX,PPHGLDWHLGRELWHWHEURM
Svojstva svakog Item-a u kolekciji

6YDNL,WHPXNROHNFLMLLPDVYRMEURM%URMHYLSRLQMXVQXORPNDRNRGDUUD\D
1DSULPMHUHOLPR]QDWLVYRMVWYR1DPHSUYRJ,WHPDXNROHNFLML
Pokrenemo projekt, pauziramo projekt, u prozor Immediate napiemo
")RUP&RQWUROV  1DPHLSULWLVQHPR(QWHU'RELWHPR

3URJUDPHUPRHVYRMLPN{GRPPLMHQMDWLVYRMVWYDNRQWUROD]DYULMHPHUDGD
aplikacije.
1DSULPMHU]DYULMHPHSDX]HWLSNDMWHVOMHGHLN{GXSUR]RU,PPHGLDWHLL]DVYDNRJ
retka pritisnite Enter:

3RNUHQLWHSURMHNWLNRQWUROHHLPDWLQRYHYULMHGQRVWLVYRMLKVYRMVWDYD&DSWLRQ

Petlje nad kolekcijom

0RHPRVORERGQRUHLNDNRVXNROHNFLMHL]PLOMHQHUDGLSHWOMHFor...Each, koja
HRELLVYH,WHPHXNROHNFLML-HNROHNFLMDGRYROMQD]DSHWOMX"1LMH3RUHG
NROHNFLMHLQMHQLK,WHPD]DSHWOMX)RU(DFKMHSRWUHEQDMRLYDULMDEOD%XGXLGD
MHNROHNFLMDREMHNWQMHQLODQRYLVXREMHNWLSDVHLYDULMDEODQD]LYDobjekt
varijabla.
Objekt varijabla

'RNVWDQGDUGQDYDULMDEODVDGULQHNXYULMHGQRVWREMHNWYDULMDEODMHLVWRWRL,WHP
XNROHNFLML2EMHNWYDULMDEODQHVDGULNRQWUROXQHJRUHIHUHQFLMXNRMDSRND]XMHQD
tu kontrolu. U petlji For...Each objekt varijabla je jo udaljenija od objekta jer
5

SRND]XMHQD,WHPXNROHNFLMLD,WHPSRND]XMHQDREMHNW3RND]XMXLQD,WHPHX
NROHNFLMLREMHNWYDULMDEODHXSHWOML)RU(DFKSURLVYH,WHPH
Napravite novi projekt s ovim kontrolama:

HOLPRSURPLMHQLWLVYRMVWYR&DSWLRQVYLPNRQWURODPDQDIRUPL
1. U Click proceduru kontrole Command1 tipkajte ovaj kd:
Private Sub Command1_Click()
Dim objKartelo As Control
Dim intBrojac As Integer
For Each objKartelo In Form1.Controls
objKartelo.Caption = "Kontrola " & intBrojac
intBrojac = intBrojac + 1
Next
End Sub
2. Pokrenite projekt.
3. Pritisnite tipku mia na Comand1. Javlja se greka:

4. Pritisnemo na gumb Debug.

5. Program je pao unutar petlje. Zato? Kontrola Text Box nema svojstvo
Caption i program je stao.
6. Zaustavite projekt i ubacite ovaj kd:
Private Sub Command1_Click()
Dim objKartelo As Control
Dim intBrojac As Integer
For Each objKartelo In Form1.Controls
If TypeOf objKartelo Is CommandButton Or _
TypeOf objKartelo Is CheckBox Or _
7

TypeOf objKartelo Is OptionButton Or _


TypeOf objKartelo Is Label Or _
TypeOf objKartelo Is Frame Then
objKartelo.Caption = "Kontrola " &
intBrojac
intBrojac = intBrojac + 1
End If
Next
End Sub
7. Pokrenite projekt i odaberite Command1.

Analiza

Koritenje operatora TypeOf je vrlo nespretno kada se radi o mnogo kontrola.


Zato je preskakanje greke ili Handling Errors jednostavnije rjeenje.
Handling Errors
8. U gornjem primjeru, u Click proceduru kontrole Command1 tipkajte ovaj
kd:
Private Sub Command1_Click()
On Error GoTo Preskoci
Dim objKartelo As Control
8

Dim intBrojac As Integer


For Each objKartelo In Form1.Controls
objKartelo.Caption = "Kontrola " & intBrojac
intBrojac = intBrojac + 1
Next
Exit Sub
Preskoci:
Select Case Err.Number
Case 438
Resume Next
Case Else
MsgBox "Nepredvidjena greska"
End Select
End Sub
9. Pokrenite projekt i odaberite Command1. Program ne pada.
Inline Error Handling
,QOLQH(UURU+DQGOLQJMHYUORSUDNWLDQN{GNDGDHOLPRSUHVNRLWLELORNRMX
greku.
10. Tipkajte ovaj kd:
Private Sub Command1_Click()
On Error Resume Next
Dim objKartelo As Control
Dim intBrojac As Integer

For Each objKartelo In Form1.Controls


objKartelo.Caption = "Kontrola " & intBrojac
intBrojac = intBrojac + 1
Next
End Sub
11. Pokrenite projekt i odaberite Command1. Program ne pada.

10

Lekcija 2
Primjer naeg
osobnog objekta
tipa kolekcije
1DSUDYLWHPRDSOLNDFLMXSRPRXNRMHHPRXVYDNRPWUHQXWNXPRLVD]QDWL
NROLNRVWUDQLFDLPDSRMHGLQDNQMLJDXQDRMQDNODGL7DNRHUHPRPRLVD]QDWLL
XNXSDQEURMVWUDQLFDVYLKNQMLJD]DMHGQR1DSUDYLWHPRREMHNWNROHNFLMXLGRGDWL
PXQDHNQMLJHWDNRWRHPRQDMSULMHSLVDWLEURMVWUDQLFDFUWLFDQDVORYNQMLJH
3LVDQMHEURMDQDSRHWNXQHNRJVWULQJDMHGREDUWULNNDGQDPWDMEURMWUHEDX
PDWHPDWLNLPRSHUDFLMDPD3RPRXIXQNFLMH9DO9LVXDO%DVLFHJDL]GYRMLWLRG
RVWDORJVWULQJDLNRULVWLWLNDREURMWDPRJGMHWRHOLPR
Deklariranje naeg objekta kolekcije
1. Pokrenite novi projekt s jednom formom i na njoj dvije kontrole command
button.

11

2. 8VHNFLMX*HQHUDO'HFODUDWLRQVWLSNDMWHVOMHGHLN{G
Option Explicit
Private m_colKnjige As New Collection
Analiza

'HNODULUDOLVPRREMHNW.QMLJHX*HQHUDO'HFODUDWLRQV]DWRWRHELWLGRKYDWOMLYL]
VYLKSURFHGXUDXIRUPL PRGXOX 'RGDFLLVSUHGLPHQD.QMLJHPBFRO]QDHGDMH
objekt na razini modula (m), tip kolekcije (col). Ta 'predslova' ispred imena
REMHNWDVXUH]XOWDWGRJRYRUDPHXSURJUDPHULPD.{GWDNRSRVWDMHUD]XPOMLYLML
kako autoru, tako i nasljednicima. Nismo deklarirali tip objekta jer objekt
NROHNFLMDPRHSULPLWLUD]OLLWHWLSRYHSRGDWDND
Gornjom deklaracijom smo ugradili instancu objekta tip Collection. Instanca ima
VYHRVRELQHXJUDHQRJSUHGORNDXJUDHQRJFODVVPRGXODCollectionSRLMRM
'slici i prilici' je 'instancirana'.
.DRWRVPRNUHLUDOL)RUPQDRVQRYXXJUDHQRJFODVVPRGXODForm, kao to
VPRNUHLUDOLGYLMHNRQWUROHFRPPDQGEXWWRQQDRVQRYLXJUDHQRJFODVVPRGXOD
CommandButton, tako smo kreirali i objekt m_colKnjige na osnovi class modula
Collection.
Form1, Command1, Command2 i m_colKnjige su instance svojih class modula i
LPDMXRVRELQHWLKFODVVPRGXOD)RUP&RPPDQG&RPPDQGL]PHXRVWDORJ
SRVHEQLVXLSRWRPHWRVXYLGOMLYLLPDMXVYRMHSRMDYQHREOLNHXJUDILNRP
VXHOMXQDHJSURMHNWD7RQDREMHNWPBFRO.QMLJHQHPD1HVXGMHOXMHX
JUDILNRPVXHOMXQHJRVDPRXN{GXL]DVFHQH

12

Punjenje naeg objekta kolekcije s Item-ima


3. 'RGDMWHVOMHGHLN{GSURFHGXUL&OLFNNRQWUROHFRPPDQG
Private Sub Command1_Click()
m_colKnjige.Add "145-Word", "Word"
m_colKnjige.Add "161-Excel", "Excel"
m_colKnjige.Add "272-Access", "Access"
m_colKnjige.Add "184-FronPage", "FrontPage"
m_colKnjige.Add "234-Internet", "Internet"
m_colKnjige.Add "108-C", "C"
End Sub
Analiza

Class modul Collection prenosi na instance svoje svojstvo Count i sve svoje
PHWRGHPHXNRMLPDMHLPHWRGD$GG8JUDHQDPHWRGDAddNRMDVOXL]D
GRGDYDQMH,WHPDNROHNFLMLSUHQLMHWDMHLXJUDHQDXQDXLQVWDQFXFODVVPRGXOD
Collection, u objekt m_colKnjige. Sintaksa kdiranja metode Add je:
Add (Item As Variant [, Key As String] [, Before As
Variant] [, After As Variant]
ODQNRMHJSUYRJGRGDWHNROHNFLMLLPDWHEURMLWDNRUHGRPLWG'RNMH
$UUD\ED]LUDQQDLWGNROHNFLMHSRLQMXV$NRHOLPRQHNL,WHPGRGDWL
SULMHLOLSRVOLMHQHNRJGUXJRJ,WHPDWDGHPRNRULVWLWLDUJXPHQWH%HIRUHL$IWHU
8QDHPVOXDMXVPRGRGDOLHVW,WHPDNROHNFLMLPBFRO.QMLJH3UYL,WHPMH
pohranjen pod brojem 1, a zadnji pod brojem 6.
6LQWDNVDN{GLUDQMDMHVOMHGHD1DMSULMHSLHPRLPHREMHNWDNROHNFLMH
PBFRO.QMLJHSDWRNX RYGMHVHWRNDQDHQJOHVNRPQH]RYH
SRLQW
QHJR
GRW
SD
se po tome ovakvo kdiranje naziva dot notacija). Sljedi razmaknica pa Item kojeg
HOLPRGRGDWL8QDHPVOXDMXMH,WHPVWULQJ QDSULPMHU:RUG SD]DWRLGH
pod navodnicima.
,WHP:RUGHELWLSRKUDQMHQSRGEURMHP7RMHWDNRVQDLPREMHNWLPD
0HXWLPVYLXJUDHQLREMHNWLNROHNFLMHPHXNRMLPDVXLNROHNFLMH)RUPVL
&RQWUROVVXED]LUDQHQDQXOL7DUD]OLNDXEURMHQMX,WHPDL]PHXXJUDHQLKL
QDLKNROHNFLMDMHUDGLEU]RJL]ODHQMDQRYLKYHU]LMDSURJUDPD8JUDHQHNROHNFLMH
su postojale prije nego su uvedene osobne kolekcije i baziraju se na nuli od svog
nastanka. Poto je puno lake upravljati s brojenjem od 1, kod osobnih kolekcija
13

VHSUHORQDED]LUDQREURMHQMH8WRPVOXDMXHVYRMVWYR&RXQWL]EDFLWLXNXSDQ
EURM,WHPDXQDRMNROHNFLML.DGHOLPRVD]QDWLNROLNR,WHPDLPDXQHNRM
XJUDHQRMNROHNFLMLPRUDPRVYRMVWYR&RXQWXPDQMLWL]D &RXQW 
m_colKnjige.Add "145-Word"
Gornji kd je dovoljan za dodavanje Item-a kolekciji. Mi smo imali ovaj kd:
m_colKnjige.Add "145-Word", "Word"
to je ono u nastavku? Ono u nastavku je opcijski argument Key. To je podatak
po kojem se pojedini Item razlikuje od svih ostalih Item-a u kolekciji. Njegova
uloga je ista onoj koju ima ID (identifikacijska oznaka) pojedinog zapisa u
bazama podataka.
1DPDHELWLSXQRODNHSR]YDWLQHNL,WHPSRQMHJRYRPDUJXPHQWX.H\QHJRSR
broju lake je pozvati knjigu Word po njenom naslovu Word nego po njenom
broju 1. Osim toga brojevi se stalno mijenjaju kako briemo i dodajemo nove
naslove u kolekciju, a Key je uvijek isti.
Provjerimo:
Pokrenite projekt, pritisnite Command1, pauzirajte i u prozoru immediate tipkajte:

? m_colKnjige(1)

Pritisnite Enter.

Ili

Tipkajte ? m_colKnjige("Word") pa odaberite Enter:

Argument Key je naveden pod navodnicima zato to je string.


Kolekcija i For...Each petlja
4. U proceduru Click kontrole Command1 tipkajte ovaj kd:
Private Sub Command2_Click()

14

Dim objItem As Variant


Dim intBrojac As Integer
For Each objItem In m_colKnjige
intBrojac = intBrojac + Val(objItem)
Form1.Print objItem
Next
Form1.Print
Form1.Print "Ukupno stranica: " & intBrojac & _
" u " & m_colKnjige.Count & " knjiga."
End Sub
Analiza

,PDPRREMHNWPBFRO.QMLJH3RPRXSHWOMH)RU(DFKHOLPRGRKYDWLWLVYDNRJ
ODQD ,WHP NROHNFLMHUHGRPMHGQRJSRMHGQRJ=DWDMSRVDRMHXYMHNSRWUHEQR
GHNODULUDWLREMHNWYDULMDEOXWRVPRLXLQLOL
Dim objItem As Variant
2EMHNWYDULMDEOXVPRGHNODULUDOLJHQHULNLWLSRPQDMYLHUD]LQHYDULDQW
Ta varijabla je dalje koritena u For...Each petlji za dohvat svih Item-a:
Dim intBrojac As Integer
For Each objItem In m_colKnjige
intBrojac = intBrojac + Val(objItem)
Form1.Print objItem
Next
I na kraju smo iskoristili jedino svojstvo koje ima kolekcija svojstvo Count za
dohvat ukupnog broja stranica:
Form1.Print
Form1.Print "Ukupno stranica: " & intBrojac & _
" u " & m_colKnjige.Count & " knjiga."
15

Pokrenite projekt.

Pritisnite tipku mia na Command1.

Pritisnite tipku mia na Command2.

1DSUYLSRJOHG]QDDMQLMLKUD]OLNDL]PHXNROHNFLMDLDUUD\DNDRGDQHPD
0HXWLPNDGGXEOMHXHPRXREMHNWQRRULMHQWLUDQRSURJUDPLUDQMHUD]OLNHVX
ogromne. Jednostavno, array nije objekt a kolekcija jest i kao takva je
nezamjenjiva u objektno orijentiranom pristupu.
Jo neto o argumentu Key. Ukoliko bismo kolekciji dodali novi Item i zabunom
SLVDOL.H\NRMLYHSRVWRMLXNROHNFLMLNDGSRNUHQHPRSURJUDPLRGDEHUHPR
&RPPDQGGRELWHPRSRUXNX
Run-time error '457':
Thiskey is already associated with an element of this collection
'DNOHGRJDDVHLVWRWRLXED]DPDSRGDWDND6XVWDYQDVWLWLRGPRJXHJ
ponavljanja argumenta Key.
Argumenti Before i After
5. U Click proceduru kontrole Command1 dodajte kd u zasjenjenom retku:
Private Sub Command1_Click()
m_colKnjige.Add "145-Word", "Word"
m_colKnjige.Add "161-Excel", "Excel"
m_colKnjige.Add "272-Access", "Access"
16

m_colKnjige.Add "184-FronPage", "FrontPage"


m_colKnjige.Add "234-Internet", "Internet"
m_colKnjige.Add "108-C", "C"
m_colKnjige.Add "61-WEB KREATOR", "Web kreator",
"ACCESS"
End Sub
6. Pokrenite projekt, odaberite gumb Command1 pa Command2:

%LORMHRYRN{GLUDQMHSRPRXDUJXPHQWD%HIRUH
7. =DXVWDYLWHSURMHNWLN{GLUDMWHSRPRXDUJXPHQWD$IWHUNRULVWHLEURM
Itema-a:
Private Sub Command1_Click()
m_colKnjige.Add "145-Word", "Word"
m_colKnjige.Add "161-Excel", "Excel"
m_colKnjige.Add "272-Access", "Access"
m_colKnjige.Add "184-FronPage", "FrontPage"
m_colKnjige.Add "234-Internet", "Internet"
m_colKnjige.Add "108-C", "C"
m_colKnjige.Add "61-WEB KREATOR", "Web kreator", , 1

17

End Sub
8. Pokrenite projekt, odaberite gumb Command1 pa Command2:

%LORMHRYRN{GLUDQMHSRPRXDUJXPHQWD$IWHU
8NODQMDQMH,WHPDL]NROHNFLMHSRPRXPHWRGH5HPRYH
9. U proceduru Click kontrole Command1 tipkajte kd u zasjenjenom retku:
Private Sub Command1_Click()
m_colKnjige.Add "145-Word", "Word"
m_colKnjige.Add "161-Excel", "Excel"
m_colKnjige.Add "272-Access", "Access"
m_colKnjige.Add "184-FronPage", "FrontPage"
m_colKnjige.Add "234-Internet", "Internet"
m_colKnjige.Add "108-C", "C"
m_colKnjige.Add "61-WEB KREATOR", "Web kreator", , 1
m_colKnjige.Remove 2
End Sub
10. Pokrenite projekt, odaberite gumb Command1 pa Command2:

18

11. Nema knjige WEB KREATOR koja se pojavljivala na poziciji Item-a broj
2.
Analiza

Knjiga WEB KREATOR se najprije dodala kolekciji, a onda ju je metoda


Remove obrisala:
m_colKnjige.Add "61-WEB KREATOR", "Web kreator", , 1
m_colKnjige.Remove 2
Umjesto broja smo mogli koristiti i Key:
m_colKnjige.Remove "Web kreator"
.RULWHQMHEURMHYDMHYUORQHSUDNWLQR]DWRWRVHWLEURMHYLPLMHQMDMX1DSULPMHU
prije nego smo kdirali metodu Remove, Item Excel je bio broj 3. Nakon
kdiranja metode Remove, Excel je broj 2.

Kontrola Array je podvrsta objekta tipa kolekcija


Vratimo se na trenutak strukturi array i upoznajmo se s njegovom pozadinom. U
QMHJRYRMSR]DGLQLVHRSHWNULMHREMHNWWLSDNROHNFLMH7RMHXJUDHQLREMHNWREMHNW
NRMHJNUHLUD9LVXDO%DVLFQDNRQSRNUHWDQMDSURJUDPDREMHNWNRMHJPRHPR
smatrati podvrstom tipa kolekcija.
1. Kreirajte novi projekt Standard kao na slici...
19

2. WDNRWRHWHNRSLUDWLNRQWUROX&KDFN &WUO&&WUO9<HV WULSXWDL


WDNRGRELWLDUUD\NRMLLPDHWUL,WHPD
3. Pokrenite program, pauzirajte i u prozor Immediate tipkajte ? Check1(0).
3RMDYLWHVHOLVWDODQRYD /LVW0HPEHUV WMOLVWDVYLKVYRMVWDYDLPHWRGD
koje ima objekt kontrola Check Box.

4. Sad tipkajte ovako: ? Check1.


3RMDYLWHVHOLVWDODQRYDNRMHLPDNRQWURODDUUD\&KHFN

1DOLVWLVXHWULPHWRGHREMHNWDNRQWUROHDUUD\0HWRGH&RXQWL,WHPVX
jednake metodama Count i Item u svakoj kolekciji.
5. Nastavimo tipkati: ? Check1.Count i Enter:
20

Metoda Count je izbacila ukupan broj Item-a u objekt kontroli array


Check1.
0RHPRSULPMHQLWLLSHWOMX)RU(DFK
6. U proceduru Click kontrole Command1 tipkajte ovaj kd:
Private Sub Command1_Click()
Dim chkObjekt As CheckBox
For Each chkObjekt In Check1
chkObjekt.Caption = chkObjekt.Index
Next
End Sub
7. Pokrenite projekt i odaberite gumb Command1:

'DNOHNRQWUROD$UUD\MHWDNRHUMHGQDYUVWDREMHNWDNROHNFLMHLWRXJUDHQRJ
objekta kolekcije array.
21

Lekcija 3
Objekt Global
1DVDPRPYUKXKLMHUDUKLMHXJUDHQLKVXVWDYQLKREMHNDWDX9LVXDO%DVLFXMHREMHNW
*OREDO6YRMVWYDWRJREMHNWDNDRLVYDNRJGUXJRJDPRHPRYLGMHWLXGLMDORJX
Object Browser.
1. Kreirajte novi projekt Standard.EXE.
2. View/Object Browser.

3. Tipkajte globalXSROMHWUDLWHOMDLSULWLVQLWH(QWHU

22

4. Svojstva i metode objekta Global su vidljivi u polju Members of 'Global'.


6YRMVWYDVXR]QDHQDLNRQRPDNHDPHWRGHLNRQRP]HOHQHNRFNH
Svojstva App, Clipboard, Forms itd. su objekti koji dalje imaju svoja
VYRMVWYDNRMDVXWDNRHUREMHNWLLWG7RMHKLMHUDUKLMDNRMDVHRJOHGDXGRW
QRWDFLML/LMHYRRG
GRW
 WRNH MHREMHNWDGHVQRMHVYRMVWYR
5. Pritisnite tipku mia na <All Libraries>...

LRWYRULWHVHOLVWDELEOLRWHNDNRMHLPDVYDNL9LVXDO%DVLF
to su to biblioteke ili 'libraries'?
Biblioteke su svi class moduli koje su micrososftovi programeri ugradili u
9LVXDO%DVLFLQDNRMLPDSRLYDMXVYLXJUDHQLREMHNWLRGQDMYLHJ*OREDO
GRQDMQLHJ
6YHRSFLMHSURJUDPD9LVXDO%DVLFLPDMXHWLULRVQRYQHELEOLRWHNHVWGROH
Vb, VBA i VBRUN.

23

8NRGLUDQMXQDHJSURMHNWD,YDPDUVXVUHVWHPRVHVPQRJLPXJUDHQLP
REMHNWLPDDSUDYLWHPRLVYRMHREMHNWH

24

Lekcija 4
Rad na projektu
Ivamar kolekcije
Ugradimo kolekcije umjesto array-a
Najprije izmijenimo izgled dokumenta cjenik.txt
1. Otvorite cjenik.txt.
2. Ta datoteka trenutno izgleda ovako:

3. .DNRELVHRYDGDWRWHNDODNHXLWDODXNROHNFLMXSRQRYQRMHSDOMLYR
tipkajte u ovakav oblik:

25

4. 3RKUDQLWHFMHQLNW[WSRPRXQDUHGEH)LOH6DYH
2YDNRQDSLVDQFMHQLNVDGULVYHREMHNWHX]DVHEQLPUHGFLPD-HGDQUHGDN
jedan objekt.
8LWDMPRFMHQLNW[WXREMHNWWLSDNROHNFLMH
1. Otvorite projekt Ivamar.
2. Promijenite kd u sekciji General Declaration ovako:
Option Explicit
Private m_intKom As Integer
Private m_lngBojaPozadine As Long
Private m_blnPrikazDatuma As Boolean
Private m_colCijenaFormata As New Collection
3. Gornji zasjenjeni redak je novonapisani redak. Taj je redak zamijenio
VOMHGHHUHWNHNRMHVWHREULVDOL
Private m_curCijenaCourseware() As Integer
Private m_curCijenaElearning() As Integer
Private m_curCijenaCdRom() As Integer
Private m_curCijenaPapir() As Integer
Private m_curCijenaSve() As Integer
26

4. 3ULWLVQLWHWLSNXPLDQD 'HFODUDWLRQV LXSDGDMXHPL]ERUQLNX

5. ...odaberite CitajCjenik.
6. Unesite promjene u kdu kao u dolje zasjenjenim redcima:
Public Sub CitajCjenik()
On Error GoTo JaSeMoguNositiSOvim
Dim strProvjera As String
Dim strKnjige As String
Dim strResurs As String
Dim curCijena As Currency
Open "C:\Ivamar\cjenik.txt" For Input As #1
Do While Not EOF(1)
Input #1, strKnjige, strResurs, curCijena
m_colCijenaFormata.Add Item:=curCijena,
_
Key:=strKnjige & strResurs
If strKnjige <> strProvjera Then
lstKnjige.AddItem strKnjige
strProvjera = strKnjige
End If
Loop
7. Sada promijenite kd u proceduri cmdIzracunaj_Click():
Private Sub cmdIzracunaj_Click()
'Deklariram varijable
Dim curIznos As Currency
Dim curCijenaCourseware As Currency
Dim curCijenaElearning As Currency
Dim curCijenaCdRom As Currency
27

Dim curCijenaPapir As Currency


Dim curCijenaSve As Currency
Dim intSubscript As Integer
'Da li je korisnik odabrao naslov knjige?
If lstKnjige.Text = "" Then
MsgBox "Morate odabrati naslov knjige"
Exit Sub
End If
'Da li je korisnik odabrao jedan ili vie formata
knjige?
If chkFormatKnjige(0).Value = 0 And _
chkFormatKnjige(1).Value = 0 And _
chkFormatKnjige(2).Value = 0 And _
chkFormatKnjige(3).Value = 0 Then
MsgBox "Morate odabrati jedan ili vie " & _
"formata knjige"
Exit Sub
End If
'Da li je korisnik odabrao kolicinu?
If optKom(1).Value = False And _
optKom(2).Value = False Then
MsgBox "Morate odabrati kolicinu"
Exit Sub
End If
'Kad korisnik odabere E-learning
'upozorimo ga da uvijek ide samo jedan
'bez obzira odabere li kupac jedan ili dva kompleta
'formata knjige
If chkFormatKnjige(1).Value = 1 And m_intKom > 1 Then
MsgBox "Kupovina je ogranicena na 1 e-learning po "
& _
28

"narudzbi." & vbCrLf & _


"Cijena je tome prilagodjena"
End If
'Sad imamo sve elemente za racunanje ukupnog iznosa
'Izracunajmo cijenu svakom formatu pojedine knjige
curCijenaCourseware =
m_colCijenaFormata(lstKnjige.Text & "Courseware") * _
chkFormatKnjige(0).Value
curCijenaElearning =
m_colCijenaFormata(lstKnjige.Text & "E-learning") * _
chkFormatKnjige(1).Value
curCijenaCdRom = m_colCijenaFormata(lstKnjige.Text
& "CD-ROM") * _
chkFormatKnjige(2).Value
curCijenaPapir = m_colCijenaFormata(lstKnjige.Text
& "Papir") * _
chkFormatKnjige(3).Value
curCijenaSve = m_colCijenaFormata(lstKnjige.Text &
"Komplet")
'Kad kupac odabere sve formate jednog naslova,
obavijestimo ga o popustu
If chkFormatKnjige(0).Value = 1 And _
chkFormatKnjige(2).Value = 1 And _
chkFormatKnjige(3).Value = 1 Then
MsgBox "Iznos ukljucuje popust za kupovinu
kompleta"
curIznos = (curCijenaSve * m_intKom) + _
29

curCijenaElearning
Else
'Zbrojimo cijene i pomnozimo s kolicinom
'i dobit cemo ukupan iznos narudzbe
curIznos = (((curCijenaCourseware +
curCijenaCdRom _
+ curCijenaPapir) * m_intKom) +
curCijenaElearning)
End If
'Ako je iznos veci od nula, prikazi cijenu i
'ucini label vidljivim
If curIznos > 0 Then
lblCijena.Caption = "Ukupan iznos je " & _
Format(curIznos, "###,###.00")
lblCijena.Visible = True
End If
End Sub
8. Pohranite Ivamar i provjerite kako radi. Radi kao to je i radio!
Analiza

6DGDHPRUHGRPDQDOL]LUDWLVYHSURPMHQHXN{GX3RHOLVPRRGVHNFLMH*HQHUDO
Declarations. Deklarirali smo objekt kolekciju:
Private m_colCijenaFormata As New Collection
2YDNROHNFLMDHSRKUDQLWLVYHFLMHQHIRUPDWDNQMLJD.ROHNFLMXVPRGHNODULUDOLX
VHNFLML*HQHUDO'HFODUDWLRQVMHUHPRMHGRKYDDWLVUD]QLKPMHVWDXDSOLNDFLML
Nakon deklaracije objekta kolekcije, promijenili smo kd subprocedure
&LWDM&MHQLN7DVHVXESURFHGXUDSR]LYDQDNRQXLWDYDQMDIRUPH2QDLWDFLMHQHL]
datoteke cjenik.txt, popunjava list box lstKnjige i cijene stavlja na raspolaganje
svim ostalim mjestima u aplikaciji Ivamar.
%XGXLGDMHVDGUDMGDWRWHNHFMHQLNW[WSUHREOLNRYDQVXESURFHGXULVPR
SURPLMHQLOLLQSXW XOD]QH QDUHGEH9LHQHPDWULUHWNDLHVWVWXSDFD]DXLWDYDQMH
nego 15 redaka i tri stupca. Svaki format knjige ima svoj redak. Svaki redak ima
definirano ime knjige u prvom stupcu slijeva, naziv formata u drugom stupcu i

30

FLMHQXXWUHHPVWXSFX=DWRQDN{GQDNRQRWYDUDQMDGDWRWHNHFMHQLNW[WWUHED
VDPRWULYDULMDEOHNRMLPDHVHSULGRGDYDWLYULMHGQRVWLWULMXVWXSDFD
Input #1, strKnjige, strResurs, curCijena
7RQHELIXQNFLRQLUDORGDQLVPRVWDYLOL]DUH]HL]PHXSROMDXGDWRWHFLFMHQLNW[W
6OMHGHLUHGDNXSHWOML'R:KLOH1RWL]YUDYD$GGPHWRGXNROHNFLMH
m_colCijenaFormata.Add Item:=curCijena,
_
Key:=strKnjige & strResurs
Ovdje smo koristili nazive argumenata i tako eksplicitno definirali argumente
kolekcije Item i Key. Argumentu Item smo dodijelili cijene, a argumentu Key smo
dodijelili "zbroj" (concatenate) stringova strKnjige & strResurs, tj. naslov knjige i
QD]LYIRUPDWD7DNRHPRSRPRXMHGLQVWYHQRJNOMXDXNROHNFLMLQDSULPMHU
"JavaScript Papir", u svakom trenutku saznati cijenu. Dokaz:
1. Pokrenite Ivamar.
2. Pauzirajte Ivamar.

3. Tipkajte u prozor Immediate ?m_colCijenaFormata ("HTMLCDROM")LSULWLVQLWH(QWHU3URJUDPHL]EDFLWLFLMHQX


Nastavljamo analizu naeg kda.
If strKnjige <> strProvjera Then
lstKnjige.AddItem strKnjige
strProvjera = strKnjige
End If
2YGMHMHNRULWHQN{G PRHPRUHLLDOJRULWDP NRMLXYLMHNPRHWHLVNRULVWLWLNDG
VHUDGLRSRQDYOMDQMXXOD]QLKYULMHGQRVWL8OLVWER[OVW.QMLJHWUHEDMXXLVDPR
jednom naslovi knjiga, a varijabla strKnjige donosi tri naslova, ali svaki naslov pet
puta.
If strKnjige <> strProvjera Then
8SUYRPSUROD]XHpraznaVWULQJYDULMDEODVWU3URYMHUDELWLUD]OLLWDRGVWULQJ
varijable strKnjige zato to je prazna. Kada string varijablu samo deklariramo, a
31

QHSULGRGDPRMRMLQHNXSRHWQXYULMHGQRVWRQGDMHRQDprazna po defaultu. Kada


je lokacija string varijable u memoriji prazna, program na to gleda kao na svaki
GUXJLVWULQJL]DWRSURJUDPQHHSDVWLUDGLJUHNH
%XGXLGDMHRGJRYRUQDUHGDN,ISR]LWLYDQVOLMHGLL]YUHQMHUHWND
lstKnjige.AddItem strKnjige
U ovom retku se kontrola list box lstKnjige puni s prvim naslovom iz varijable
strKnjige. Da bi algoritam radio, moramo napisati ovaj redak:
strProvjera = strKnjige
,]MHGQDLOLVPRVDGUDMHVWULQJYDULMDEOLVWU3URYMHUDLVWU.QMLJH(QG,IL]YRGL
SURJUDPGRUHWND/RRSDUHGDN/RRSYUDDSURJUDPQDSRHWDNSHWOMH9DULMDEOD
strKnjige dobiva drugi redak iz dokumenta cjenik.txt u kojem je ponovo isti
QDVORYNQMLJH=DWRVXVDGUDMLYDULMDEOLVWU.QMLJHLVWU3URYMHUDLVWRYMHWQLLSHWOMD
YUWLWUHLNUXJ8QDHPVXVOXDMXVDGUDMLLVWRYMHWQLLXWUHHPLHWYUWRPLSHWRP
krugu, i tek esti krug upisuje novi naslov u lstKnjige.
$OJRULWDPMHRGOLDQSRGMHGQLPXYMHWRPNQMLDUPRUDVORLWL VRUWLUDWL UHWNHX
dokumentu cjenik.txt po abecedi naslova!
A sada o promjenama u subproceduri cmdIzracunaj_Click.
curCijenaCourseware =
m_colCijenaFormata(lstKnjige.Text & "Courseware") * _
chkFormatKnjige(0).Value
Kao to smo testirali ranije u prozoru Immediate, ako pozovete kolekciju s
DUJXPHQWRP.H\RQDHL]EDFLWLDUJXPHQW,WHP
?m_colCijenaFormata("JavaScriptPapir")
40
Array nema Key, a kolekcija ima, i to je jedna od prednosti kolekcije nad arrayHP3RPRXMHGLQVWYHQRJNOMXD.H\L]NROHNFLMHXVYDNRPWUHQXWNXSURJUDP
PRHGRKYDWLWLHOMHQL,WHP8DUUD\XNRULVWLPRLQGH[QRWDGDSURJUDPXWUHED
YLHYUHPHQDGDGRKYDWLHOMHQLREMHNWMHUPRUDSURLNUR]DUUD\VWUXNWXUXNDRWR
mi listamo telefonski imenik kako bismo doli nekog prezimena. Kada kolekciji
SULVWXSLWHVMHGLQVWYHQLPNOMXHP.H\RQDEH]OLVWDQMDL]EDFLNRQNUHWQL,WHP
.DGDVPRYHDUUD\XVSRUHGLOLVWHOHIRQVNLPLPHQLNRPNROHNFLMXPRHPR
XVSRUHGLWLVGLJLWDOQLPWHOHIRQVNLPLPHQLNRPNDGDQDUDXQDOXXSLHWHWHOHIRQVNL
EURMDQDHNUDQXVHSRMDYLLPHYODVQLND0QRJREUHRGOLVWDQMDLPHQLND]DUQH"
Varijabli curCijenaCourseware treba dati cijenu knjiga u formatu Courseware.
Koliko kotaju JavaScriptCourseware, VisualBasicCourseware,
32

+70/&RXUVHZDUH"2YHVORHQLFHVXXSUDYRDUJXPHQWL.H\XNROHNFLML
PBFRO&LMHQD)RUPDWD,]MHGQDLPRYDULMDEOXFXU&LMHQD&RXUVHZDUHVNROHNFLMRP
PBFRO&LMHQD)RUPDWDLDUJXPHQWRP.H\X]DJUDGL%XGXLGDMH.H\VORHQLFDRG
QDVORYDNQMLJHLQD]LYDIRUPDWDSRVOXLOLVPRVHVYRMVWYRP7H[WOLVWER[D
OVW.QMLJH6YRMVWYR7H[WNRQWUROHOVW.QMLJHVDGULQDVORYHNQMLJDSDMHWRMHGDQ
pribrojnik u zbroju (lstKnjige.Text & "Courseware"), a drugi je pribrojnik naziv
formata Courseware. Naziv formata je string i ide pod navodnicima.
curCijenaCourseware =
m_colCijenaFormata(lstKnjige.Text & "Courseware") * _
chkFormatKnjige(0).Value
1DLVWLQDLQGROD]LPRGRFLMHQDRVWDOLK.QMLJD)RUPDWD
curCijenaElearning =
m_colCijenaFormata(lstKnjige.Text & "E-learning") * _
chkFormatKnjige(1).Value
curCijenaCdRom = m_colCijenaFormata(lstKnjige.Text
& "CD-ROM") * _
chkFormatKnjige(2).Value
curCijenaPapir = m_colCijenaFormata(lstKnjige.Text
& "Papir") * _
chkFormatKnjige(3).Value
curCijenaSve = m_colCijenaFormata(lstKnjige.Text &
"Komplet")
Ostatak kda u ovoj subproceduri nije promijenjen.
Izmjene kda u subproceduri cmdPonisti_Click()XYRHQMHP
objekt varijabli
3RPRXJXPEDFPG3RQLVWLSRQLWDYDPRRGDELUIRUPDWDLNROLLQH)RUPDWLVX
DUUD\NRQWUROD&KHFN%R[DNROLLQDMHDUUD\NRQWUROD2SWLRQ%XWWRQ
0DQLSXODFLMXVRYLPDUUD\LPDHPRSRMHGQRVWDYQLWLSRPRXREMHNWYDULMDEOL
3URJUDPHEUHUDGLWL
1. Otvorite projekt Ivamar.
2. 8VXESURFHGXULFPG3RQLVWLB&OLFN QDSUDYLWHVOMHGHHL]PMHQH
33

Private Sub cmdPonisti_Click()


Dim chkObjekt As CheckBox
Dim optObjekt As OptionButton
lstKnjige.ListIndex = -1
For Each chkObjekt In chkFormatKnjige
chkObjekt.Value = 0
Next
For Each optObjekt In optKom
optObjekt.Value = False
Next
chkOdabiremSveFormate.Value = 0
lblCijena.Visible = False
imgKnjige.Picture = LoadPicture()
End Sub
Analiza

Umjesto "listanja" kroz strukturu array-a, deklarirali smo dvije objekt varijable:
Dim chkObjekt As CheckBox
Dim optObjekt As OptionButton
3UYXREMHNWYDULMDEOXVPRGHNODULUDOLNDRWLS&KHFN%R[MHUHUHIHUHQFLUDWL
kontrole Check Box u array-u chkFormatKnjige.
'UXJXREMHNWYDULMDEOXVPRGHNODULUDOLNDRWLS2SWLRQ%XWWRQMHUHUHIHUHQFLUDWL
kontrole Option Button u array-u optKom.
3RPRXSHWOML)RU(DFK1H[W
For Each chkObjekt In chkFormatKnjige
chkObjekt.Value = 0
Next

34

For Each optObjekt In optKom


optObjekt.Value = False
Next
...smo obili sve kontrole u array-ima i njihova svojstva Value stavili na nula, tj.
False.

35

Lekcija 5 Ivamar
i objekt App
Rad na projektu Ivamar
6SULMHLPRSRNUHWDQMHGYDSURJUDPD,YDPDUH[H
1. Otvorite projekt Ivamar.
2. 1DSUDYLWHVOMHGHHSURPMHQHXN{GXSURFHGXUH)RUPB/RDG 
Private Sub Form_Load()
If App.PrevInstance = True Then
MsgBox "Aplikacija Ivamar je vec pokrenuta i
radi."
Unload Me
Exit Sub
End If
Call CitajRegistry
Call CitajCjenik
If m_blnPrikazDatuma Then
Call mnuDatumIVrijemeUkljuci_Click
Else
Call mnuDatumIVrijemeIskljuci_Click
End If
frmGlavniObrazac.BackColor = m_lngBojaPozadine
Open "C:\Ivamar\cjenik.txt" For Input As #1
End Sub
36

3. Pohranite Ivamar.
4. Ako vaa verzija Visual Basica ima naredbu File/Make Ivamar.exe,
odaberite tu naredbu i napravite programsku datoteku Ivamar.exe i
pohranite je u mapu C:\Ivamar.
5. Otvorite Windows Explorer i pokrenite program Ivamar s dva pritiska
tipke mia na datoteku C:\Ivamar\Ivamar.exe.
6. 3RQRYLWHNRUDNLGRELWHWHREDYLMHVW$SOLNDFLMD,YDPDUMHYH
pokrenuta i radi.
Ukoliko radite na Working Model Edition Visual Basic koji nema naredbu Make
H[HXYLMHNPRHWHRYRLVSUREDWLVPRMRPL]YUQRPGDWRWHNRP,YDPDUH[H
napravljenoj po knjizi Visual Basic 6, koju ste skinuli s Web-a.
,GRNMH]DWXL]YUQXGDWRWHNXLVYHSULSDGDMXHGDWRWHNH FMHQLNLGU ELORYDQR
GRVOMHGQRVHGUDWLORNDFLMH&?,YDPDUXVNRURHPRQDXLWLNRGLUDWLSUHPRWHQMH
takve obveze.
Analiza

8VWUXNWXUL,)7+(1SURYMHUDYDPRGDOLDSOLNDFLMDYHUDGL7RSURYMHUDYDPR
SRPRXVYRMVWYD3UHY,QVWDQFHNRMHLPDREMHNW$SS
If App.PrevInstance = True Then
$NRMHJRUQMDWYUGQMDLVWLQLWDWDGDHVHL]YULWLVOMHGHH
MsgBox "Aplikacija Ivamar je vec pokrenuta i
radi."
3RVODWHVHSRUXND$SOLNDFLMD,YDPDUMHYHSRNUHQXWDLUDGL6OLMHGLQDUHGED
RVOREDDQMDPHPRULMHRGJODYQHIRUPH
Unload Me
,VDGDVOLMHGLQHWRQHRELQRDOLMHWDNR,DNRMHQDUHHQRGDIRUPDQDSXVWL
memoriju, ukoliko u kdu koji slijedi nakon End If postoji naredba povezana s
QHNLPVYRMVWYRPIRUPHIRUPDHVHSRQRYRXLWDWL8QDHPVOXDMXSRVWRML
QDUHGED]DVYRMVWYR%DFN&RORULGRLHGRSRQRYQRJXLWDYDQMDIRUPH2QGD
slijedi ponovo provjera i zatvaranje forme, pa opet otvaranje i tako ukrug.
Da se to ne bi dogodilo, moramo pisati naredbu...
Exit Sub
NRMRPVSUHDYDPRVYDNRGDOMQMHL]YUDYDQMHN{GD7HNQDNRQWHQDUHGEHVOLMHGL
zatvaranje strukture If:
End If
37

Svojstvo Path objekta App


1. Otvorimo projekt Ivamar.
2. Promijenimo kd subprocedure CitajCjenik koja se nalazi u sekciji
General Declarations:
Public Sub CitajCjenik()
On Error GoTo JaSeMoguNositiSOvim
Dim strProvjera As String
Dim strKnjige As String
Dim strResurs As String
Dim curCijena As Currency
If App.Path = "\" Then
Open App.Path & "cjenik.txt" For Input As #1
Else
Open App.Path & "\cjenik.txt" For Input As #1
End If
Do While Not EOF(1)
3. Promijenimo kd subprocedure lstKnjige_Click:
Private Sub lstKnjige_Click()
If lstKnjige.ListIndex = -1 Then Exit Sub
If App.Path = "\" Then
imgKnjige.Picture = LoadPicture(App.Path &
lstKnjige.Text & ".jpg")
Else
imgKnjige.Picture = LoadPicture(App.Path & "\"
& lstKnjige.Text & ".jpg")
End If
End Sub
4. Pohranite projekt Ivamar.
5. Otvorite novu mapu bilo gdje na vaem disku. Dao sam joj ime Kartelo. U
tu mapu prenesite, ne kopirajte!, sve datoteke iz mape Ivamar. Otvorite
38

Ivamar iz te nove mape Kartelo i pokrenite program. Sve radi kao i prije.
Kada program zatvarate naredbom Program/Izlaz, zaporka je 1234.
6. Vratite datoteke tamo gdje su prije bile u C:\Ivamar.
Analiza

Dovoljno je objasniti kd u subproceduri Load:


If App.Path = "\" Then
Open App.Path & "cjenik.txt" For Input As #1
Else
Open App.Path & "\cjenik.txt" For Input As #1
End If
Kada je datoteka Ivamar bila u mapi Ivamar, njezin je put (App.path) bio
C:\Ivamar. Kada je u mapi Kartelo, njezin put (App.path) je \Kartelo. Kada bi na
SURMHNWVWDYLOLXNRULMHQGLUHNWRULM&?SXWELELR?6DPRXRYRP]DGQMHPVOXDMX
NRVDFUWDYHSRVWRML?LQHWUHEDMH]EUDMDWLVFMHQLNW[W8VYLPRVWDOLP
VOXDMHYLPDQHPDNRVHFUWHQDNUDMXSXWD $SSSDWK SDMHWUHEDGRGDWLLVSUHG
imena datoteke cjenik.txt ovako: "\cjenik.txt".

39

Lekcija 6 Ivamar
i Kolekcija
Printers
Objekt Global ima svojstva Printer i Printers. Svojstvo Printer jest objekt koji
SUHGVWDYOMDGHIDXOWSLVDDVYRMVWYR3ULQWHUVMHNROHNFLMDNRMDVDGULSRGDWNH
,WHP RVYLPSLVDLPDNRMLVXXJUDHQLQDUDXQDOX
$NRRWYRULWH9LHZ2EMHFW%URZVHUSDXSROMH]DWUDHQMHXSLHWHJOREDOL
SULWLVQHWH(QWHUXSROMX0HPEHUVRI
*OREDO
GRELWHWHVYDVYRMVWYDLPHWRGHNRMH
ima objekt Global. U popisu vidimo i svojstva Printer i Printers.

40

'RNVYRMVWYR3ULQWHUNRULVWLPRNDGDL]QDHDSOLNDFLMHHOLPRWLVNDWLQDGHIDXOW
SLVDNROHNFLMX3ULQWHUVNRULVWLPRNDGDHOLPRWLVNDWLQDQHNLGUXJLSLVDXNROLNR
ih ima vie.
Primjer 1. kolekcije Printers:
Private Sub Command1_Click()
Dim objPisac As Printer
For Each objPisac In Printers
Form1.Print objPisac.DeviceName
Next
41

End Sub
.DGDSRNUHQHPRRYDMSURMHNWLSULWLVQHPRJXPE&RPPDQGGRELWHPRLVSLV
VYLKSLVDDSULMDYOMHQLKQDHPUDXQDOX

Primjer 2. kolekcije Printers:


Private Sub Command1_Click()
Dim objPisac As Printer
Dim blnPisacUBoji As Boolean
For Each objPisac In Printers
If objPisac.DeviceName = "HP DeskJet 670C" Then
Set Printer = objPisac
blnPisacUBoji = True
Exit For
End If
Next
If blnPisacUBoji = False Then
MsgBox "Oprostite, pisac u boji nije instaliran."
End If
End Sub
Analiza
42

Deklarirali smo Boolean varijablu:


Dim blnPisacUBoji As Boolean
7XHPRYDULMDEOXVWDYLWLQD7UXHDNRSURQDHPRWUDHQLWLSSLVDD6OLMHGLSHWOMD
)RULXSHWOMLVWUXNWXUD,I2EMHNWYDULMDEODREM3LVDFLLHRGSLVDDGRSLVDDX
NROHNFLML3ULQWHUVDDNRQHSURQDHWUDHQLWLSSLVDDVOLMHGLSRUXND2SURVWLWH
SLVDXERMLQLMHLQVWDOLUDQ
8NROLNRSURQDHWUDHQLSLVDQHWUDLGDOMHMHUVPRNRGLUDOLQDUHGEX
Exit For
... prije naredbi..
End If
Next

43

Lekcija 7 Ivamar
i osobna
svojstva forme
Kreiranje novog svojstva forme u projektu Ivamar
1. Otvorite Ivamar.
2. Unesite promjene u sekciji General Declarations, kao to je zasjenjeno u
VOMHGHHPN{GX
Option Explicit
Public Kom As Integer
Private m_lngBojaPozadine As Long
Private m_blnPrikazDatuma As Boolean
Private m_colCijenaFormata As New Collection
3. =DWLPQDSUDYLWHVOMHGHHSURPMHQHXVXESURFHGXULRSW.RPB&OLFN
Private Sub optKom_Click(Index As Integer)
frmGlavniObrazac.Kom = Index
End Sub
4. Napravite promjene kao to su ove u zasjenjenim redcima u subproceduri
cmdIzracunaj_Click:
'Kad korisnik odabere E-learning
'upozorimo ga da uvijek ide samo jedan
'bez obzira odabere li kupac jedan ili dva kompleta
'formata knjige
44

If chkFormatKnjige(1).Value = 1 And
frmGlavniObrazac.Kom > 1 Then
MsgBox "Kupovina je ogranicena na 1 e-learning po "
& _
"narudzbi." & vbCrLf & _
"Cijena je tome prilagodjena"
End If
...
...
'Kad kupac odabere sve formate jednog naslova,
obavijestimo ga o popustu
If chkFormatKnjige(0).Value = 1 And _
chkFormatKnjige(2).Value = 1 And _
chkFormatKnjige(3).Value = 1 Then
MsgBox "Iznos ukljucuje popust za kupovinu
kompleta"
curIznos = (curCijenaSve *
frmGlavniObrazac.Kom) + _
curCijenaElearning
Else
'Zbrojimo cijene i pomnozimo s kolicinom
'i dobit cemo ukupan iznos narudzbe
curIznos = (((curCijenaCourseware +
curCijenaCdRom _
+ curCijenaPapir) * frmGlavniObrazac.Kom) +
curCijenaElearning)
End If
...
...
5. Pohranite promjene.
6. Pokrenite program.
7. ,]DLWHL]SURJUDPDSRPRXQDUHGEH3URJUDP,]OD]]DSRUND
45

Analiza

Ovdje smo integer varijablu m_intKom zamijenili svojstvom forme Kom. Novo
VYRMVWYRSRQDRMHOMLGRGDMHVHIRUPLXVHNFLML*HQHUDO'HFODUDWLRQRYDNYRP
deklaracijom:
Public Kom As Integer
.OMXQDULMHNRMDGHILQLUD.RPNDRVYRMVWYRIRUPHMHVW
3XEOLF
1DNRQRYH
GHNODUDFLMHVYDNLSXWNDGDEXGHPRWLSNDOLIUP*ODYQL2EUD]DFLSULWLVQXOLWRNX
GRWQRWDFLMD SRMDYLWHVHSDGDMXLL]ERUQLNVSRSLVRPVYLKVYRMVWDYDPHWRGDL
GRJDDMDREMHNWDIUP*ODYQL2EUD]DF8WRPSRSLVXHRGVDGDELWLLVYRMVWYR.RP
7HUPLQRORJLMD9LVXDO%DVLFDVYHWRMHXSRSLVXQD]LYDMRL
PHPEHUV
 ODQRYL 
6YDNLREMHNWLPDVYRMHODQRYH7NRVXWLODQRYL"7RVXVYRMVWYDPHWRGHL
GRJDDML
Sva druga mjesta u kdu projekta, na kojima se pojavljivala varijabla m_intKom,
PRUDPRSURQDLLWXYDULMDEOX]DPLMHQLWLVD.RPVYRMVWYRPIRUPH
Najzanimljiviji je ovaj kd:
frmGlavniObrazac.Kom = Index
6YRMVWYR.RPIRUPHVPRL]MHGQDLOLVWXLPVYRMVWYRP,QGH[7RVPRLSULMH
XLQLOLVYDULMDEORP6YRMVWYR.RPLYDULMDEODPBLQW.RP]DX]LPDMXMHGQDNR
mjesta u memoriji. I Kom i m_intKom su SRND]LYDLQDWXHVYRMVWYR,QGH[LVWRJ
VXWLSD LQWHJHU L]DX]LPDMXNDRLVYLSRND]LYDLWHNEDMWDLOLELWDPHPRULMH
3URJUDPQHHUDGLWLEUHQLVPRXWHGLMHOLQDUHVXUVLPDQLWLXNROLLQLN{GD
8HPXMHRQGDSUHGQRVWsvojstva koje uvijek pripada nekom objektu, u ovom
VOXDMXIRUPLXRGQRVXQDvarijablu koja nikom ne pripada, osim to ima svoje
SRGUXMHGMHORYDQMD"
Programeru je olakan posao jer se lake snalazi za vrijeme izrade programa, za
YULMHPHL]PMHQDQDSURJUDPXL]DYULMHPHGXJRJRGLQMHJRGUDYDQMDL
XQDSUHLYDQMDSURJUDPD1RYLHSURJUDPHUWUHEDWLPQRJRPDQMHYUHPHQD]D
upoznavanje programa.
Zato?
1HREMHNWQRSURJUDPLUDQMHSRVWDYOMDXVUHGLWH]DGDWDN3URJUDPHUSLWDQDUXLWHOMD
.RMHSRVORYHHYDSURJUDPUDGLWL",RQGDVH]DGDFLQLXKLMHUDUKLMVNL2G
JODYQRJLQDMRSHQLWLMHJ]DGDWNDSUHPDQDMVLWQLMLP&LMHOLSURJUDPMHKLMHUDUKLMD
zadataka, ali kada imate milijun zadataka u jednom programu, onda je to anarhija
XNRMRMVHLDXWRUQDNRQQHNRJYUHPHQDWHNRVQDOD]L=DWDNYHSURJUDPHPRHPR
UHLGDVX]DGDQRFHQWULUDQL
46

$XWRUSURJUDPDLYLXREMHNWQRPVYLMHWX2EMHNWLVXXVUHGLWX=DGDFLVXWHN
SRVORYLNRMLSULSDGDMXREMHNWX2EMHNWLPRJXLYMHWLVDPRVWDOQREH]]DGDWDNDDOL
]DGDFLQHSRVWRMHEH]REMHNWD6YLMHWXNRMHPLYLPRMHREMHNWQRFHQWULUDQ
Vratimo se naem primjeru.
FormaMHREMHNWNRMHJPRHPRXVSRUHGLWLVYODVQLNRPSRVORYQRJSURVWRUD
.RQNUHWQRXQDHPVOXDMXVYODVQLNRPWUJRYLQH8WUJRYLQLVHQDOD]HREMHNWLD
na formi se nalaze objekti kontrole. U trgovinu ulaze kupci i obavjetavaju
YODVQLNDRNROLLQLNRMXHOHNXSLWL8WRPWUHQXWNXWDNROLLQDVWRMLJGMHMHVW,]
XVWDNXSFDL]OD]HULMHLQDSULPMHUGYDLXOD]HXXKRSDXPR]DNYODVQLND7R
QDWRVHRGQRVLGYDMRMHXYLMHNQHSRPLQRXVNODGLWX.XSDFMHPRJDR
SRGLJQXWLGYDSUVWDLYODVQLNELSUHNRRLMXLVYRJPR]JDLPDRLQIRUPDFLMXGYD
9ODVQLNXMH]DWRWRLPDRVRELQXVOXKD9ODVQLNYLGL]DWRWRLPDRVRELQXYLGD
U programerskom svijetu osobine sluha i vida zvali bi SRND]LYDLPD A mogli su
ih isto tako zvati i osjetilimaWRYLHNDGDVDPUDGLRQDRGUDYDQMXLQGXVWULMVNLK
SRVWURMHQMDSRND]LYDHVPR]YDOLVHQ]RULPDWRXSULMHYRGXL]QDLRVMHWLOLPD
%LOLVXWRVWUXMQLSUHNLGDL DVWUXMDMHPRJODELWL]UDQDHOHNWULQDKLGUDXOLQD
svjetlosna itd.) koji bi na dodir pokretnog dijela stroja promijenili svoje stanje, pa
ELVWUXMDSUHVWDODLOLSRHODWHL7DMHSURPMHQDVWDQMDVWUXMHELODSRND]LYD
VOMHGHHPXUHDMXLWG
Vlasnika i trgovinu zvali bismo objektom forma. Kupac bi igrao ulogu kontrole
2SWLRQ%XWWRQ)RUPLVPRXJUDGLOLVYRMVWYRRVRELQX.RPSRPRXNRMHH
"vidjeti" stanje kontroliranog svojstva Index.
Svojstvo Index je uvijek na istom mjestu u memoriji. To je svojstvo "zapakirano"
XREMHNWNRMHPXSULSDGDLQHRGYDMDVHRGVYRJREMHNWDQLWLVHNRSLUD XPQRDYD
QDGUXJDPMHVWD2QRQHHWDHWDMXVDPRSRJOHGLLOLSRND]LYDL SRLQWHUL NRML
ne troe toliko memoriju. Objekt kontrola Option Button ima svojstvo Index i
doputa svim drugim objektima da "vide" to njegovo svojstvo Index.
$NRWLGUXJLREMHNWLQHPDMXRVMHWLOR SRND]LYD ]DYLGMHWL,QGH[WRQLMHQMLKRY
SUREOHP$NRLPWRRVMHWLORWUHEDXJUDGLWHLPJDSURJUDPHU
A kada programer ugradi osjetilo objektu, to je osjetilo zauzelo 8 bajta (32 bita)
PHPRULMHQDQHNRMPHPRULMVNRMDGUHVLLQLWDQHRVMHD8JUDGQMDMHREDYOMHQD
SRSUDYLOXDRYGMHRQRJODVLIRUPLHWHGRGDWLRVRELQX SURSHUWLHV WDNRWRHWH
u sekciju General Declaration napisati kd: Public razmaknica ime osobine
razmaknica As razmaknica tip osobine.
Public Kom As Integer
.DGDVPRYHWROLNRQD]LYDGDOLRVRELQLGDMPRMRMLQD]LYSULMDPQLN6DGDMH
SRWUHEQRSRYXLLFXGRRGDLOMDD.DNRWRLQLPR"WRHOLPRSULPLWLRYLP
47

SULMDPQLNRP"HOLPRSULPLWLVLJQDORGVYRMVWYD,QGH[LMHMHVYRMVWYR,QGH["2G
kontrole Option Button. Kontrola Option Button ima vie i sve se nalaze u array-u
optKom.
3URJUDPHURGOD]LGRDUUD\DRSW.RPLVSDMDVHSRPRXN{GDXRQRP
zasjenjenom retku:
Private Sub optKom_Click(Index As Integer)
frmGlavniObrazac.Kom = Index
End Sub
Evo nas ponovo kod najzanimljivijeg dijela kda:
frmGlavniObrazac.Kom = Index
frmGlavniObrazac.KomMHVYRMVWYR.RP=DKYDOMXMXL'RWQRWDFLMLVYHVH
]QDLQLWNRYLHXFLMHORMDSOLNDFLMLQHPDWDNYRLPH0RHVH]YDWL.RPDOLFLMHOL
MHQD]LYVSULSDGDMXLPREMHNWRPMHGLQVWYHQ2EMHNWIRUPDLMHMHLPH
frmGlavniObrazac ima svojstvo Kom. Sintaksa je: ime objektaWRND NRMDVH
ovdje naziva Dot) ime svojstva.
WRVHGRJDDQDNRQJRUQMHJN{GDXNRMHPXVXGYDVYRMVWYDSRYH]DQD]QDNRP
jednakosti? Svako svojstvo, Kom i svojstvo Index, imaju svoje mjesto u memoriji.
1DWLPPMHVWLPDSRVWRMHQHNLVDGUDMLQHNHYULMHGQRVWL 9DOXH 6YDNRVYRMVWYRVH
GULVYRJYODVQLND REMHNWD LQLNDGJDQHQDSXWD'DOLVDGDNDGDVXVSRMHQD
(znakom jednakosti) mjesta (adrese) u memoriji, vrijedi "zakon spojenih posuda"?
Ako je epruveta na adresi Index bila nalivena do razine 100, a epruveta na adresi
.RPGRUD]LQHKRHOLVHQDNRQRYHMHGQDGEHUD]LQHL]MHGQDLWLSDHL.RP
GRELWLUD]LQX"1HH$NRDGUHVD,QGH[VDGULYULMHGQRVWGDOLHVDGDL
DGUHVD.RPVDGUDYDWLYULMHGQRVW1HH
$GUHVHXPHPRULMLLPDMXVYDNDVYRMHVDGUDMHLGDOMH6DGUDMDGUHVH,QGH[VHQH
NRSLUDQLWLSUHPMHWDXDGUHVX.RP.RPMHRNRSRPRXNRMHJDIRUPDYLGL
VDGUDM,QGH[D=DUWRQLMHGRYROMQR".DGDPLQHWRYLGLPRRQGDVHWRQLMHIL]LNL
SUHPMHVWLORXQDXJODYX8QDRMJODYLMHVOLNDWRJDWRYLGLPR,GRNPLPRHPR
vidjeti cijeli grad ako smo dovoljno visoko, slika toga grada u naem mozgu
]DX]LPDWHNMHGQXPROHNXOXDPRGDQLWLMHGQXDNRXWRPWUHQXWNXPLVOLPRQD
QHWRGUXJRSDVOLNHJUDGDQLVPRQLWLVYMHVQL.RQWDNWSRVWRMLLDNRHOLPR
PRHPRVYRMHPLVOLXVPMHULWLQDVOLNXJUDGD
$RQGDQDLXREODFLLJUDGVHQHYLGL6DPRVHXMHEXNDJUDGD7RELVWDQMH
]QDLORGDREMHNWJUDGQHPDVYRMVWYRVOLNDQHJRVDPRVYRMVWYREXND8]DOXG
MHWRPLLPDPRVYRMVWYRRLNDGDJUDGQHPDVYRMVWYRVOLND8QDHPHVH
programu to dogoditi ako obriemo redak...
48

frmGlavniObrazac.Kom = Index
WRPLQDUDYQRQHHPRXLQLWL
Idemo dalje!
Obavijest o stanju na gore spomenutoj adresi Index potrebna je jo nekim
objektima i mjestima na formi. U stvari, forma je vlasnik ili rukovoditelj kojem
osobno i ne treba taj podatak o stanju svojstva Index.
7DMSRGDWDNWUHEDGMHODWQLNXNRMLVMHGL]DEODJDMQRPLNRMLHL]UDXQDWLXNXSQX
cijenu, te dati popust i sl.
Na naoj formi je uloga blagajnika pripala kontroli cmdIzracunaj.
Tko govori kontroli cmdIzracunaj kakvo je stanje na memorijskoj adresi Index?
'DOLGLUHNWQRNRQWUROD2SWLRQ%XWWRQLMHMH,QGH[VYRMVWYR"1H2EMHNWL
cmdIzracunaj i Option Button ne komuniciraju izravno, nego preko svog
QDGUHHQRJUXNRYRGLWHOMDIRUPHIUP*ODYQL2EUD]DF
Na svim mjestima u proceduri cmdIzracunaj (konkretno na tri mjesta), gdje je
SRWUHEDQSRGDWDNWRQRJEURMDVDGUHVH,QGH[SURJUDPHUMHXJUDGLR SULMDPQLN
VOLNHVHQ]RURVMHWLOR SRND]LYD SRLQWHU frmGlavniObrazac.Kom , a nije
GRYHRLOLNRSLUDRIL]LNLWDMWRQLEURMQDVYDWDPMHVWD
(YHVOLNRYLWRJSULND]DJRUQMHJREMDQMHQMDXORJHSRND]LYDD SRLQWHUD XREMHNWQR
orijentiranom programiranju:

49

Index-e u kontrolama Option Button motri kamera 24 sata na dan. Kamera alje
sliku anteni koja je postavljena na vrhu forme. Antena je primopredajna i alje
VOLNXIRUPLDOLLVYLPRVWDOLPREMHNWLPDQDIRUPL%XGXLGDMHVOLNDSRWUHEQD
samo kontroli Izracunaj, i to na tri mjesta, to su tamo stavljena tri TV prijamnika!
,]JRUQMHMHSULHQDSURVWRQHYMHURMDWQRNROLNRMHREMHNWQRRULMHQWLUDQR
SURJUDPLUDQMHLVWRYMHWQRUHDOQRPVYLMHWXXNRMHPLYLPRWRVHWLHGLMHODSULHR
SRND]LYDLPDRVMHWLOLPDWDMHSULDYULMHGLODLNRGXSRUDEHYDULMDEOLXQH
REMHNWQRPSURJUDPLUDQMX9DULMDEOHLVYRMVWYDLSRND]LYDLVXMHGQRWHLVWRV
JOHGLWDXSUDYOMDQMDUHVXUVLPDUDXQDOD,MHGQLLGUXJLVOXHGDVHPHPRULMDQH
RSWHUHWLSRQRYOMHQLPVDGUDMLPD
1HSUHPMHWDMXVHVDGUDMLQHJRLQIRUPDFLMHRVDGUDMLPD2GYLMDVH
NRPXQLNDFLMD2EMHNWLPHXVREQRNRPXQLFLUDMXEDNDRXUHDOQRPVYLMHWX
.RPXQLFLUDMXNDRLOMXGLSRPRXRVMHWLODWMVYRMVWDYD
3URJUDPPRHPRXVSRUHGLWLLVILUPRPXNRMRMSRVWRMLRUJDQL]DFLMD
komuniciranja. Ne svatko sa svakim "bez veze", nego po nekoj profesionalnoj
KLMHUDUKLMVNRMVWUXNWXUL7DNRLQDIRUPL NRMHOLVOLQRVWLULMHLfirma i forma!) ne
NRPXQLFLUDVYDWNRVDVYDNLPEH]YH]HQHJRWDNRHUSRQHNRMKLMHUDUKLMVNRM
strukturi.
50

8RVWDORPNRPXQLNDFLMVNLJOHGDQRWORFUWJUDGRYDL]JOHGDNDRVDH8VUHGLQL
VYDNHVWDQLFHVDDMHDQWHQD6YLPRELWHOLSULPDMXVLJQDORGRQHDQWHQHQDLMRMVH
VWDQLFLVDDQDOD]H9ODVQLFLPRELWHODVXREMHNWLNRMLLPDMXVYRMVWYR
PRELWHO
D
VDHMHforma koja ima svojstvo 'antena'.
3RVWRMLLNRPXQLNDFLMDSUHNRUDGLRSULPRSUHGDMQLNDJGMHQHPDVDDL]DMHGQLNLK
DQWHQDDOLMHWRSUHYODGDQDLGDOHNRVNXSOMDYDULMDQWDNRPXQLFLUDQMD1DMNUDH
UHHQRXWHGDQDUHVXUVLPDLUDXQDODLSURJUDPHUDLNRULVQLNDMHVWUD]ORJ]DWRLX
QDHPSURJUDPXLPDPR]DMHGQLNHDQWHQHDQLVPRGRYHOLXL]UDYQXYH]X
optKom s cmdIzracunaj.
-RQHWRPRUDPRUDVSUDYLWLRNRRYHMHGQDGEHQHWRLVSUDYLWLLGRGDWLJRUQMHP
objanjenju.
frmGlavniObrazac.Kom = Index
S lijeve i s desne strane jednakosti su svojstva koja pripadaju svako svom objektu.
3UHWSRVWDYLPRDOL]DWRSUHWSRVWDYOMDWLNDGDPRHPRHNVSHULPHQWLUDWL3RNUHQXR
VDP,YDPDURGDEUDR2SWLRQ%XWWRQLXNOMXLRSDX]X8SUR]RUX,PPHGLDWHVDP
tipkao...
?frmGlavniObrazac.Kom
...pa pritisnuo enter i dobio rezultat...
2
3RQRYRVDPSRNUHQXRSURJUDPRGDEUDR2SWLRQ%XWRQLXNOMXLRSDX]X1DNRQ
istog upita u prozoru Immediate sam dobio rezultat 1.
Rezultati su u redu i sukladni su gornjem objanjenju kda:
frmGlavniObrazac.Kom = Index
$OLWRHVHGRJRGLWLDNRVDGDXRYRPWUHQXWNXQDNRQWRMHSURJUDPL]YULR
JRUQMXMHGQDGEXL]QHNRJUD]ORJDGRHGREULVDQMDJRUQMHMHGQDGEH"3DMD
PRJXREULVDWLWXMHGQDGEXVDGDLWRVDPXLQLR3RNUHQXRVDPSURJUDPSRQRYR
i bez diranja ga ponovo pauzirao.
8SLVDRVDPSRQRYRLVWLXSLWLGRELRWUHLUH]XOWDWNDRLRQDMSUHWKRGQLWRMHX
UHGXEXGXLGDQLVDPQLWDPLMHQMDRMHUQLVDPVPLREXGXLGDELSURJUDPUDGL
obrisanog retka stao.

51

Ako ovaj kd...


frmGlavniObrazac.Kom = Index
]QDLYH]XRLPDRQGDVYRMVWYR.RPQHELVPMHORLGDOMHYLGMHWLEURM
nakon to sam obrisao gornji kd.
0HXWLPORJLNDJRYRULLVOMHGHH6YDVYRMVWYDSDWDNRLIRUPLQRVYRMVWYR.RP
PRJXVHPLMHQMDWL2YDMHGQDGED
frmGlavniObrazac.Kom = Index
MHSURPLMHQLODVYRMVWYR.RP1DNRQWRSURJUDPL]YULRYXMHGQDGEXVYRMVWYR
.RPMHSURPLMHQMHQRLLPDRQXYULMHGQRVWNRMXPXMHGDODJRUQMDMHGQDGED
YULMHGQRVWVYRMVWYD,QGH[%XGXLGDMHIRUPDREMHNWLLPDVYRMVWYR.RPDWR
]QDLGDGUXJLREMHNWLXSURJUDPXPRJXYLGMHWLWRVYRMVWYR.RPWRELRQL
VDGDPRUDOLYLGMHWL"0RUDOLELYLGMHWLVYRMVWYR.RPNDNYLPJDMHXLQLODJRUQMD
MHGQDGEDEH]RE]LUDWRMHREULVDQD-HGQDGEDMHRGUDHQDLSRVOMHGLFHVH
moraju vidjeti na svojstvu Kom. I vide se. Zato je rezultat 1 i nakon brisanja
MHGQDGEH
=QDLOLWRRQGDGDVDPELRXNULYXNDGDVDPUHNDRGDVHYULMHGQRVWVYRMVWYD,QGH[
ne kopira u svojstvo Kom? Ovdje sve ukazuje upravo na to kako se dogodio
proces kopiranja vrijednosti iz Indexa u Kom.
$VDGDRSHWXNOMXLPRORJLNX$NRVHGRJRGLORNRSLUDQMHWR]QDLGDMHPHPRULMD
GYRVWUXNRRSWHUHHQDVMHGQRPWHLVWRPYULMHGQRXEXGXLGDVDGDLVWD
vrijednost postoji na dvije adrese u memoriji: adresi Index i adresi Kom. Logika
QDPGDOMHJRYRULNDGDELSURJUDPLWDNRUDGLOLGDEL]DDVPHPRULMDELODSXQD
kopiranih podataka, i od rada ne bi bilo nita.
=DNOMXXMHPRGDNOHNRSLUDQMHVHQLMHGRJRGLORLQDPHPRULVMNRMDGUHVLVYRMVWYD
Kom nema broja 1! to je onda onaj 1 u prozoru Immediate? Sjetimo se, cijelo
YULMHPHVSRPLQMHPRSRND]LYDH SRLQWHUH 9DULMDEOHVXELOHSRND]LYDLVDGDVX
WRVYRMVWYD$NRMH.RPSRND]LYDRQGDMHL,QGH[SRND]LYDNRMLWDNRHU
zauzima samo 4 bajta memorije ili 32 bita. I Index i Kom pokazuju na isto, neko
WUHHPMHVWRXPHPRULMLQDNRMHMHGRVSLREURMLXNRMHPHRVWDWLGRVOMHGHHJ
odabira ili gaenja programa.
52

Na slici dolje su prikazana dva objekta i kakvo je pravo stanje memorijskih


adresa.

6YRMVWYDVXSRND]LYDLLLPDMXVYRMHPMHVWRXPHPRULMLDVWYDUQHYULMHGQRVWL
svojstava imaju neko drugo mjesto u memoriji.
Ovo me sada podsjetilo na SUHDFHX:LQGRZVJUDILNRPRNUXHQMX'RNXPHQW
VHQDOD]LQHJGMHQDGLVNXDOLVHLQMHJRYSUHDFQDOD]LQHJGMHQDGLVNX3UHDFMH
VDPRSXWRND]NRMLSRND]XMHSUHPDGRNXPHQWX3UHDFMHGRNXPHQWXNRMHPMH
VDPR]DSLVDQSXWGRL]YRUQRJGRNXPHQWD%H]RE]LUDNROLNR
WHDN
ELRRULJLQDOQL
GRNXPHQWSUHDFMHXYLMHNMHGQDNR
WHDN
$NRXVYRMRMVWUXNWXULPDSDHOLPRQD
YLHPMHVWDLPDWLQHNLGRNXPHQW]DUQLMHEROMHNRSLUDWLSUHDFHLUD]PMHVWLWLLKQD
vie mjesta umjesto tekog dokumenta. Osim utede na prostoru, utedjeli smo i
53

QDEROMRMRUJDQL]DFLML.DGDELVPRLPDOLYLHNRSLMDRULJLQDODNDNRHPR]QDWL
koji je original?
6YRMVWYR.RPMHQDMSULMHSRND]LYDORQDIL]LNXDGUHVXVYRMVWYD.RP1DNRQWRMH
SURJUDPL]YULRMHGQDGEX
frmGlavniObrazac.Kom = Index
VYRMVWYR.RPSRND]XMHQDIL]LNXORNDFLMXVYRMVWYD,QGH[
7RMHSUDYDSULDNRMDVHGRJDDL]DSR]RUQLFHL]DRYRJMHGQRJUHWNDN{GD
frmGlavniObrazac.Kom = Index
,PDMRQHWR1DJRUQMRMVOLFLVDPSUHNULLR6YRMVWYR.RP1DNRQGHNODULUDQMD
VYRMVWYD.RPX*HQHUDO'HFODUDWLRQVVWYRUHQMHSRND]LYDQDVYRMVWYR.RP7DM
SRND]LYDSRND]XMHQDQLWDVYHGRNQHQDSLHPRN{G
IUP*ODYQL2EUD]DF.RP QHNRMSRHWQRMYULMHGQRVWL
0LWRQLVPRQDSLVDOLRGPDKSDVHQLWLQH]DX]LPDIL]LNLGUXJDDGUHVDX
PHPRULML0LVPRWXMHGQDGEXQDSLVDOLWHNXDUUD\X
frmGlavniObrazac.Kom = Index
Tek kada korisnik aplikacije odabere neki od Option Button u array-u, program
L]YUDYDJRUQMXMHGQDGEX1LWDGDVHQH]DX]LPDSRVHEQDQRYDDGUHVD]DIL]LNL
VPMHWDMYULMHGQRVWL.RP1HPDSRWUHEHMHUJRUQMDMHGQDGEDXVPMHUDYD
SRND]LYD.RPSUHPDVYRMVWYX,QGH[8QDHPSULPMHUXSRVHEQLSURVWRU]D
VYRMVWYR.RPVHQLNDGLQHVWYDUDMHUFLMHORYULMHPHUDGDDSOLNDFLMHSRND]LYD
svojstvo Kom pokazuje na Index.
=DKYDOMXMXLSRND]LYDLPDLWHNDNRVHWHGLQDPHPRULMLLRPRJXDYDEULUDG
aplikacije. Jasno, da bi se utedjelo, programer mora znati to se deava iza
SR]RUQLFH7DGDSURJUDPHUQHHSLVDWLN{GNRMLH]DX]LPDWLQRYHDGUHVHX
PHPRULMLNDRUH]HUYDFLMX]DQHNDEXGXDGRJDDQMD0QRJDGRJDDQMDVHLQH
moraju dogoditi, pa zato onda unaprijed zauzimati prostore. Treba pisati
WHGOMLYLN{GNRMLH]DX]LPDWLQRYHDGUHVHWHNXWUHQXWNXNDGDVHGRJDDML
dogode.
3ULPMHUWHGOMLYRJN{GD1DNRQGHNODUDFLMHVYRMVWYDLOLYDULMDEOHPRHPRXYLMHN
GHILQLUDWLLSRHWQHYULMHGQRVWLWHRVRELQHLOLYDULMDEOH8MHGQRPUHWNXGHNODULUDPR
RVRELQXLOLYDULMDEOXLWDMUHGDNNDRVYDNLSRND]LYD]DX]HRMHXPHPRULMLSURVWRU
od 4 bajta. Nije se automatski zauzela (rezervirala) i neka adresa za stvarnu
YULMHGQRVWNRMDHPRGDGRLWLMHNRPUDGDSURJUDPD3RVWRMLVDPRSRND]LYD
VYRMVWYDQDVYRMVWYRNRMHJXPHPRULMLMRQHPD3RND]LYDNRMLQRVLLPH
"svojstvo Kom" i koji nikad i ne mora dobiti svoje originalno svojstvo s
54

RULJLQDOQRPPHPRULMVNRPDGUHVRPLRULJLQDOQRPVWYDUQRPIL]LNRPYULMHGQRX
L]UDHQRPXPMHUQRMMHGLQLFLbajtima.
2QGDXVOMHGHHPUHWNX]DGDPRSRHWQXYULMHGQRVWWHRVRELQHLOLYDULMDEOH7HNMH
taj redak zauzeo drugu adresu na koju je smjestio onu vrijednost s desne strane
MHGQDGEHWMSRHWQXYULMHGQRVW=DNOMXDNQHGDYDMPRSRHWQHYULMHGQRVWLDNR
WRQLMHSRWUHEQR'DYDMPRLKWREOLHGRJDDMXNRMHPVXSRWUHEQHDNDGDJRGMH
PRJXHSUHSXVWLPRWR]DX]HHGUXJHDGUHVHVDPRPGRJDDMX1DNRQWRVH
GRJDDMGRJRGLRGUXJDDGUHVDMH]DX]HWD-DVQRLYRWQLFLNOXVWHGUXJHDGUHVH
WDNRHUWUHEDELWLGXJRQROLNRNROLNRMHSRWUHEQR$NRQHWUHED]DQHNHEXGXH
UDGQMHSURJUDPDSURJUDPHUPRUDQDSLVDWLN{GNRMLHREULVDWLVDGUDMLRVORERGLWL
memorijsku adresu.

55

Lekcija 8 Ivamar
i nova forma
1. Otvorite Ivamar.
2. Odaberite Project/Add Form.
3. 3ULWLVQLWHWLSNXPLDGYDSXWDQD)RUP8VXHOMX9LVXDO%DVLFD QD]LYDVH
IDE) se otvorila forma Form1.
4. U prozoru Properties promijenite svojstvo Name u frmTezinaKnjige.
5. 2GDEHULWH6DYHX)LOHQDPHREULLWH
IUP
1HNDGDWRWHQRLPHIRUPHEXGH
TezinaKnjige. Pohranite formu u C:\Ivamar. Save.
Dodavanje kontrola formi
1. Nastavljamo raditi na projektu Ivamar.
2. U prozoru Project Explorer pritisnite tipku mia dva puta na formu
TezinaKnjige.
3. Na formu ugradite kontrole Frame, List Box, Command Button i Label,
kao na slici:

56

4. 3URPLMHQLWHVYRMVWYDIRUPLSUHPDVOMHGHRMWDEOLFL
Svojstvo

Vrijednost

Name

frmTezinaKnjige

BorderStyle

1-Fixed Single

Caption

Tezine knjiga

ControlBox

False

Height

4425

MaxButton

False

MinButton

False

Moveable

False

StartUpPosition

2-CenterScreen

Width

3870

5. 3URPLMHQLWHVYRMVWYDNRQWUROL)UDPHSUHPDVOMHGHRMWDEOLFL
Svojstvo

Vrijednost

Name

fraTezina

Caption

Oznacite knjigu

6. 3URPLMHQLWHVYRMVWYDNRQWUROL/LVWSUHPDVOMHGHRMWDEOLFL
57

Svojstvo

Vrijednost

Name

lstTezina

7. 3URPMHQLWHVYRMVWYDNRQWUROL&RPPDQGSUHPDVOMHGHRMWDEOLFL
Svojstvo

Vrijednost

Name

cmdIzadji

Caption

Povratak glavnoj formi.

Default

True

8. 3URPLMHQLWHVYRMVWYDNRQWUROL/DEHOSUHPDVOMHGHRMWDEOLFL
Svojstvo

Vrijednost

Name

lblTezina

Caption

(prazno)

AutoSize

True

9. Pohranite Ivamar.
Pisanje dokumenta 'tezina.txt'
1. 81RWHSDGXQDSLLWHWHLQHSRMHGLQLKNQMLJDLIRUPDWD

2. 7HNVWMHVORHQSRDEHFHGL3RKUDQLWHGRNXPHQWSRGLPHQRPtezina.txt u
mapu C:\Ivamar.
58

Kodiranje forme
1. Nastavljamo raditi na formi TezinaKnjige.
2. 'RGDMWHVOMHGHLUHGDNN{GDXVHNFLMX*HQHUDO'HFODUDWLRQV
Option Explicit
Private m_colTezineKnjiga As New Collection
3. Sada kodirajte proceduru Form_Load() ovako:
Private Sub Form_Load()
On Error GoTo Preskoci
Dim strKnjigaFormat As String
Dim intTezina As Integer
If App.Path = "\" Then
Open App.Path & "tezina.txt" For Input As #1
Else
Open App.Path & "\tezina.txt" For Input As #1
End If
Do While Not EOF(1)
Input #1, strKnjigaFormat, intTezina
m_colTezineKnjiga.Add Item:=intTezina
lstTezina.AddItem strKnjigaFormat
Loop
Close #1
Exit Sub
Preskoci:
Select Case Err.Number
Case 53

'File not found


59

MsgBox "Nije pronadjena datoteka tezine.txt." &


vbCrLf & _
"Pohranite tezine.txt u istu mapu s projektom
Ivamar."
Uload Me
Exit Sub
Case Else
MsgBox "Pojavila se neocekivana greska." & vbCrLf &
_
"Javite programeru."
Uload Me
Exit Sub
End Select
End Sub
4. Sada kodirajte proceduru lstTezina_Click() ovako:
Private Sub lstTezina_Click()
lblTezina.Caption = "Tezina knjige formata " & _
lstTezina.Text & _
" je: " & m_colTezineKnjiga.Item(lstTezina.Text) &
_
" grama."
End Sub
5. Sada kodirajte proceduru Form_QueryUnload ovako:
Private Sub Form_QueryUnload(Cancel As Integer,
UnloadMode As Integer)
Set m_colTezineKnjiga = Nothing
End Sub
6. Sada kodirajte proceduru cmdIzadji_Click() ovako:
Private Sub cmdIzadji_Click()
Unload Me
60

End Sub
7. Pohranite Ivamar.
Dohvat nove forme s glavne forme
1. Otvorite projekt Ivamar i formu GlavniObrazac u dizajn pogledu.
2. Ugradite kontrolu Command1 kao na slici dolje:

3. Promijenite kontroli svojstva Name u cmdTezina, Caption u Tezine


knjiga.
4. Kodirajte proceduru cmdTezina_Click() ovako:
Private Sub cmdTezina_Click()
frmTezinaKnjige.Show vbModal
End Sub
5. Pohranite Ivamar.
6. 6DGPRHWHSURYMHULWLVYRMN{GQDGMHOX3RNUHQLWH,YDPDU

61

Lekcija 9 Ivamar
i osobni objekt
Knjiga
Kreiranje objekta Knjiga
Kreiranje class modula Knjiga
1. Otvorite projekt Ivamar.
2. Project/Add Class Module.
3. Pritisnite tipku mia dva puta na Class Module.
4. )LRWYRULWHVHSUR]RU3URSHUWLHV]DFODVV
5. Tipkajte Knjiga umjesto svojstva Name Class1.

62

6. 3RKUDQLWHXPDSX&?,YDPDUSRGLPHQRP.QMLJDDHNVWHQ]LMDH
automatski biti .css.
7. Otvorite prozor Project Explorer. Projekt Ivamar sada ima dvije forme i
jedan class modul.

Kreiranje svojstava class modula Knjiga


.UHLUDWHPRRYDVYRMVWYDREMHNWX.QMLJD
Objekt

Knjiga

Svojstva

Naslov
Format
Kolicina
Cijena

Kreiranje varijabli Private u class modulu Knjiga


1. Nastavimo raditi na kdu class modula Knjiga.
2. Tipkajmo ovaj kd u sekciju General Declarations class modula:
Option Explicit
Private m_strNaslov As String
Private m_strFormat As String
Private m_intKolicina As Integer
Private m_curCijena As Currency

63

Private m_colCijenaKnjige As New Collection


3. 3RKUDQLWH,YDPDUSRPRXQDUHGEH6DYH
Analiza

LYRWQLYLMHNYDULMDEOLXFODVVPRGXOXMHGQDNMHRQRPHXIRUPL'HNODULUDOLVPR
HWLULYDULMDEOHEXGXDHWLULVYRMVWYDREMHNWD.QMLJH'HNODULUDOLVPRLYDULMDEOX
NROHNFLMXPBFRO&LMHQD.QMLJHXNRMXHVHXLWDWLFLMHQHL]GDWRWHNH&MHQLNW[W6YH
smo deklarirali u sekciji General Declarations jer se mora dogoditi prije
LQLFLMDOL]DFLMHLOLURHQMDREMHNWD8SURFHGXUL,QLWLDOL]HXLWDWHVHSRGDFLL]
datoteke Cjenik.txt.
8QDHPSURMHNWXXVYDNRPWUHQXWNXPRHSRVWRMDWLRGQXODGRQDMYLHHWLUL
objekta Knjiga. Kada korisnik pritisne tipku mia na Check Box u okviru Formati
NQMLJHREMHNW.QMLJDHVHURGLWL XLXPHPRULMX NDGDNRULVQLNLVNOMXLWDM
&KHFN%R[REMHNWHXPULMHWL L]DLL]PHPRULMH $NRNRULVQLNRGDEHUHHWLUL
&KHFN%R[LPDWHPRHWLULREMHNWD.QMLJDXPHPRULML
6YDNLREMHNW.QMLJDLPDWHSRVHEQRXLWDQHSRGDWNHL]YDQMVNHGDWRWHNH
&MHQLNW[WHWLULREMHNWDHWLULXLWDYDQMDSRGDWDNDQDHWLULPMHVWDXPHPRULML
isti podaci Cjenik.txt. Zato ne bismo napisali malo kda izvan objekata u kojem
ELVHXLWDOLSRGDFLL]YDQMVNRJGRNXPHQWD&MHQLNW[WL]DX]HOLMHGQRPMHVWRX
memoriji. Svi objekti koji se inicijaliziraju tada bi kontaktirali to jedno mjesto u
memoriji. To bi bilo u suprotnosti s objektno orijentiranim programiranjem. To bi
bio hibrid proceduralnog i objektnog programiranja. Objekt ne bi bio samostalan i
mobilan u druge aplikacije i procedure, jer bi ovisio o tom vanjskom kdu ili bi ga
dijelili kolegama s dodatnim uputama za vanjski kd.
Kreiranje procedure Initialize
1. Nastavljate raditi na class modulu Knjiga u projektu Ivamar.
2. 1DSLLWHVOMHGHLN{GXGRJDDMSURFHGXUX&ODVVB,QLWLDOL]H
Private Sub Class_Initialize()
On Error GoTo Preskoci
Dim strProvjera As String
Dim strNaslov As String
Dim strFormat As String
Dim curCijena As Currency

64

If App.Path = "\" Then


Open App.Path & "cjenik.txt" For Input As #1
Else
Open App.Path & "\cjenik.txt" For Input As #1
End If
Do While Not EOF(1)
Input #1, strNaslov, strFormat, curCijena
m_colCijenaKnjige.Add Item:=curCijena,
Key:=strNaslov & strFormat
Loop
Close #1
Exit Sub
Preskoci:
Select Case Err.Number
Case 53
MsgBox "Aplikacija ne moze pronaci " & _
"cjenik.txt. Pohranite datoteku " & vbCrLf & _
"cjenik.txt u mapu Ivamar na lokalnom disku."
Unload frmGlavniObrazac
Exit Sub
Case Else
MsgBox "Neocekivana greska. Program se prekida.
Kontaktirajte dobavljaca."
Exit Sub
End Select
End Sub
3. Pohranite Ivamar.
65

Analiza

*RUQMLN{GMHJRWRYRLGHQWLDQN{GXXSURFHGXUL&LWDM&MHQLNXJODYQRMIRUPL7R
MH]DWRWRUDGLLVWLSRVDRXLWDYDFLMHQHL]GDWRWHNHFMHQLNW[WXNROHNFLMX
PBFRO&LMHQD.QMLJH%XGXLGDMHNROHNFLMDGHNODULUDQDXVHNFLML*HQHUDO
'HFODUDWLRQVFODVVPRGXODSRGDFLHELWLGRVWXSQLVYDNRMSURFHGXULXFODVV
modulu.
,SDNQHHPRREULVDWLN{GNRMLXLWDYDSRGDWNHVGRNXPHQWDFMHQLNW[WXJODYQRP
REUDVFX7DMN{GHRVWDWLUDGLSXQMHQMDSRGDFLPDNRQWUROHOVW.QMLJH3RQRYRVH
SRVORYLXLWDYDQMDSRGDWDNDSRQDYOMDMXDOLWRMHXYMHWVDPRVWDOQRVWLLQHRYLVQRVWL
objekata.
Kreiranje procedura Let i Get class modula Knjige
1. Nastavljate raditi na class modulu Knjiga.
2. 7LSNDMWH]DVYDNRVYRMVWYRVOMHGHLN{GXVHNFLMX*HQHUDO
3. Za svojstvo Naslov:
Property Let Naslov(ByVal strNovi As String)
m_strNaslov = strNovi
End Property
Property Get Naslov() As String
Naslov = m_strNaslov
End Property
4. Za svojstvo Format:
Property Get Format() As String
Format = m_strFormat
End Property
Property Let Format(ByVal strNovi As String)
66

m_strFormat = strNovi
End Property
5. =DVYRMVWYR.ROLLQD
Property Let Kolicina(ByVal intNovi As Integer)
If m_strFormat = "E-learning" Then
m_intKolicina = 1
Else
m_intKolicina = intNovi
End If
End Property
Property Get Kolicina() As Integer
Kolicina = m_intKolicina
End Property
6. Za svojstvo Cijena:
Property Get Cijena() As Currency
m_curCijena = m_colCijenaKnjige(m_strNaslov &
m_strFormat)
Cijena = m_curCijena
End Property
7. Pohranite Ivamar.
Analiza

2EMHNW.QMLJDMHQDSUDYOMHQ1DSUDYLOLVPRPXLHWLULVYRMVWYD

67

Spajanje programa na objekt Knjiga


$VDGHPRQDSUDYLWLL]PMHQHQDJODYQRMIRUPLSRWUHEQH]DXJUDGQMXREMHNWD
Knjiga.

Promjene u glavnom obrascu radi ugradnje objekta Knjiga


1. Nastavljamo raditi u projektu Ivamar.
2. Otvorite formu GlavniObrazac u prozoru Code i promijenite kd u sekciji
*HQHUDO'HFODUDWLRQVNDRWRMHRVMHQHQR
Option Explicit
Public Kom As Integer
Private m_lngBojaPozadine As Long
Private m_blnPrikazDatuma As Boolean
Private m_colCijenaFormata As New Collection
Private m_knjCourseware As Knjiga
Private m_knjElearning As Knjiga
Private m_knjCDROM As Knjiga
Private m_knjPapir As Knjiga
3. Pohranite Ivamar.
Analiza

'HNODULUDOLVPRHWLULREMHNWYDULMDEOH=DVYDNLIRUPDWNQMLJHSRMHGQDREMHNW
varijabla. Kada korisnik odabere jednu kontrolu Check Box, stvoreni su preduvjeti
]DUDDQMHMHGQRJREMHNWD.QMLJD2EMHNW.QMLJDHVHLQLFLMDOL]LUDWLLOLroditi tek
NDGDSULWLVQHPRJXPEFPG,]UDXQDM
5DDQMHLXPLUDQMHREMHNDWD.QMLJDXSURMHNWX,YDPDU
1. Nastavljamo raditi na kdu forme GlavniObrazac.
2. Otvorite proceduru chkFormatKnjige_Click i tipkajte ovaj kd:
Private Sub chkFormatKnjige_Click(Index As Integer)
Select Case Index
Case 0:
68

If chkFormatKnjige(Index).Value = 1 Then
Set m_knjCourseware = New Knjiga
m_knjCourseware.Naslov = lstKnjige.Text
m_knjCourseware.Format = "Courseware"
m_knjCourseware.Kolicina = frmGlavniObrazac.Kom
Else
Set m_knjCourseware = Nothing
End If
Case 1:
If chkFormatKnjige(Index).Value = 1 Then
Set m_knjElearning = New Knjiga
m_knjElearning.Naslov = lstKnjige.Text
m_knjElearning.Format = "E-learning"
m_knjElearning.Kolicina = frmGlavniObrazac.Kom
Else
Set m_knjElearning = Nothing
End If
Case 2:
If chkFormatKnjige(Index).Value = 1 Then
Set m_knjCDROM = New Knjiga
m_knjCDROM.Naslov = lstKnjige.Text
m_knjCDROM.Format = "CD-ROM"
m_knjCDROM.Kolicina = frmGlavniObrazac.Kom
Else
Set m_knjCDROM = Nothing
End If
Case 3:
If chkFormatKnjige(Index).Value = 1 Then
69

Set m_knjPapir = New Knjiga


m_knjPapir.Naslov = lstKnjige.Text
m_knjPapir.Format = "Papir"
m_knjPapir.Kolicina = frmGlavniObrazac.Kom
Else
Set m_knjPapir = Nothing
End If
End Select
End Sub
3. Pohranite Ivamar.
Promjena objekta Knjiga kada korisnik odabere novi naslov
1. Nastavljamo raditi na kdu forme GlavniObrazac.
2. 8QHVLWHVOMHGHHSURPMHQHXSURFHGXUXOVW.QMLJHB&OLFN
Private Sub lstKnjige_Click()
If lstKnjige.ListIndex = -1 Then Exit Sub
If App.Path = "\" Then
imgKnjige.Picture = LoadPicture(App.Path &
lstKnjige.Text & ".jpg")
Else
imgKnjige.Picture = LoadPicture(App.Path & "\"
& lstKnjige.Text & ".jpg")
End If
Dim chkObjekt As CheckBox
For Each chkObjekt In chkFormatKnjige
Select Case chkObjekt.Value
Case 1
70

If chkObjekt.Caption = "Courseware" Then


m_knjCourseware.Naslov = lstKnjige.Text
End If
If chkObjekt.Caption = "E-learning" Then
m_knjElearning.Naslov = lstKnjige.Text
End If
If chkObjekt.Caption = "CD-ROM" Then
m_knjCDROM.Naslov = lstKnjige.Text
End If
If chkObjekt.Caption = "Papir" Then
m_knjPapir.Naslov = lstKnjige.Text
End If
End Select
Next
End Sub
Analiza

HPXVOXLJRUQMLN{G"6OXLVOMHGHHPRGDEUDOLVPRQDVORYNQMLJHRGDEUDOLVPR
IRUPDWHLNROLLQX7DGDVPRVHSUHGRPLVOLOLLSULWLVQXOLWLSNXPLDQDGUXJLQDVORY
NQMLJHXNRQWUROLOVW.QMLJH'RJRGLRVHGRJDDMOVW.QMLJHB&OLFN,VWRLPHQDH
procedura sada provjeriti koji su formati odabrani, tj. koje kontrole Check Box
imaju Value = 1.
7RVPRULMHLOLSRPRXREMHNWYDULMDEOHFKN2EMHNWLSHWOMH6HOHFW&DVH
Case 1
]QDLXSUDYR9DOXH 
If chkObjekt.Caption = "Courseware" Then
m_knjCourseware.Naslov = lstKnjige.Text
End If
Preko strukture If...Then objektima se postavlja svojstvo 'Naslov' na vrijednost
novoizabranog naslova knjige u lstKnjige (lstKnjige.Text). Kontrola List Box ima
svojstvo Text samo za vrijeme rada (run-time) programa.

71

Promjene kda u proceduri optKom_Click


1. 8NROLNRVHNRULVQLNSUHGRPLVOLLSURPLMHQLNROLLQXWDMGRJDDMPRUD
LPDWLSURFHGXUXNRMDHSURPLMHQLWLVYRMVWYR.ROLFLQDVYLPSRVWRMHLP
REMHNWLPD.QMLJD=DWRXQHVLWHVOMHGHHSURPMHQHXN{GSURFHGXUH
optKom_Click:
Private Sub optKom_Click(Index As Integer)
frmGlavniObrazac.Kom = Index
Dim chkObjekt As CheckBox
For Each chkObjekt In chkFormatKnjige
Select Case chkObjekt.Value
Case 1
If chkObjekt.Caption = "Courseware" Then
m_knjCourseware.Kolicina = Index
End If
If chkObjekt.Caption = "E-learning" Then
m_knjElearning.Kolicina = Index
End If
If chkObjekt.Caption = "CD-ROM" Then
m_knjCDROM.Kolicina = Index
End If
If chkObjekt.Caption = "Papir" Then
m_knjPapir.Kolicina = Index
End If
End Select
Next
End Sub

72

Analiza

*RUQMLMHN{GLVWLNDRRQDMXOVW.QMLJHVDPRVHPLMHQMDVYRMVWYR.ROLLQDXPMHVWR
svojstva Naslov.
Promjene u proceduri cmdIzracunaj
1. 3URPLMHQLWH]DVMHQMHQRXSURFHGXULFPG,]UDFXQDMB&OLFN7ULWRNLFH]QDH
QHSURPLMHQMHQSUHVNRHQGLRN{GD
Private Sub cmdIzracunaj_Click()
On Error GoTo Preskoci
...
'Sad imamo sve elemente za racunanje ukupnog iznosa
'Izracunajmo cijenu svakom formatu pojedine knjige
curCijenaCourseware = m_knjCourseware.Cijena
curCijenaElearning = m_knjElearning.Cijena
curCijenaCdRom = m_knjCDROM.Cijena
curCijenaPapir = m_knjPapir.Cijena
curCijenaSve = m_colCijenaFormata(lstKnjige.Text &
"Komplet")
'Kad kupac odabere sve formate jednog naslova
obavijestimo ga o popustu
If chkFormatKnjige(0).Value = 1 And _
chkFormatKnjige(2).Value = 1 And _
chkFormatKnjige(3).Value = 1 Then
MsgBox "Iznos ukljucuje popust za kupovinu
kompleta"
curIznos = (curCijenaSve *
frmGlavniObrazac.Kom) + _
73

curCijenaElearning
Else
'Zbrojimo cijene i pomnozimo s kolicinom
'i dobit cemo ukupan iznos narudzbe
curIznos = (((curCijenaCourseware +
curCijenaCdRom _
+ curCijenaPapir) * frmGlavniObrazac.Kom) +
curCijenaElearning)
End If
'Ako je iznos veci od nula, prikazi cijenu i
'ucini label vidljivim
If curIznos > 0 Then
lblCijena.Caption = "Ukupan iznos je " & _
Format(curIznos, "###,###.00")
lblCijena.Visible = True
End If
Exit Sub
Preskoci:
Select Case Err.Number
Case 91

'Object Reference not set

Resume Next
Case Else
MsgBox Err.Number & ": " & Err.Description
Resume Next
End Select
End Sub
2. Pohranite Ivamar.
3. 6DGDPRHWHLVSUREDWLQRYLN{G3RNUHQLWH,YDPDULSURYMHULWHUDG
aplikacije.
4. ,]DLWHL],YDPDUSRPRXQDUHGEH3URJUDP,]OD]L]DSRUNH
74

Analiza

3UYDMHQRYRVWXYRHQMHN{GDHUURUKDQGOHU
On Error GoTo Preskoci
... i na kraju ovog kda:
Preskoci:
Select Case Err.Number
Case 91

'Object Reference not set

Resume Next
Case Else
MsgBox Err.Number & ": " & Err.Description
Resume Next
End Select
(UURUKDQGOHUMHXYHGHQUDGLSURPMHQHXYRHQMDFLMHQD
curCijenaCourseware = m_knjCourseware.Cijena
curCijenaElearning = m_knjElearning.Cijena
curCijenaCdRom = m_knjCDROM.Cijena
curCijenaPapir = m_knjPapir.Cijena
6YDNLREMHNW.QMLJDXLWDYDFLMHQXSRVHEQRXVYRMHVYRMVWYR
&LMHQD
6DGDMH
VYDNRMYDULMDEOLQDOLMHYRMVWUDQLMHGQDGEHSULGRGDQDYULMHGQRVWVYRMVWYD
&LMHQD

1DYHGHQDVXVYDHWLULREMHNWDLDNRNXSDFQHPRUDRGDEUDWLVYHHWLULNRQWUROH
Check Box.
1HSRVWRMHLREMHNWHL]D]YDWLJUHNX(UURU2EMHFW5HIHUHQFH1RW6HW
$OLNDFLMDHSDVWL(UURUKDQGOHUVPRXYHOL]DSUHPRWHQMHWHJUHNH
Unitavanje objekt varijabli Knjiga
1. Nastavljamo raditi na formi frmGlavniObrazac.
2. 7LSNDMWHVOMHGHLN{GXSURFHGXUX)RUPB4XHU\8QORDG
Private Sub Form_QueryUnload(Cancel As Integer,
UnloadMode As Integer)
75

Set m_knjCourseware = Nothing


Set m_knjElearning = Nothing
Set m_knjCDROM = Nothing
Set m_knjPapir = Nothing
End Sub
3. Pohranite Ivamar.
Analiza

2YRMHHNVSOLFLWDQQDLQLHQMDPHPRULMHRGVYLKPRJXLKUHIHUHQFLMDREMHNW
varijabli, u trenutku neposredno pred zatvaranje forme GlavniObrazac.
Zatvaranjem forme ne moraju se osloboditi i adrese u memoriji raznih referencija.
Zato je ovaj kd dobra praksa.

76

Lekcija 10
Dodavanje
dogaaja
projektu Ivamar
.RGLUDQMHGRJDDMDXFODVVPRGXOX.QMLJDFOV
.RGLUDWHPRMHGDQGRJDDMXQXWDUREMHNWD.QMLJD
1. Otvorite projekt Ivamar.
2. U Project Exploreru dva puta pritisnite tipku mia na class modul
Knjiga.cls.
3. .{GLUDMWHVOMHGHHSURPMHQHXN{GXVHNFLMH*HQHUDO'HFODUDWLRQV
Promjene su u zasjenjenim redcima.
Option Explicit
Public Event PromjenaPodataka(Podatak As String,
Vrijednost As Variant)
Private m_strNaslov As String
Private m_strFormat As String
Private m_intKolicina As Integer
Private m_curCijena As Currency
4. Promijenite kd u proceduri Property Let svojstva Naslov:
Property Let Naslov(ByVal strNovi As String)
77

m_strNaslov = strNovi
RaiseEvent PromjenaPodataka("Naslov", m_strNaslov)
End Property
5. Promijenite kd u proceduri Property Let svojstva Format:
Property Let Format(ByVal strNovi As String)
m_strFormat = strNovi
RaiseEvent PromjenaPodataka("Format", m_strFormat)
End Property
6. Promijenite kd u proceduri Property Let svojstva Kolicina:
Property Let Kolicina(ByVal intNovi As Integer)
If m_strFormat = "E-learning" Then
m_intKolicina = 1
Else
m_intKolicina = intNovi
End If
RaiseEvent PromjenaPodataka("Kolicina", m_intKolicina)
End Property
7. 'RGDMWHVOMHGHLN{GQDSRHWDNGRJDDMDSURFHGXUHInitialize:
Private Sub Class_Initialize()
Debug.Print "Objekt Knjiga je rodjen..."
On Error GoTo Preskoci
78

8. 'RGDMWHVOMHGHLN{GGRJDDMSURFHGXUHTerminate:
Private Sub Class_Terminate()
Debug.Print "Objekt Knjiga je umro..."
End Sub
9. Pohranite Ivamar.
Analiza

'RJDDMVHGHNODULUDSRPRXNOMXQLKULMHLPublic i Event...
Public Event PromjenaPodataka(Podatak As String,
Vrijednost As Variant)
0MHVWRGHNODUDFLMHMHVHNFLMD*HQHUDO'HFODUDWLRQV'RJDDMHELWLQD
raspolaganju svim procedurama unutar class modula.
,QWHJUDFLMDGRJDDMDX,YDPDU
3URJUDPMRQLMHXVWDQMXUHDJLUDWLQDGRJDDM3URPMHQD3RGDWDND%LWHWHNNDGD
promijenimo kd deklaracije objekta Knjiga u glavnoj formi.
1. Otvorite Ivamar.
2. Otvorite formu frmGlavniObrazac u prozoru Code.
3. 3URPLMHQLWHN{GGHNODUDFLMHHWLULPRJXDREMHNWD.QMLJD
Option Explicit
Public Kom As Integer
Private m_lngBojaPozadine As Long
Private m_blnPrikazDatuma As Boolean
Private m_colCijenaFormata As New Collection
Private WithEvents m_knjCourseware As Knjiga
Private WithEvents m_knjElearning As Knjiga
Private WithEvents m_knjCDROM As Knjiga
Private WithEvents m_knjPapir As Knjiga

79

4. 3RKUDQLWH,YDPDU3RNUHQLWHSURJUDP-RQHPDUHDNFLMHQDQDGRJDDM
3RWUHEQRMHQDSLVDWLUHDNFLMXQDSLVDWLN{GXGRJDDMSURFHGXUL
PromjenaPodataka.
Analiza

.OMXQDULMH:LWK(YHQWVMHMHGLQDSURPMHQDXN{GXGHNODUDFLMHVYDNRJRGHWLUL
PRJXDREMHNWD.QMLJD
.RGLUDQMHGRJDDMD3URPMHQD3RGDWDND
1. Otvorite formu frmGlavniObrazac.
2. Pritisnite tipku mia na polje Object i u popisu objekata, pored kontrola,
SRMDYLWHVHLQDLREMHNWL.QMLJD2EMHNWLVXGRVSMHOLXWXOLVWXQDNRQ
XYRHQMDNOMXQHULMHL:LWK(YHQWVXGHNODUDFLMXREMHNDWD.QMLJD

3. 3ULWLVQLWHWLSNXPLDQDREMHNWPBNQM&'5208SROMX3URFHGXUHHVH
DXWRPDWVNLSRMDYLWLMHGLQDGRJDDMSURFHGXUD3URPMHQD3RGDWDND
4. 'RGDMWHRYDMN{GXGRJDDMSURFHGXUXPBNQM&'520B3URPMHQD3RGDWDND
Private Sub m_knjCDROM_PromjenaPodataka(Podatak As
String, Vrijednost As Variant)
Debug.Print "Svojstvo " & Podatak & " se
promijenilo u: " & Vrijednost
End Sub
5. 'RGDMWHRYDMN{GXGRJDDMSURFHGXUX
m_knjElearning_PromjenaPodataka:
Private Sub m_knjElearning_PromjenaPodataka(Podatak As
String, Vrijednost As Variant)

80

Debug.Print "Svojstvo " & Podatak & " se


promijenilo u: " & Vrijednost
End Sub
6. 'RGDMWHRYDMN{GXGRJDDMSURFHGXUXPBNQM3DSLUB3URPMHQD3RGDWDND
Private Sub m_knjPapir_PromjenaPodataka(Podatak As
String, Vrijednost As Variant)
Debug.Print "Svojstvo " & Podatak & " se
promijenilo u: " & Vrijednost
End Sub
7. 'RGDMWHRYDMN{GXGRJDDMSURFHGXUXPBNQM3DSLUB3URPMHQD3RGDWDND
Private Sub m_knjCourseware_PromjenaPodataka(Podatak As
String, Vrijednost As Variant)
Debug.Print "Svojstvo " & Podatak & " se
promijenilo u: " & Vrijednost
End Sub
8. Pohranite Ivamar. Pokrenite Ivamar.
9. 2GDEHULWH9LVXDO%DVLFXOLVWER[2YDYDDDNFLMDQHHLQLFLMDOL]LUDWL
REMHNW8SUR]RUX8PPHGLDWHVHQHHQLWDQDSLVDWL
10. 2GDEHULWH&RXUVHZDUH8SUR]RUX,PPHGLDWHVHWLVNDRVOMHGHLWHNVW
Objekt Knjiga je URHQ...
Svojstvo Naslov se promijenilo u: VisualBasic
Svojstvo Format se promijenilo u: Courseware
Svojstvo Kolicina se promijenilo u: 0
11. 2GDEHULWHNROLLQX8SUR]RUX,PPHGLDWHVHSRMDYLRUHGDNWHNVWD
Svojstvo Kolicina se promijenilo u: 1
12. Zatvorite aplikaciju s Program/Izlaz i zaporkom 1234. U prozoru
Immediate se pojavio tekst:
Objekt Knjiga je umro...

81

Analiza
Kada smo odabrali naslov knjige Visual Basic u list box, objekt se nije stvorio. Tek kada smo
odabrali check box, objekt se rodio. Zato?

Pogledajmo proceduru...
Private Sub chkFormatKnjige_Click(Index As Integer)
Select Case Index
Case 0:
If chkFormatKnjige(Index).Value = 1 Then
Set m_knjCourseware = New Knjiga
m_knjCourseware.Naslov = lstKnjige.Text
m_knjCourseware.Format = "Courseware"
m_knjCourseware.Kolicina = frmGlavniObrazac.Kom
Else
Set m_knjCourseware = Nothing
End If
... i u njoj redak...
Set m_knjCourseware = New Knjiga
Tek je ova naredba stvorilaQRYLREMHNWPBNQM&RXUVHZDUH2YGMHVXNOMXQHGYLMH
ULMHLSet i New2YHGYLMHNOMXQHULMHL]DMHGQRXJRUQMRMVLQWDNVLNUHLUDMXQRYL
objekt na temelju class modula Knjiga.
Ovako smo deklarirali objekte u sekciji General Declarations...
Private WithEvents m_knjCourseware As Knjiga
Private WithEvents m_knjElearning As Knjiga
Private WithEvents m_knjCDROM As Knjiga
Private WithEvents m_knjPapir As Knjiga
... a nismo ovako...
Private WithEvents m_knjCourseware As New Knjiga
Private WithEvents m_knjElearning As New Knjiga
Private WithEvents m_knjCDROM As New Knjiga
Private WithEvents m_knjPapir As New Knjiga
Zato?
82

=DWRWRSUYLQDLQGHNODULUDQMDREMHNWDQHVWYDUDWDMREMHNWWMQH]DX]LPDPMHVWR
u memoriji kao rezervaciju za objekt. Zato bi se ikakav prostor u memoriji
]DX]LPDRXQDSULMHG"$WRVHGRJDDNDGDXN{GXSLHPRNOMXQXULMHNew. Kada
ELVPRNRULVWLOL1HZVYDHWLULREMHNWDELVHrodila jo u sekciji General
Declarations, zauzela neka mjesta u memoriji i bila na raspolaganju svim
procedurama u aplikaciji. U memoriji bi ostali sve dok se aplikacija ne bi
zatvorila, tj. do onih naredbi u trenutku zatvaranja aplikacije (glavne forme
frmGlavniObrazac):
Set m_knjCourseware = Nothing
Set m_knjElearning = Nothing
Set m_knjCDROM = Nothing
Set m_knjPapir = Nothing
%XGXLGDQLVPRNRULVWLOLULMH1HZXGHNODUDFLMLREMHNWLQLVXQDVWDOL.DGDH
QDVWDWL"2EMHNWHVHroditi kad program izvri naredbu:
Set m_knjCourseware = New Knjiga
.OMXQHULMHL6HWL1HZVX]DPMHQD]DVDPRMHGQXNOMXQXULMH1HZX
GHNODUDFLML*GMHHPRSLVDWLQDUHGEX6HW1HZRYLVLRWRPHJGMHVPDWUDPR
SRWUHEQLPUDDQMHREMHNWD8SULPMHUX,YDPDUWXVPRQDUHGEXVWDYLOLXSURFHGXUX
GRJDDMD&OLFNDUUD\DFKN)RUPDW.QMLJH.DGDVPRSULWLVQXOLWLSNXPLDQDFKHFN
box Courseware, rodio VHREMHNWPBNQM&RXUVHZDUHNDRLQDLFDREMHNWDSUHGORND
Knjiga.
'RJDDVHGRJDDM,QLWLDOL]HXLMRMSURFHGXULVPRQDSLVDOL
Private Sub Class_Initialize()
Debug.Print "Objekt Knjiga je rodjen..."
Nakon ispisa ...
Objekt Knjiga je rodjen...
... dolazi do ispisa vrijednosti svojstava nastalog objekta...
Objekt Knjiga je URHQ...
Svojstvo Naslov se promijenilo u: VisualBasic
Svojstvo Format se promijenilo u: Courseware
Svojstvo Kolicina se promijenilo u: 0
2YD]DGQMDWULUHWNDSRVOMHGLFDVXQDHJGRJDDMD3URPMHQD3RGDWDNDNRMLVH
LQLFLUDXSURFHGXUDPD/HWVYRMVWDYD1DVORY)RUPDWL.ROLFLQDSRPRXQDUHGEH
RaiseEvent:
83

RaiseEvent PromjenaPodataka("Format", m_strFormat)


3LVDQMHXSUR]RU,PPHGLDWHMHYUORSUDNWLQRNDGDHOLPRRWNULWLNDNRSURJUDP
radi ili pak otkriti greku.
.DGDQDPGRJDDMYLHQHWUHEDPRHPRJDSRPRXDSRVWURIDVWDYLWLXNRPHQWDU
obrisati ili jednostavno ostaviti. Kompajlirana verzija programa, programska
GDWRWHNDH[HLRQDNRVHQHRED]LUHQDQDUHGEH'HEXJ3ULQWLQHHRWYDUDWLQLNDNYH
dodatne prozore za vrijeme rada programa (run-time).

84

Lekcija 11
Gradnja objekta
"Paket"
8. Otvorite projekt Ivamar.
9. Project/Add Class Module.
10. Pritisnite dva puta tipku mia na Class Module.
11. )LRWYRULWHVHSUR]RU3URSHUWLHV]DFODVV
12. Tipkajte Tezina umjesto svojstva Name Class1.
13. 3RKUDQLWHXPDSX&?,YDPDUSRGLPHQRP7H]LQDDHNVWHQ]LMDH
automatski biti .css.
14. Otvorite prozor Project Explorer. Projekt Ivamar sada ima dvije forme i
dva class modula.
Svojstva objekta Tezina
2EMHNWX7H]LQDHPRGDWLGYDVYRMVWYD1DVORY.QMLJHL7H]LQD.QMLJH
1. Nastavite raditi na class modulu Tezina.
2. 'RGDMWHVOMHGHLN{GXVHNFLMX*HQHUDO'HFODUDWLRQV
Option Explicit
Private m_strNaslovKnjige As String
Private m_intTezinaKnjige As Integer
Private m_colTezineKnjiga As New Collection
3. Pohranite Ivamar.

85

.RGLUDQMHGRJDDMSURFHGXUH,QLWLDOL]HFODVVPRGXOD7H]LQD
1. 'RGDMWHVOMHGHLN{GSURFHGXUL,QLWLDOL]H
Private Sub Class_Initialize()
On Error GoTo Preskoci
Dim strNaslovKnjige As String
Dim intTezinaKnjige As Integer
If App.Path = "\" Then
Open App.Path & "Tezina.txt" For Input As #1
Else
Open App.Path & "\Tezina.txt" For Input As #1
End If
Do While Not EOF(1)
Input #1, strNaslovKnjige, intTezinaKnjige
m_colTezineKnjiga.Add Item:=intTezinaKnjige,
Key:=strNaslovKnjige
Loop
Close #1
Exit Sub
Preskoci:
Select Case Err.Number
Case 53
MsgBox "Aplikacija ne moze pronaci " & _
"Tezina.txt. Pohranite datoteku " & vbCrLf & _
"Tezina.txt u mapu u kojoj je " & _
"projekt Ivamar na lokalnom disku."
Unload Me
86

Exit Sub
Case Else
MsgBox "Neocekivana greska. Program se prekida.
Kontaktirajte dobavljaca."
Unload frmGlavniObrazac
Exit Sub
End Select
End Sub
2. Pohranite Ivamar.
Analiza

Ovaj kd u class modulu Tezina jednak je onom kdu u proceduri Load forme
frmTezinaKnjige. Mogao sam ga doslovce prepisati, ali nisam kako se ne bi
dovodilo u neku vezu. Ovaj kd u Initialize class modula Tezina ima za cilj
NUHLUDWLNROHNFLMXPBFRO7H]LQH.QMLJDLXWXNROHNFLMXXLWDWLSRGDWNHL]YDQMVNH
GDWRWHNH7H]LQDW[W2YDNROHNFLMDMHXQXWDUFODVVPRGXODLLQLFODVVPRGXO
samostojnim i neovisnim o vanjskom programskom kdu.
1HHPRREULVDWLQLRQDMN{GXSURFHGXUL/RDGIRUPHIUP7H]LQD.QMLJHMHURQ
VOXL]DSXQMHQMHWHNVWRPOLVWER[OVW7H]LQD.DGDSURJUDPNUHQHSURFHGXUDNRMD
SULSDGDIRUPLXLWDWHWHNVWXOLVWER[L]YDQMVNRJGRNXPHQWD7H]LQDW[W
&ODVVPRGXOHWDNRHUXLWDWLSRGDWNHL]LVWRJGRNXPHQWD7H]LQDW[WXVYRMX
kolekciju i programu ih ponuditi preko svojstava class modula.
Kreiranje svojstava class modula Tezina
1. Nastavite raditi na class modulu Tezina.
2. Kreirajte procedure svojstva NaslovKnjige. Procedura Get:
Property Get NaslovKnjige() As String
NaslovKnjige = m_strNaslovKnjige
End Property
3. Procedura Let:
Property Let NaslovKnjige(ByVal strNovi As String)
m_strNaslovKnjige = strNovi
End Property
87

4. Kreirajte procedure svojstva TezinaKnjige. Procedura Get:


Property Get TezinaKnjige() As Integer
m_intTezinaKnjige =
m_colTezineKnjiga(m_strNaslovKnjige)
TezinaKnjige = m_intTezinaKnjige
End Property
5. 1HHPRNUHLUDWLSURFHGXUX/HWVYRMVWYD7H]LQD.QMLJHMHUHWHLQHELWL
read-only.
6. Pohranite Ivamar.
Ugradnja objekta Tezina u program Ivamar
1. Nastavljamo raditi na projektu Ivamar.
2. 2WYRULWHIUP7H]LQD.QMLJHXSUR]RUX&RGHLSURPLMHQLWHSRVWRMHLN{GX
proceduri Click kontrole lstTezina:
Private Sub lstTezina_Click()
Dim tezNovi As New Tezina
tezNovi.NaslovKnjige = lstTezina.Text
lblTezina.Caption = "Tezina knjige " & _
lstTezina.Text & " je: " & tezNovi.TezinaKnjige & "
gr."
End Sub
3. 3RKUDQLWH,YDPDU3RNUHQLWH,YDPDU2GDEHULWHJXPE
7HLQHNQMLJD

2GDEHULWH+70/3DSLU7HLQDMHJUDPD

88

Analiza

)RUPDIUP7H]LQH.QMLJDVDGDNRULVWLREMHNW7H]LQD]DUDXQDQMHWHLQHNQMLJD
Korisniku je svejedno. On ne vidi nikakave promjene. Programeru nije svejedno.
Programeru je sada puno lake. U proceduri Click kontrole lstTezina on mora
samo deklarirati instancu objekta Tezina:
Dim tezNovi As New Tezina
Zatim postaviti svojstvo NaslovKnjige objekta Tezina na vrijednost svojstva Text
objekta list box lstTezina:
tezNovi.NaslovKnjige = lstTezina.Text
Na kraju, u svojstvu Caption objekta label lblTezina, 'zbrojiti' ili 'concatenating'
vrijednosti svojstava Text i TezinaKnjige:
lblTezina.Caption = "Tezina knjige " & _
lstTezina.Text & " je: " & tezNovi.TezinaKnjige & "
gr."
End Sub

89

Lekcija 12
Kolekcija
Narudba

1DSUDYLWHPRNROHNFLMX
1DUXG]ED
7DHQDPNROHNFLMDRODNDWLPDQLSXODFLMXV
objektima 'Knjiga'.
3RLQMHPRVED]LQLPFODVVPRGXORPNRMLHELWL
SUHGORDN
NROHNFLMH
1DUXG]ED

Kreiranje class modula 'Narudzba'
1. Otvorite Ivamar.
2. Project/Add class module.
3. Pritisnite dva puta tipku mia na Add Class Module.
4. F4.
5. Promijenite svojstvo Name: Class1 u Name: Narudzba.

6. Save. File name: Narudzba.cls. Save in: C:\Ivamar.


7.

Pohranite Ivamar. Prozor Project Explorer sada izgleda ovako:


90

&ODVVPRGXO1DUXG]EDMHNUHLUDQ6DGDJDWUHEDLVSXQLWLN{GRP3RLQMHPRV
deklariranjem varijabli Private.
Kreiranje varijabli Private u class modulu Narudzba
1. Nastavljamo raditi na class modulu Narudzba.
2. 7LSNDMWHVOMHGHLN{GXVHNFLMX*HQHUDO'HFODUDWLRQV
Option Explicit
Private m_colNarudzba As New Collection
Private m_intPopust As Integer
3. Pohranite Ivamar.
Analiza

Prvi redak kda je deklaracija objekta kolekcije m_colNarudzba. Drugi redak


GHNODULUDYDULMDEOXNRMDHQDPWUHEDWL]DUDXQDQMHSRSXVWDQDFLMHQXNDGDNXSFL
kupe komplet formata jedne knjige.
.{GLUDQMHGRJDDMSURFHGXUD,QLWLDOL]HL7HUPLQDWH
8GRJDDMSURFHGXUH,QLWLDOL]HL7HUPLQDWHWLSNDWHPRN{GNRMLQHPDXORJXX
procesu programa. To je samo obavijest programeru u prozoru Immediate, iz koje
H]QDWLGDSURJUDPUDGL.DGDQDSUDYLWHL]YUQXGDWRWHNX(;(RYDMN{G'HEXJ
HELWLDXWRPDWVNLLVNOMXHQ
4. Nastavljamo raditi na class modulu Narudzba.
5. 7LSNDMWHVOMHGHLN{GXGRJDDMSURFHGXUX,QLWLDOL]H
Private Sub Class_Initialize()
Debug.Print "Objekt je rodjen."
91

End Sub
6. 7LSNDMWHVOMHGHLN{GXGRJDDMSURFHGXUX7HUPLQDWH
Private Sub Class_Terminate()
Debug.Print "Objekt je umro."
End Sub
7. Pohranite Ivamar.
Kodiranje metoda class modula Narudzba
Metoda Add:

1. Nastavljamo raditi na class modulu Narudzba.


2. 7LSNDMWHVOMHGHLN{GXVHNFLMX*HQHUDO'HFODUDWLRQV
Public Sub Add(ByVal strKnjigaNaslov As String, _
ByVal strKnjigaFormat As String, ByVal intKnjigaKom _
As Integer)
Dim objKnjiga As New Knjiga
objKnjiga.Naslov = strKnjigaNaslov
objKnjiga.Format = strKnjigaFormat
objKnjiga.Kolicina = intKnjigaKom
m_colNarudzba.Add objKnjiga, strKnjigaNaslov &
strKnjigaFormat
If strKnjigaFormat = "Courseware" Or strKnjigaFormat =
_
"CD-ROM" Or strKnjigaFormat = "Papir" Then
m_intPopust = m_intPopust + 1
End If
Set objKnjiga = Nothing
92

End Sub
Analiza
Pogledajmo najprije zaglavlje Add procedure:
Public Sub Add(ByVal strKnjigaNaslov As String, _
ByVal strKnjigaFormat As String, ByVal intKnjigaKom _
As Integer)
Metoda Add pripada objektu Narudzba. Ta metoda "instantiate" ili inicijalizira ili
stvara objekte Knjiga, stvara referencije prema objektima Knjiga i te referencije
pohranjuje u Item-e kolekcije Narudzba. Zato metoda Add treba informacije o
REMHNWXNRMLLQLFLMDOL]LUD7HHLQIRUPDFLMHGRELWLSUHNRWULDUJXPHQWD
strKnjigaNaslov, strKnjigaFormat, intKnjigaKom.
Nazivi ovih argumenata su po vaoj volji i prvi se put pojavljuju u aplikaciji.
Nemate nikakvih obveza oko ovih naziva, kao to bi bilo, na primjer, prepisati
WRQHQD]LYHVYRMVWDYDREMHNWD.QMLJDLVO2YRVXDUJXPHQWLNRMHVPRXJUDGLOLX
metodu Add, a koji pripadaju samo toj metodi ( metoda je vlasnitvo objekta
Narudzba).
Slijedi deklaracija varijable objekta:
Dim objKnjiga As New Knjiga
9DULMDEODREM.QMLJDHELWLSRND]LYDLOLSRLQWHULUHIHUHQFLMDQDREMHNW.QMLJDX
prijelaznom vremenu koje traje dok ta referencija ne postane jedan Item objekta
Narudzba.
8VOMHGHDWULUHWNDN{GDSUHQRVLPRYULMHGQRVWLVYRMVWYDREMHNWD.QMLJD 1DVORY
Format, Kolicina) na argumente metode Add:
objKnjiga.Naslov = strKnjigaNaslov
objKnjiga.Format = strKnjigaFormat
objKnjiga.Kolicina = intKnjigaKom
Slijedi redak kda u kojem se kreira jedan Item objekta kolekcije Narudzba:
m_colNarudzba.Add objKnjiga, strKnjigaNaslov &
strKnjigaFormat
Iz gornjega retka proizlazi da je Item: = objKnjiga, a da je Key: = strKnjigaNaslov
VWU.QMLJD)RUPDW.H\MHDUJXPHQWNROHNFLMHSRPRXNRMHJDPRHPR
MHGQR]QDQRGRKYDWLWLVYDNRJODQDNROHNFLMH3UHPDJRUQMRMNRQVWUXNFLML
93


]EUDMDQMD
DUJXPHQDWDVWU.QMLJD1DVORY VWU.QMLJD)RUPDWSURL]OD]HVOMHGHL
NOMXHYL.H\-DYD6FULSW&'520-DYD6FULSW3DSLULWG
$VDGDPRUDPRGHILQLUDWLWRXSRVORYDQMXWUJRYLQH]QDLNRPSOHWQDNRMLVH
daje popust:
If strKnjigaFormat = "Courseware" Or strKnjigaFormat =
_
"CD-ROM" Or strKnjigaFormat = "Papir" Then
U ovom kdu provjeravamo da li je kreiran ijedan objekt Knjiga kojeg je vlasnik
WUJRYLQHXNOMXLRXNRPSOHW
$NRMHNUHLUDQELORNRMLREMHNWL]NRPSOHWDLOLSDNVYLL]YULWHVHRYDMN{G
m_intPopust = m_intPopust + 1
End If
9DULMDEODPBLQW3RSXVWHVHSRYHDWL]D%XGXLGDMHQMHQDSRHWQD
YULMHGQRVWSRGHIDXOWXSULVXVWYRREMHNWDL]NRPSOHWDELWHMDYOMHQRRVWDOLP
GLMHORYLPDSURJUDPDSRYHDQMHPYDULMDEOHPBLQW3RSXVW]D
9DULMDEODPBLQW3RSXVWLYLRQROLNRNROLNRLSURFHGXUDWMFODVVPRGXO7D
YDULMDEODMH3ULYDWHWR]QDLXSUDYRWR$NRNRULVQLNRGDEHUHVYDWULIRUPDWD
NQMLJHNRMLXOD]HXNRPSOHWRYDSURFHGXUD$GGHVHSRQRYLWLWULSXWD]DVYDNL
REMHNWMHGDQSXWLYDULMDEODPBLQW3RSXVWHELWLMHGQDND
.DVQLMHNDGDXRYRPFODVVPRGXOXGRHGRUDXQDQMDXNXSQHFLMHQHYRGLWHPR
UDXQDRYULMHGQRVWLYDULMDEOHPBLQW3RSXVW$NRMRMMHYULMHGQRVWNXSDFH
dobiti popust.
%XGXLGDHXNXSQXFLMHQXL]UDXQDWLREMHNWNROHNFLMD1DUXG]EDXQXWDUVHEH
RWSDVWHYHLGLRVDGDQMHJN{GDXSURFHGXUL&OLFNNRQWUROHFPG,]UDFXQDMQD
glavnom obrascu.
.DGDHPHWRGD$GGELWLL]YUHQD"0HWRGD$GGHRGUDGLWLVYDNLSXWNDGD
kupac odabere Format knjige (check box na frmGlavniObrazac) i svaki put kada
odabere naslov knjige u list box (lstKnjige.Text). Argument 'Key' u kolekciji se ne
PRHPLMHQMDWL0RHVHVDPRREULVDWLFLMHOL,WHPLRQGDGRGDWLQRYL,WHPVQRYLP
Key.
$NRMHNXSDFRGDEUDR9LVXDO%DVLF(OHDUQLQJ$GGPHWRGDHLQLFLMDOL]LUDWLQRYL
,WHPXNROHNFLMLLMLH.H\ELWL9LVXDO%DVLF(/HDUQLQJ8NROLNRVHNXSDFVDGD
SUHGRPLVOLLRGDEHUH-DYD6FULSWQHSRVWRMLPRJXQRVWSURPMHQHVDPRDUJXPHQWD
.H\X-DYD6FULSW(OHDUQLQJQHJRVHPRUDREULVDWLFLMHOLODQNROHNFLMHLGRGDWL
QRYLODQLMLMH.H\-DYD6FULSW(OHDUQLQJ
94

,VWRVHGRJDDLNDGDNXSDFRGDEHUH9LVXDO%DVLFL(OHDUQLQJSDSURPLMHQL
PLOMHQMHLRGDEHUH3DSLU2EULVDWHVHFLMHOLODQNROHNFLMHLNUHLUDWLQRYLODQ
,WHP VQRYLPNOMXHP.H\
Kreiranje metode Item class modula Narudzba
1. Nastavljamo raditi na class modulu Narudzba.
2. .UHLUDMWHPHWRGX,WHPWLSNDMWHVOMHGHLN{GXFODVVPRGXO1DUXG]ED
Public Function Item(ByVal strKnjigaNaslov As String, _
strKnjigaFormat As String) As Knjiga
Set Item = m_colNarudzba.Item(strKnjigaNaslov &
strKnjigaFormat)
End Function
3. Pohranite Ivamar.
Analiza

0HWRGD,WHPWUHEDGYDDUJXPHQWD1DVORYL)RUPDW]DSURQDODHQMHRGUHHQRJ
ODQDNROHNFLMH=EURMHQLWLDUJXPHQWLSUHGVWDYOMDMXMHGLQVWYHQLNOMX.H\
argument kolekcije.
Kreiranje metode Remove class modula Narudzbenica
1. Nastavljamo kodirati class modul Narudzbenica.
2. Tipkajte ovaj kd u class modul Narudzbenica:
Public Sub Remove(ByVal strKnjigaNaslov As String, _
ByVal strKnjigaFormat As String)
m_colNarudzba.Remove strKnjigaNaslov & strKnjigaFormat
If strKnjigaFormat = "Courseware" Or strKnjigaFormat =
_
"CD-ROM" Or strKnjigaFormat = "Papir" Then
m_intPopust = m_intPopust - 1
End If
95

End Sub
3. Pohranite Ivamar.
Analiza

0HWRGD5HPRYHHELWLL]YUHQDNDGDJRGVHNRULVQLNSUHGRPLVOLLLVNOMXLFKHFN
ER[)RUPDWNQMLJHNRMHJMHELRXNOMXLRLNDGDJRGSURPLMHQLQDVORYNQMLJHXOLVW
box.
3RWRVXODQRYLNROHNFLMHMHGQR]QDQRLGHQWLILFLUDQLVDUJXPHQWRP.H\NRMLVH
ovdje sastoji od Naslov i Format, u zaglavlju metode smo naveli dva argumenta
koja se odnose na Naslov i Format.
Slijedi naredba Remove.
Tu je i kd istovjetan onome u proceduri Add, If...Then, samo to se sada od
varijable m_intPopust oduzima broj 1.
Kreiranje metode Count class modula Narudzba
1. Nastavljamo kodirati class modul Narudzbenica.
2. Tipkajte ovaj kd u class modul Narudzbenica:
Public Function Count() As Long
Count = m_colNarudzba.Count
End Function
3. Pohranite Ivamar.
Analiza

0MHVWRXSURJUDPXNRMHSR]RYHRYXPHWRGX&RXQWGRELWH]EURMODQRYD
kolekcije m_colNarudzba.
Kreiranje metode NewEnum class modula Narudzbe
1. Nastavljamo raditi na class modulu Narudzba.
2. 8FODVVPRGXO1DUXG]EDGRGDMWHVOMHGHLN{G
Public Function NewEnum() As IUnknown

96

Set NewEnum = m_colNarudzba.[_NewEnum]


End Function
3. Odaberite Tools/Procedure Attributes/Advanced i promijenite Procedure
,'X

WHXNOMXLWH+LGHWKLVPHPHEHU

4. Pohranite Ivamar.
Analiza

0HWRGD1HZ(QXPRPRJXDYDQDPNRQVWUXNFLMXSHWOMH)RU(DFK1H[WQDG
svakom kolekcijom, pa tako i naom m_colNarudzba. Radi one crtice 'Shift+-'...
Set NewEnum = m_colNarudzba.[_NewEnum]
LVSUHGULMHLB1HZ(QXPSRWUHEQRMHVWDYLWLNXWQH]DJUDGH3RVWDYNH

L
+LGH
WKLVPHPEHU
VXSRYH]DQHVDVXHOMHPL]DQDHSRWUHEHPRUDMXELWLWDNR
postavljene. Detaljnije objanjenje prelazi okvire ove knjige.

97

Kreiranje metode Ukupno class modula Narudzba


1. Nastavljamo kodirati class modul Narudzba.
2. Tipkajte ovaj kd u class modul Narudzba:
Public Function Ukupno(strNaslov As String, _
intKolicina As Integer)
Dim objUkupno As Knjiga
Dim curElearningCijena As Currency
If m_colNarudzba.Count = 0 Then
Ukupno = 0
Exit Function
End If
For Each objUkupno In m_colNarudzba
Ukupno = Ukupno + (objUkupno.Cijena *
objUkupno.Kolicina)
If objUkupno.Format = "Elearning" Then
curElearningCijena = objUkupno.Cijena
End If
Next
If m_intPopust = 3 Then
MsgBox "U cijenu je ukljucen popust za komplet"
Set objUkupno = New Knjiga
objUkupno.Format = "Komplet"
objUkupno.Naslov = strNaslov
Ukupno = (objUkupno.Cijena * intKolicina) + _
curElearningCijena
End If

98

Set objUkupno = Nothing


End Function
3. Pohranite Ivamar.
Analiza

3RQLPRRG]DJODYOMDIXQNFLMH
Public Function Ukupno(strNaslov As String, _
intKolicina As Integer)
'DELVHL]UDXQDODXNXSQDFLMHQDSRWUHEQDVXGYDDUJXPHQWD-HGDQDUJXPHQWMH
]DGXHQQDWRMHNXSOMHQRDGUXJLDUJXPHQWQDNROLNRMHWRJDNXSOMHQR
Slijedi kd u kojemu deklariramo prvu objekt varijablu:
Dim objUkupno As Knjiga
Objekt varijabla objUkupno nam treba za prolaz kroz petlju For...Each u kolekciji
m_colNarudzba.
6OMHGHDYDULMDEOD
Dim curElearningCijena As Currency
... nam treba radi poslovne politike trgovca. Kada kupac odabere sva 4 formata
QHNHNQMLJHLXNOMXLRSFLMXNRPFLMHQDVYDNRJIRUPDWDHELWLSRPQRHQDV
RVLPIRUPDWD(OHDUQLQJ6YDNLNXSDFPRHNXSLWLIRUPDWHNQMLJHSRGYD
komada, osim formata E-learning. Taj se format uvijek prodaje samo jedan komad
jednom kupcu.
U kdu koji slijedi provjeravamo koliko objekata Knjiga ima u kolekciji
Narudzba:
If m_colNarudzba.Count = 0 Then
Ukupno = 0
Exit Function
End If
$NRMHPHWRGD&RXQW ]QDLGDNXSDFQLMHQLWDRGDEUDRLXNXSQDMHFLMHQD
nula. Program ne treba dalje prolaziti preostale retke funkcije nego napustiti
funkciju, i zato je kodirana naredba Exit Function.
6OMHGHLN{G
For Each objUkupno In m_colNarudzba
99

Ukupno = Ukupno + (objUkupno.Cijena *


objUkupno.Kolicina)
If objUkupno.Format = Elearning Then
curElearningCijena = objUkupno.Cijena
End If
Next
RGUDDYDSRVORYQXSROLWLNXWUJRYFD3RPRXSHWOMH)RU(DFKSURJUDPSUROD]L
sve objekte Knjiga unutar kolekcije Narudzba. Jednom kada identificira objekt
.QMLJDX]LPDVYRMVWYR&LMHQDWRJDREMHNWDLPQRLJDVDVYRMVWYRP.ROLFLQDLVWRJ
REMHNWD7DMXPQRDNGRGDMHEURMXNRMLMHSUHWKRGLRDNRMLVHDNXPXOLUDXREMHNW
varijabli Ukupno:
Ukupno = Ukupno + (objUkupno.Cijena *
objUkupno.Kolicina)
To pravilo Cijena*Kolicina vrijedi za sve objekte Knjiga unutar kolekcije, osim za
REMHNWHNRMLXVYRPNOMXXLPDMX(OHDUQLQJ=DWRMHSRWUHEQDMRMHGQDVWUXNWXUD
,I7KHQNRMDHL]GYRMLWLL]QLPNXXNROLNRLVWDSRVWRMLXNROHNFLML
If objUkupno.Format = Elearning Then
...i toj iznimci 'ubrati' cijenu za jedan komad (objUkupno.Cijena) i dodijeliti tu
cijenu varijabli curElearningCijena:
curElearningCijena = objUkupno.Cijena
1DNRQWRMHSHWOMD)RU(DFKRGUDGLODRQROLNRSXWDNROLNRMHELORODQRYD
kolekcije, u 'Ukupno' imamo ukupnu cijenu jedne kupovine.
1DNUDMXMRPRUDPRSURYMHULWLMHOLNXSDFRGDEUDRVYHIRUPDWHNRMLLQH
komplet...
If m_intPopust = 3 Then
Ako jest, slijedi poruka...
MsgBox "U cijenu je ukljucen popust za komplet"
...pa kreiranje nove instancije objekta Knjiga...
Set objUkupno = New Knjiga
=DWRNUHLUDPRQRYLREMHNW.QMLJD"'RVDGDVPRWRUMHDYDOLLWDQMHPFLMHQH
NRPSOHWDL]GRNXPHQWD&MHQLNW[W7RXYLMHNPRHPRDOLVDGDQLMHSRWUHEQRQD
WDMQDLQ1DLPHXSRSLVX&MHQLNW[WSRVWRMHLUHGFLXNRMLPDMHQDYHGHQDFLMHQD
kompleta formata pojedinog naslova ("Komplet"):

100

&ODVVPRGXO.QMLJDMHYHXLWDRFMHQLNW[WSDXVHELLPDLUHWNH.RPSOHW=DWR
HPRVYRMVWYR)RUPDWQRYRJREMHNWDREM8NXSQRL]MHGQDLWLV.RPSOHW
objUkupno.Format = "Komplet"
DVYRMVWYR1DVORYHPRL]MHGQDLWLVDUJXPHQWRPVWU1DVORY
objUkupno.Naslov = strNaslov
.DGDLPDPRFLMHQXNRPSOHWDSRWUHEQRMXMHSRPQRLWHVNROLLQRPLWRP
umnoku dodati cijenu 'iznimke' curElearning...
Ukupno = (objUkupno.Cijena * intKolicina) + _
curElearningCijena
End If
,QDNUDMXMRVDPRQDUHGED]DRVOREDDQMHPSURVWRUDXPHPRULML EULVDQMHREMHNW
varijable):
Set objUkupno = Nothing
Objekt kolekcija Narudzba je napravljen. Sada ga jo moramo ugraditi u nau
aplikaciju Ivamar.
Promijenimo kd u sekciji General Declarations forme
frmGlavniObrazac
1. Otvorite frmGlavniObrazac u prozoru Code.

101

2. ,]PLMHQLWHN{GX*HQHUDO'HFODUDWLRQVVXNODGQRRVMHQHQLPUHGFLPD'YD
RVMHQHQDUHWNDVX]DPLMHQLODHWLULYDULMDEOH3ULYDWH
Option Explicit
Public Kom As Integer
Private m_lngBojaPozadine As Long
Private m_blnPrikazDatuma As Boolean
Private m_colCijenaFormata As New Collection
Private m_objNarudzba As New Narudzba
Private m_strStariNaslov As String
3. Pohranite Ivamar.
Analiza

Deklaracija objekt varijable kolekcije Narudzba je zamijenila dosadanje


SRMHGLQDQHGHNODUDFLMHREMHNDWD.QMLJD
Private m_objNarudzba As New Narudzba
8YRHQMHYDULMDEOHPBVWU6WDUL1DVORY
Private m_strStariNaslov As String
MHSRWUHEQRL]VOMHGHLKUD]ORJD.DGDNXSDFSURPLMHQLSUHWKRGQRRGDEUDQL
QDVORYNQMLJHXOLVWER[OVW.QMLJHSURJUDPH]QDWLQDNRMLMHQRYLQDVORYNXSDF
SULWLVQXRWLSNXPLD7DGDSURJUDPPRUDREULVDWLVYHSRVWRMHHODQRYHNROHNFLMH
1DUXG]EDLNUHLUDWLQRYH0HXWLPSURJUDPQH]QDWRMHNXSDFRGDEUDRSULMH
QHJRMHSURPLMHQLRPLOMHQMH8]SRPRRYHYDULMDEOHWRHXEXGXH]QDWL
0HWRGL5HPRYHHPRSULGRGDWLNDRDUJXPHQWYULMHGQRVWRYHYDULMDEOHLEULVDQMH
VWDULKREMHNDWD.QMLJDXNROHNFLML1DUXG]EDHELWLPRJXH
Promjene u proceduri Click kontrola check box chkFormatKnjige
1. Nastavljamo raditi na promjeni kda forme GlavniObrazac.
2. 3URPLMHQLWHVOMHGHHXN{GXSURFHGXUHFKN)RUPDW.QMLJHB&OLFN
Private Sub chkFormatKnjige_Click(Index As Integer)
If chkFormatKnjige(Index).Value = 1 Then
m_objNarudzba.Add lstKnjige.Text,
chkFormatKnjige(Index).Caption, _
102

frmGlavniObrazac.Kom
Else
m_objNarudzba.Remove lstKnjige.Text,
chkFormatKnjige(Index).Caption
End If
End Sub
3. Pohranite Ivamar.
Analiza

2YXSURFHGXUXSRNUHHYULMHGQRVWVYRMVWYD9DOXHMHGQHRGNRQWURODFKHFN
box. Ako kupac pritisne tipku mia na check box, metoda Add doda jedan objekt
.QMLJDXNROHNFLMX1DUXG]ED.RMLHWRRELMHNWELWLRYLVLRYULMHGQRVWLPDNRMHH
SULMHLSUHNRDUJXPHQDWD6YRMVWYR1DVORYEXGXHJREMHNWDMHGQDNRMHYULMHGQRVWL
VYRMVWYD7H[WNRQWUROHOVW.QMLJH6YRMVWYR)RUPDWEXGXHJREMHNWD.QMLJD
jednako je svojstvu Caption kontrole check box na koju je kupac pritisnuo tipku
PLD6YRMVWYR.ROLFLQDEXGXHJREMHNWD.QMLJDMHGQDNRMHVYRMVWYX.RPIRUPH
IUP*ODYQL2EUD]DF7ULDUJXPHQWDPHWRGH$GGHWDNRSUHQLMHWLREMHNWLPD.QMLJD
RGJRYDUDMXHYULMHGQRVWL]DQMLKRYDVYRMVWYD1DVORY)RUPDW.ROLFLQD0HWRGD
$GGNROHNFLMH1DUXG]EDHNUHLUDWLREMHNWH.QMLJDSULYUHPHQHREMHNWYDULMDEOH
koje pokazuju na objekte Knjiga, zatim kreirati Item-e koji pokazuju na objekte
.QMLJDLQDNRQWRJDREULVDWLSULYUHPHQHREMHNWYDULMDEOHNDRQHSRWUHEQHEXGXL
GDVX,WHPLSUHX]HOLQMLKRYXXORJXSRND]LYDDQDREMHNWH.QMLJD
If chkFormatKnjige(Index).Value = 1 Then
m_objNarudzba.Add lstKnjige.Text,
chkFormatKnjige(Index).Caption, _
frmGlavniObrazac.Kom
$NRVHNXSDFSUHGRPLVOLLLVNOMXLQHNXNRQWUROXFKHFNER[QDVWXSDPHWRGD
Remove...
Else
m_objNarudzba.Remove lstKnjige.Text,
chkFormatKnjige(Index).Caption
End If
NRMDHSRPRXNOMXD.H\SURQDL,WHPNRMLWUHEDREULVDWL$]DNOMX.H\MH
potrebno preko argumenata dobiti naslov knjige (lstKnjige.Text) i naziv formata
(chkFormatKnjige(Index).Caption).
103

Promjene kda u proceduri Click kontrole lstKnjige


1. Nastavljamo kdirati frmGlavniObrazac.
2. Promijenite proceduru lstKnjige_Click:
Private Sub lstKnjige_Click()
If lstKnjige.ListIndex = -1 Then Exit Sub
If App.Path = "\" Then
imgKnjige.Picture = LoadPicture(App.Path &
lstKnjige.Text & ".jpg")
Else
imgKnjige.Picture = LoadPicture(App.Path & "\"
& lstKnjige.Text & ".jpg")
End If
Dim chkObjekt As CheckBox
For Each chkObjekt In chkFormatKnjige
If chkObjekt.Value = 1 Then
m_objNarudzba.Remove m_strStariNaslov,
chkObjekt.Caption
m_objNarudzba.Add lstKnjige.Text,
chkObjekt.Caption, _
frmGlavniObrazac.Kom
End If
Next
m_strStariNaslov = lstKnjige.Text
End Sub
3. Pohranite Ivamar.
104

Analiza

Kada kupac pritisne tipku mia na neki naslov u kontroli lstKnjige, programu je to
nalog za stvaranje novih objekata u kolekciji Narudzba. Ali prije nego to stvori
QRYHREMHNWHSURJUDPHSURYMHULWLGDOLXNROHNFLMLYHSRVWRMHREMHNWL7R
provjerava preko vrijednosti svojstva Value svakog od kontrola check box:
If chkObjekt.Value = 1 Then
$NRMHWDYULMHGQRVWMHGQDND]QDLGDSRVWRMLREMHNWLMLMH.H\SRYH]DQVD
starim naslovom knjige i svojstvom Caption kontrole check box, i da taj objekt
treba ukloniti (Remove) iz kolekcije:
m_objNarudzba.Remove m_strStariNaslov,
chkObjekt.Caption
Nakon to je stari objekt Knjiga uklonjen iz kolekcije, u kolekciju Narudzba treba
GRGDWLQRYLREMHNWLMLH.H\ELWLSRYH]DQVDVYRMVWYRP7H[WNRQWUROHOVW.QMLJHL
VYRMVWYRP&DSWLRQLVWHRQHNRQWUROHFKHFNER[LMHMHVYRMVWYR9DOXHMHGQDNR
m_objNarudzba.Add lstKnjige.Text,
chkObjekt.Caption, _
frmGlavniObrazac.Kom
End If
Next
Nakon to je gornja petlja prola kroz sve kontrole check box na formi, obrisala
stare Item-e u kolekciji i kreirala nove Item-e, slijedi redak...
m_strStariNaslov = lstKnjige.Text
XNRMHPHSURJUDPYULMHGQRVWVYRMVWYD7H[WNRQWUROHOVW.QMLJHSRKUDQLWLX
YDULMDEOXPBVWU6WDUL1DVORYLYRWQLYLMHNRYHYDULMDEOHMHNROLNRLFLMHOHIRUPH
GlavniObrazac.
Promjene u proceduri Click kontrole optKom
1. Nastavljamo kdirati frmGlavniObrazac.
2. Promijenite proceduru optKom_Click:
Private Sub optKom_Click(Index As Integer)
frmGlavniObrazac.Kom = Index
Dim chkObjekt As CheckBox
For Each chkObjekt In chkFormatKnjige
105

If chkObjekt.Value = 1 Then
m_objNarudzba.Item(lstKnjige.Text,
chkObjekt.Caption).Kolicina _
= frmGlavniObrazac.Kom
End If
Next
End Sub
3. Pohranite Ivamar.
Analiza

2YGMHVPRSRPRXPHWRGH,WHPNROHNFLMH1DUXG]EDSURPLMHQLOLVYRMVWYR
.ROLFLQDREMHNWD.QMLJDSRVWRMHHJODQDNROHNFLMH=DWRVYRMVWYR.ROLFLQD
SRVWRMHLPODQRYLPDNROHNFLMHPRHPRSURPLMHQLWLQDRYDMQDLQEH]EULVDQMDL
SRQRYQHNUHDFLMHFLMHORJREMHNWDDWRQLVPRPRJOLXVOXDMXVYRMVWYD1DVORY"
Zato to je svojstvo Naslov objekta Knjiga dio argumenta Key, za razliku od
svojstva Kolicina, koje to nije.
Promjene u proceduri Form_QueryUnload
1. Nastavljamo kdirati frmGlavniObrazac.
2. Promijenite proceduru Form_QueryUnload:
Private Sub Form_QueryUnload(Cancel As Integer,
UnloadMode As Integer)
Set m_objNarudzba = Nothing
End Sub
3. Pohranite Ivamar.
Analiza

8PMHVWRHWLULUHWNDSRVHEQR]DVYDNLREMHNW.QMLJDVDGDLPDPRVDPRMHGDQ
redak kda...
Set m_objNarudzba = Nothing
SRPRXNRMHJDXNODQMDPRVYHREMHNWH.QMLJDXNROHNFLML1DUXG]EDXWUHQXWNX
kada se glavni obrazac zatvara.

106

Promjene u proceduri cmdPonisti_Click


1. Nastavljamo kodirati frmGlavniObrazac.
2. Promijenite kd kao ovdje:
Private Sub cmdPonisti_Click()
Dim chkObjekt As CheckBox
Dim optObjekt As OptionButton

For Each chkObjekt In chkFormatKnjige


chkObjekt.Value = 0
Next
For Each optObjekt In optKom
optObjekt.Value = False
Next
chkOdabiremSveFormate.Value = 0
lblCijena.Visible = False
imgKnjige.Picture = LoadPicture()
lstKnjige.ListIndex = -1
m_strStariNaslov = ""
End Sub
3. Pohranite Ivamar.
Analiza

Ovdje smo samo


lstKnjige.ListIndex = -1
...prenijeli na kraj procedure i dodali jo jedan redak
107

m_strStariNaslov = ""
...za ponitenje varijable m_strStariNaslov.
Zato je potrebna ta promjena pozicije retka kda: lstKnjige.ListIndex = -1?
Taj redak kda ponitava odabir naslova u kontroli lstKnjige. Ako je on na
SRHWNXSURFHGXUHNDRSULMHSRQLWLWHRGDELUQDVORYDLQHHVHPRLGRJRGLWL
metoda Remove u kolekciji Narudzba.
Procedura Click ovog gumba Ponisti stavlja vrijednosti svojstava Value kontrola
FKHFNER[QDQXOX7RMHRNLGD]DPHWRGX5HPRYHXSURFHGXUL&OLFNNRQWUROD
FKHFNER[0HWRGD5HPRYHVHPRHGRJRGLWLVDPRDNRGRELMHYDOMDQHYULMHGQRVWL
preko oba svoja argumenta. Jedna vrijednost jest i naslov knjige, i te vrijednosti ne
bi bilo kada bi kd koji ponitava tu vrijednost bio na vrhu procedure.
Promjene kda procedure Click kontrole cmdIzracunaj
1. Nastavljamo kodirati frmGlavniObrazac.
2. 8QHVLWHVOMHGHHSURPMHQH
Private Sub cmdIzracunaj_Click()
Dim curUkupno As Currency
'Da li je korisnik odabrao naslov knjige?
If lstKnjige.Text = "" Then
MsgBox "Morate odabrati naslov knjige"
Exit Sub
End If
'Da li je korisnik odabrao jedan ili vie formata
knjige?
If chkFormatKnjige(0).Value = 0 And _
chkFormatKnjige(1).Value = 0 And _
chkFormatKnjige(2).Value = 0 And _
chkFormatKnjige(3).Value = 0 Then
MsgBox "Morate odabrati jedan ili vie " & _
"formata knjige"
Exit Sub
108

End If
'Da li je korisnik odabrao kolicinu?
If optKom(1).Value = False And _
optKom(2).Value = False Then
MsgBox "Morate odabrati kolicinu"
Exit Sub
End If
'Kad korisnik odabere E-learning
'upozorimo ga da uvijek ide samo jedan
'bez obzira odabere li kupac jedan ili dva kompleta
'formata knjige
If chkFormatKnjige(1).Value = 1 And
frmGlavniObrazac.Kom > 1 Then
MsgBox "Kupovina je ogranicena na 1 e-learning po "
& _
"narudzbi." & vbCrLf & _
"Cijena je tome prilagodjena"
End If
'Sad imamo sve elemente za racunanje ukupnog iznosa
'Izracunajmo cijenu svakom formatu pojedine knjige
curUkupno = m_objNarudzba.Ukupno(lstKnjige.Text, _
frmGlavniObrazac.Kom)
'Ako je iznos veci od nula, prikazi cijenu i
'ucini label vidljivim
If curUkupno > 0 Then
lblCijena.Caption = "Ukupan iznos je " & _
Format(curUkupno, "###,###.00")
lblCijena.Visible = True
End If
109

End Sub
3. Pohranite Ivamar. Pokrenite Ivamar. Ukoliko sve radi kao i ranije, uspjeli
ste ispisati novi kd bez greke. Program/Izlaz, zaporka: 1, 2, 3, 4.
Analiza
3URFHGXUDVHGRVWDVPDQMLODDOLWRMHSXQRYDQLMHSRMHGQRVWDYLODGRNUDMQRVWL
1LMHSRWUHEQRUDXQDWLFLMHQXNDRSULMHQLMHSRWUHEDQN{G]DSUHPRWDYDQMH
greaka. Dovoljna je jedna varijabla...
Dim curUkupno As Currency
LN{GXNRMHPXWRMYDULMDEOLSULGUXXMHPRYULMHGQRVWNRMXHL]EDFLWLPHWRGD
Ukupno class modula Narudzba...
curUkupno = m_objNarudzba.Ukupno(lstKnjige.Text, _
frmGlavniObrazac.Kom)
Funkcija 'Ukupno' ima dva argumenta. Ti argumenti joj moraju prenijeti
vrijednost svojstva Text kontrole lstKnjige (Naslov knjige) te vrijednost svojstva
Kom forme frmGlavniObrazac.
&LMHODORJLNDSURUDXQDFLMHQDMHXJUDHQDXREMHNWH.QMLJDL1DUXG]ED7DORJLND
]DWRYLHQLMHSRWUHEQDXSURFHGXULNRQWUROHFPG,]UDFXQDM1DWDMQDLQREMHNWL
SRVWDMXWRMHPRJXHYLHVDPRVWRMDQLQHRYLVQLRYDQMVNRPN{GXDVGUXJH
strane taj vanjski kd postaje krajnje jednostavan i nezahtjevan.

110

Lekcija 13
ActiveX
komponente
Ivamar Word
ActiveX komponente su class moduli kompajlirani i kao takvi stavljeni na
UDVSRODJDQMHNXSFX.XSDFQHPRHYLGMHWLN{GSDJDQHPRHQLPLMHQMDWL
$FWLYH;NRPSRQHQWHQDMHHQHPDMXVYRMHYLGOMLYRVXHOMHNDRWRVXIRUPH
6DGUHREMHNWHLYDQMVNRPVYLMHWXQXGHVYRMVWYDPHWRGHLGRJDDMHWLKREMHNDWD
$FWLYH;NRPSRQHQWHVOXH]DL]JUDGQMXGUXJLKDSOLNDFLMDLOL]DREDYOMDQMHQHNLK
funkcija.
8RYRMLVOMHGHRMOHNFLMLQDSUDYLWHPRVYRMH$FWLYH;NRPSRQHQWH3RPRX
$FWLYH;NRPSRQHQWHHPRWLVNDWLQDUXGEXL]DSOLNDFLMH,YDPDUX0LFURVRIW
:RUGXDRQGDHPRRGQDHJFODVVPRGXOD7H]LQDQDSUDYLWL$FWLYH;
komponentu i vidjeti kako ta ona radi s Excelom.
3RVWRMLHWLULWLSD$FWLYH;NRPSRQHQWL7RVX

ActiveX DLL

ActiveX EXE

ActiveX Document

ActiveX Controls

Predmet ove knjige su prve dvije: ActiveX DLL i ActiveX EXE. Obje se kreiraju
QDLGHQWLDQQDLQSDNDGQDSUDYLWHMHGQXLVWLPSRVWXSNRPPRHWHQDSUDYLWLL
GUXJX8HPXMHUD]OLNDL]PHXWLKGYLMX$FWLYH;NRPSRQHQWL"5D]OLNDMHX
VOMHGHHP

111

ActiveX DLL komponenta radi u istom memorijskom prostoru s


DSOLNDFLMRPNRMDMHVSRMHQDQDQMX7R]QDLXWHGXPHPRULMHDOLLVSRULML
rad ukupnog projekta.

ActiveX EXE komponenta radi u svom posebnom memorijskom prostoru.


:LQGRZVRNUXHQMHLPDVYRMVWYR
PXOWLWDVN
UDGDLOLYLH]DGDQRJrada. To
]QDLGDYLHDSOLNDFLMDPRHUDGLWLLVWRYUHPHQR7RMHSRVWLJQXWR
podjelom unutar memorije, gdje kd svake aplikacije ima svoju 'cestu' u
memoriji. Aplikacija koja je spojena na ActiveX komponentu ima tako
svoj 'put' u memoriji, a ActiveX EXE ima svoj 'put'. Rade istovremeno i
MHGQDGUXJXQHHNDMX3UHGQRVW$FWLYH;(;(NRMDL]RYRJDSURL]OD]LMHVW
EULUDGXNXSQRJSURMHNWD1HGRVWDWDNMHYLHX]LPDQMHRGPHPRULMH

2VWDOHRVRELQHVXLPMHGQDNHDRGQRVHVHQDPRJXQRVWRGDELUDUHLPDUDGDJGMH

-HGQDNRPSRQHQWDRSVOXXMHYLHDSOLNDFLMDLVWRYUHPHQR.ROLNRJRGVH
DSOLNDFLMDLVWRYUHPHQRRWYRULLSR]RYHNRPSRQHQWXXPHPRULMXHVH
XLWDWLVDPRMHGQDNRPSRQHQWD

-HGQDNRPSRQHQWDRSVOXXMHVDPRMHGQXDSOLNDFLMX.ROLNRJRGVH
DSOLNDFLMDLVWRYUHPHQRRWYRULLSR]RYHNRPSRQHQWXWROLNRHVHSXWDX
PHPRULMXXLWDWLLNRPSRQHQWD

Dodavanje referencije u Word Object Library


1. Otvorite Ivamar.
2. Odaberite Project/References.
3. 3URQDLWH0LFURVRIW:RUG2EMHFW/LEUDU\LXNOMXLWHFKHFNER[

112

4. OK. Referencija je dodana. Ukoliko je vaa verzija Office-a 9, 8 i sl., u


GLMDORJXHWHLPDWLEURMLVO
5. Pohranite Ivamar.
Promjene kda metode Ukupno u kolekciji Narudzba
1DDDSOLNDFLMD,YDPDUHNDRGRVDGDL]EDFLWLFLMHQXQDIRUPX$RQGDHPR
RGDEUDWLJXPE]DLVSLVFLMHOHQDUXGEHX:RUGX0HWRGD8NXSQRHVHWDNR
L]YHVWLGYDSXWD$NRMHNXSDFRGDEUDRNRPSOHWELWHGYDSXWDREDYLMHWHQ
GLMDORJRP]DSRUXNHRWRPHNDNRMHXFLMHQXXNOMXHQLSRSXVWQDNRPSOHW7R
HPRL]EMHLPDORPSUHLQDNRPXN{GXPHWRGH8NXSQR7DSUHLQDNDQHH
SRUHPHWLWLGRVDGDQMLUDGPHWRGH0HWRGLHPRGRGDWLMHGDQRSFLMVNLDUJXPHQW
1. Otvorite class modul Narudzba.
2. 1DSUDYLWHVOMHGHHSURPMHQHN{GD
Public Function Ukupno(strNaslov As String, _
intKolicina As Integer, _
Optional blnPoruka As Variant) As Currency
Dim objUkupno As Knjiga
113

Dim curElearningCijena As Currency


If IsMissing(blnPoruka) Then
blnPoruka = True
End If
If m_colNarudzba.Count = 0 Then
Ukupno = 0
Exit Function
End If
For Each objUkupno In m_colNarudzba
Ukupno = Ukupno + (objUkupno.Cijena *
objUkupno.Kolicina)
If objUkupno.Format = "Elearning" Then
curElearningCijena = objUkupno.Cijena
End If
Next
If m_intPopust = 3 Then
If blnPoruka = True Then
MsgBox "U cijenu je ukljucen popust za komplet"
End If
Set objUkupno = New Knjiga
objUkupno.Format = "Komplet"
objUkupno.Naslov = strNaslov
Ukupno = (objUkupno.Cijena * intKolicina) + _
curElearningCijena
End If
Set objUkupno = Nothing
114

End Function
3. Pohranite projekt Ivamar.
Analiza

Public Function Ukupno(strNaslov As String, _


intKolicina As Integer, _
Optional blnPoruka As Variant) As Currency
U zaglavlje metode Ukupno smo dodali jedan opcijski argument, blnPoruka.
Opcijski argument se uvijek pie kao zadnji u zagradi, nakon svih potrebnih
argumenata.
$UJXPHQWVPRLPHQRYDOLEOQ3RUXND,]RYRJ
EOQ
ELVHGDOR]DNOMXLWLNDNRMHWLS
argumenta Boolean, ali naa deklaracija navodi tip 'Variant'. Zato? Radi funkcije
IsMissing, koja radi samo ako je argument deklariran kao Variant.
Funkcija IsMissing ovdje provjerava je li opcijski argument preao u nau
proceduru. Ako nije, IsMissing je 'True', ako jest, IsMissing je 'False'.
8NROLNRSRUXNDQLMHSRVODQDNXSFXPLHOLPRGDMHSURFHGXUDSRDOMH=DWR
piemo ovaj kd:
If IsMissing(blnPoruka) Then
blnPoruka = True
End If
*RUQMLN{GQDUHXMHDNRMHLVWLQDGDSRUXNDQLMHSRVODQDWDGDSRVWDYLYULMHGQRVW
opcijskog argumenta blnPoruka na 'True'. Nae se namjere otkrivaju tek u ovom
kdu:
If m_intPopust = 3 Then
If blnPoruka = True Then
MsgBox "U cijenu je ukljucen popust za komplet"
End If
Najprije se provjerava je li kupac odabrao komplet. Ako jest, slijedi izvrenje
tijela strukture If...Then, a to je opet If struktura:
If blnPoruka = True Then
1DJRUQML,IRGJRYRUMHSR]LWLYDQLSRUXNDHELWLSRVODQD
MsgBox "U cijenu je ukljucen popust za komplet"
115

End If
Sve se ovo dogodilo nakon to je kupac pritisnuo kontrolu cmdIzracunaj. Najprije
se pojavila poruka, pa ukupna cijena na formi. Kada se ta ista metoda Ukupno
bude ponovo izvravala radi ispisa u Wordu, odgovor na ovaj kd...
If IsMissing(blnPoruka) Then
ELWHQHJDWLYDQLWLMHORVWUXNWXUH,IVHQHHL]YHVWL
blnPoruka = True
End If
SDDUJXPHQWEOQ3RUXNDQHHELWL
7UXH
LSRUXNDVHQHHSRQRYRL]YHVWL
Dodavanje svojstva Popust class modulu Narudzba
8WLVNDQRMHPRQDUXGELQDYHVWLLQIRUPDFLMXNDNRMHXFLMHQXXNOMXHQLSRSXVW
ako je kupac odabrao komplet. Zato je potrebno napraviti svojstvo Popust
kolekciji Narudzba, kako bi se taj podatak mogao koristiti u kdu izvan class
modula.
1. Otvoren je class modul Narudzba.
2. .UHLUDMWHVYRMVWYR3RSXVWFODVVPRGXOD1DUXG]EDSRPRXRYRJN{GD
Property Get Popust() As Boolean
If m_intPopust = 3 Then
Popust = True
Else
Popust = False
End If
End Property
3. Pohranite Ivamar.
Analiza
1LVPRPRUDOLGHNODULUDWLPRGXOYDULMDEOXPBLQW3RSXVWMHUMHLVWDYHGHNODULUDQDX
General Declarations.
1DMSULMHVPRGHNODULUDOLVYRMVWYR3RSXVWNDRWLSSRGDWDND%RROHDQWR]QDLGDH
YUDDWL7UXHLOL)DOVH
116

Property Get Popust() As Boolean


2YRVYRMVWYRQHHLPDWL/HWSURFHGXUXMHUMHUHDGRQO\6OLMHGLSURYMHUDGDOLMH
kupac odabrao komplet...
If m_intPopust = 3 Then
LDNRMHVWQDVYRMVWYRHSULMHLYULMHGQRVW7UXH
Popust = True
8VXSURWQRPHQDVYRMVWYRHSULMHLYULMHGQRVW)DOVH
Else
Popust = False
End If
End Property
6YHSRWUHEQHSURPMHQHXFODVVPHWRGL1DUXG]EDVPRXLQLOL6DGDVHPRHPR
posvetiti povezivanju naeg projekta s Wordom.
Ugradnja kontrole cmdKupujem na glavnu formu
1. Otvorite frmGlavniObrazac u prozoru Object.
2. Dodajte kontrolu command button, kao na slici dolje:

3. Name: cmdKupujem, Caption: Kupujem, Visible: False.


4. Pohranite Ivamar.
9LGOMLYRVWJXPED.XSXMHPXNOMXLWHPRXSURFHGXUXNRQWUROHFPG,]UDFXQDM
3URPMHQHXFPG,]UDFXQDMUDGLXNOMXHQMDYLGOMLYRVWLJXPED
cmdKupujem
1. Otvorite frmGlavniObrazac u prozoru Code.
117

2. Ubacite zasjenjeno u proceduri Click kontrole cmdIzracunaj:


'Ako je iznos veci od nula, prikazi cijenu i
'ucini label vidljivim
If curUkupno > 0 Then
lblCijena.Caption = "Ukupan iznos je " & _
Format(curUkupno, "###,###.00")
lblCijena.Visible = True
cmdKupujem.Visible = True
End If
3. Pohranite Ivamar.
U cmdPonisti sakrijmo gumb Kupujem
4. Otvorite frmGlavniObrazac u prozoru Code.
5. Ubacite zasjenjeno u proceduri Click kontrole cmdPonisti:
lstKnjige.ListIndex = -1
cmdKupujem.Visible = False
m_strStariNaslov = ""
End Sub
6. Pohranite Ivamar.
7LVNDQMHQDUXGEH
6DGDHPRQDSLVDWLSURFHGXUX&OLFNNRQWUROHFPG.XSXMHP8N{GXHPRNRULVWLWL
$FWLYH;NRPSRQHQWXNRMDSRVWRMLQDQDHPUDXQDOXDLQVWDOLUDQDMHNDGL
program Word.
1. Otvorena je forma GlavniObrazac u prozoru Code.
2. Tipkajte ovaj kd:
Private Sub cmdKupujem_Click()
Dim objKnjiga As Knjiga
118

Dim wdApp As Word.Application


Dim wdDoc As Word.Document
Dim strTiskam As String
Dim strBoja As Long
strTiskam = lblCijena.Caption
strBoja = lblCijena.BackColor
lblCijena.Caption = "Tiskam narudzbu..."
lblCijena.BackColor = vbRed
Set wdApp = New Word.Application
Set wdDoc = wdApp.Documents.Add
With wdApp
.Visible = True
.Selection.ParagraphFormat.TabStops.ClearAll
.ActiveDocument.DefaultTabStop = InchesToPoints(1)
.Selection.TypeText Text:="Ivamar"
.Selection.TypeParagraph
.Selection.InsertDateTime DateTimeFormat:="d. MMMM
yyyy", InsertAsField:= _
True, DateLanguage:=wdCroatian,
CalendarType:=wdCalendarWestern, _
InsertAsFullWidth:=False
.Selection.TypeText Text:="."
.Selection.TypeParagraph
.Selection.TypeParagraph
6HOHFWLRQ7\SH7H[W7H[W 1DUXGED
.Selection.TypeParagraph
.Selection.TypeParagraph
119

.Selection.TypeText Text:="Narucujem knjigu "


.Selection.Font.Bold = wdToggle
.Selection.TypeText Text:=lstKnjige.Text
.Selection.Font.Bold = wdToggle
.Selection.TypeText Text:=" u sljedecim formatima:"
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.Font.Bold = wdToggle
.Selection.TypeText Text:="Format"
.Selection.ParagraphFormat.TabStops.Add
Position:=CentimetersToPoints(3.39) _
, Alignment:=wdAlignTabLeft,
Leader:=wdTabLeaderSpaces
.Selection.TypeText Text:=vbTab & "Kom"
.Selection.ParagraphFormat.TabStops.Add
Position:=CentimetersToPoints(7.2), _
Alignment:=wdAlignTabLeft,
Leader:=wdTabLeaderSpaces
.Selection.TypeText Text:=vbTab & "Cijena"
.Selection.ParagraphFormat.TabStops.Add
Position:=CentimetersToPoints(11.64 _
), Alignment:=wdAlignTabLeft,
Leader:=wdTabLeaderSpaces
.Selection.TypeText Text:=vbTab & "Iznos"
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.Font.Bold = wdToggle
'Petlja za prolaze od objekta do objekta u
kolekciji Narudzba
For Each objKnjiga In m_objNarudzba

120

.Selection.TypeText Text:=objKnjiga.Format & vbTab


.Selection.TypeText Text:=Str(objKnjiga.Kolicina) &
vbTab
.Selection.TypeText Text:=Str(objKnjiga.Cijena) &
vbTab
.Selection.TypeText Text:=Str(objKnjiga.Cijena *
objKnjiga.Kolicina)
.Selection.TypeParagraph
Next
.Selection.TypeText Text:=String(100, "-")
.Selection.TypeParagraph
.Selection.TypeText Text:=vbTab & vbTab & vbTab & _
m_objNarudzba.Ukupno(lstKnjige.Text,
frmGlavniObrazac.Kom, False)
.Selection.TypeParagraph
If m_objNarudzba.Popust = True Then
.Selection.TypeText Text:="U cijenu je uracunat
popust " & _
"na kupovinu kompleta. Hvala to " & _
"ste kupovali kod nas."
End If
'Tiskanje narudzbe
.Application.PrintOut FileName:="",
Range:=wdPrintAllDocument, _
Item:=wdPrintDocumentContent, Copies:=1,
Pages:="", _
PageType:=wdPrintAllPages, Collate:=True, _
121

Background:=False, PrintToFile:=False
.ActiveWindow.Close savechanges:=False
End With
wdApp.Application.Quit
Set objKnjiga = Nothing
Set wdDoc = Nothing
Set wdApp = Nothing
lblCijena.Caption = strTiskam
lblCijena.BackColor = strBoja
End Sub
3. Pohranite Ivamar. Pokrenite Ivamar.
Napomena: U pisanju ovoga kda pomogao mi je Word i njegov Macro
5HFRUGHU2WYRULRVDP:RUGLXNOMXLR0DFUR5HFRUGHU 7RROV0DFUR5HFRUG
1HZ0DFUR 8VOMHGHHPNRUDNXPDFURXVDPGDRLPH
1DUXG]ED
LRGDEUDR2.
Tada sam napisao ovakav dokument:

122

=DXVWDYLRVDP0DFURSRPRXQDUHGEH7RROV0DFUR6WRS5HFRUGLQJ0DFUR
2GDEUDRVDPSRQRYRQDUHGEX7RROV0DFUR0DFURV2]QDLRPDFUR
1DUXG]ED
L
SULWLVQXRJXPE(GLW2WYRULRVHHGLWRU0LFURVRIW9LVXDO%DVLFLGHQWLQRJVXHOMD
NDRLVXHOMHQDHJDODWD9LVXDO%DVLF2YGMHMHULMHR9%$ 9LVXDO%DVLFIRU
$SSOLFDWLRQ D9%L9%$VHRGOLQRUD]XPLMX.RSLUDRVDPFLMHOLN{GSURFHGXUH
Sub Narudzba() u proceduru Click kontrole cmdKupujem. Tada sam utipkao
SURPMHQHNRMHVX]QDDMQHDOLQH]DKWLMHYDMXSXQRYUHPHQD
Analiza

Najprije sam deklarirao objekt varijablu...


Dim objKnjiga As Knjiga
SRPRXNRMHXNDVQLMHGRKYDWLWLVYHREMHNWHNROHNFLMH1DUXG]ED SHWOMRP)RU
(DFK 6OLMHGHREYH]QHGHNODUDFLMHREMHNWYDULMDEOLNRMHHSRND]LYDWLQDREMHNWH
u ActiveX komponenti Word.Application i Word.Document...
123

Dim wdApp As Word.Application


Dim wdDoc As Word.Document
3UHSRUXOMLYRMHLERMRPSULYXLSR]RUQRVWNRULVQLNDGRNJDREDYMHWDYDWHWRVH
GRJDD=DWRVOLMHGHGHNODUDFLMHGYLMXYDULMDEOLNRMHHQDPRPRJXLWLSRYUDWDNQD
SRHWQHERMHLQDWSLVH
Dim strTiskam As String
Dim strBoja As Long
=DGDMHPRSRHWQDVWDQMDWLKYDULMDEOL
strTiskam = lblCijena.Caption
strBoja = lblCijena.BackColor
L]HJDSURL]OD]LGDMHSRHWQDYULMHGQRVWYDULMDEOHVWU7LVNDPMHGQDNDVYRMVWYX
Caption kontrole lblCijena (prazno, nema ispisa u kontroli label), a varijable
VWU%RMDMHGQDNDVYRMVWYX%DFN&RORUNRQWUROHOEO&LMHQD2YDSRHWQDVWDQMDHPR
SRPRXYDULMDEOLQDNUDMXSURFHGXUHYUDWLWL
Slijedi kd kojim mijenjamo svojstva lblCijene...
lblCijena.Caption = "Tiskam narudzbu..."
lblCijena.BackColor = vbRed
SDN{GNRMLPXVSRVWDYOMDPRREMHNWNROHNFLMX:RUG$SSOLFDWLRQLSRPRX
PHWRGH$GGGRGDMHPRQRYLODQNROHNFLML'RFXPHQWV QRYLGRNXPHQWX:RUG
u).
Set wdApp = New Word.Application
Set wdDoc = wdApp.Documents.Add
Sada koristimo strukturu With...
With wdApp
...kako bismo izbjegli ispisivanje imena objekta wdApp.Documents u dot notaciji,
SULMHVYRMVWDYD,VSLVXMHPRVDPRWRNXLVYRMVWYD1DMSULMHVYRMVWYR9LVLEOH
stavljamo na vrijednost True kako bismo vidjeli cijeli proces otvaranja Worda,
dokumenta, ispis.
.Visible = True
Ponitavamo sve Tab stop...
.Selection.ParagraphFormat.TabStops.ClearAll
LXVSRVWDYOMDPRVWDQGDUGQH7DEVWRSRGMHGQRJLQD
.ActiveDocument.DefaultTabStop = InchesToPoints(1)
124

Slijedi ispis imena firme...


.Selection.TypeText Text:="Ivamar"
...pa Enter...
.Selection.TypeParagraph
...datum kao polje (u Wordu sam koristio Insert/Date and Time)...
.Selection.InsertDateTime DateTimeFormat:="d. MMMM
yyyy", InsertAsField:= _
True, DateLanguage:=wdCroatian,
CalendarType:=wdCalendarWestern, _
InsertAsFullWidth:=False
LWRNDQDNUDMXJRGLQH
.Selection.TypeText Text:="."
Ovaj je dio analogan do sada objanjenom...
.Selection.TypeParagraph
.Selection.TypeParagraph
6HOHFWLRQ7\SH7H[W7H[W 1DUXGED
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.TypeText Text:="Narucujem knjigu "
8NOMXXMHP
SUHNLGD
%ROG
.Selection.Font.Bold = wdToggle
.Selection.TypeText Text:=lstKnjige.Text
SDLVNOMXXMHP%ROG
.Selection.Font.Bold = wdToggle
Ovaj kd je objanjen...
.Selection.TypeText Text:=" u sljedecim formatima:"
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.Font.Bold = wdToggle
.Selection.TypeText Text:="Format"

125

.Selection.ParagraphFormat.TabStops.Add
Position:=CentimetersToPoints(3.39) _
, Alignment:=wdAlignTabLeft,
Leader:=wdTabLeaderSpaces
.Selection.TypeText Text:=vbTab & "Kom"
.Selection.ParagraphFormat.TabStops.Add
Position:=CentimetersToPoints(7.2), _
Alignment:=wdAlignTabLeft,
Leader:=wdTabLeaderSpaces
.Selection.TypeText Text:=vbTab & "Cijena"
.Selection.ParagraphFormat.TabStops.Add
Position:=CentimetersToPoints(11.64 _
), Alignment:=wdAlignTabLeft,
Leader:=wdTabLeaderSpaces
.Selection.TypeText Text:=vbTab & "Iznos"
.Selection.TypeParagraph
.Selection.TypeParagraph
.Selection.Font.Bold = wdToggle
'Petlja za prolaze od objekta do objekta u
kolekciji Narudzba
Slijedi petlja For Each nad objekt kolekcijom m_objNarudzba...
For Each objKnjiga In m_objNarudzba
%LWHLVSLVDQDVYRMVWYD)RUPDWVYDNRJREMHNWD.QMLJDXQXWDUNROHNFLMH1DUXG]ED
Prvi prolaz petlje upisuje svojstvo Format prvog objekta Knjiga, drugi prolaz
SHWOMHGUXJRJREMHNWD.QMLJDLWDNRUHGRP3HWOMDHSURLRQROLNRSXWDNROLNRLPD
objekata Knjiga u kolekciji m_objNarudzba. Isto vrijedi i za ispis ostalih svojstava
objekata Knjiga - Kolicina i Cijena...
.Selection.TypeText Text:=objKnjiga.Format & vbTab
.Selection.TypeText Text:=Str(objKnjiga.Kolicina) &
vbTab
.Selection.TypeText Text:=Str(objKnjiga.Cijena) &
vbTab
.Selection.TypeText Text:=Str(objKnjiga.Cijena *
objKnjiga.Kolicina)
126

.Selection.TypeParagraph
Next
Ispis 100 crtica...
.Selection.TypeText Text:=String(100, "-")
Enter...
.Selection.TypeParagraph
7UL7DEVWRSDLYULMHGQRVWNRMXHL]EDFLWLPHWRGD8NXSQR
.Selection.TypeText Text:=vbTab & vbTab & vbTab & _
m_objNarudzba.Ukupno(lstKnjige.Text,
frmGlavniObrazac.Kom, False)
Enter...
.Selection.TypeParagraph
Koristimo svojstvo Popust za If strukturu u kojoj provjeravamo je li kupac
ostvario uvjete...
If m_objNarudzba.Popust = True Then
Ako je ostvario, slijedi ispis u Word dokumentu...
.Selection.TypeText Text:="U cijenu je uracunat
popust " & _
"na kupovinu kompleta. Hvala to " & _
"ste kupovali kod nas."
End If
'Tiskanje narudzbe
6OLMHGLN{GQDUHGEDSLVDXNRMLMHSULMDYOMHQNDRWHNXLXYDHPUDXQDOX8NROLNR
ELVWHHOMHOLYLGMHWLGRNXPHQWDQHLWLVNDWLJDRYDMN{GVWDYLWHXNRPHQWDU
dodavanjem apostrofa ispred redaka.
.Application.PrintOut FileName:="",
Range:=wdPrintAllDocument, _
Item:=wdPrintDocumentContent, Copies:=1,
Pages:="", _
PageType:=wdPrintAllPages, Collate:=True, _
127

Background:=False, PrintToFile:=False
.ActiveWindow.Close savechanges:=False
Posao na dokumentu Worda je zavren. Slijedi kraj strukture With...
End With
Zatvaramo Word...
wdApp.Application.Quit
Ponitavamo objekt varijable...
Set objKnjiga = Nothing
Set wdDoc = Nothing
Set wdApp = Nothing
9UDDPRVYRMVWYDNRQWUROHODEHOOEO&LMHQDQDSRHWQDVWDQMD
lblCijena.Caption = strTiskam
lblCijena.BackColor = strBoja
End Sub

128

Lekcija 14
ActiveX
komponente
Ivamar - Excel
Pravljenje ActiveX komponente od naeg class modula Tezina
1. Otvorite Ivamar.
2. Otvorite class modul Tezina.
3. 8QHVLWHSURPMHQHXN{GXR]QDHQHVMHQRP
Private Sub Class_Initialize()
On Error GoTo Preskoci
Dim strNaslovKnjige As String
Dim intTezinaKnjige As Integer
If App.Path = "\" Then
Open App.Path & "Tezina.txt" For Input As #1
Else
Open App.Path & "\Tezina.txt" For Input As #1
End If
Do While Not EOF(1)
129

Input #1, strNaslovKnjige, intTezinaKnjige


m_colTezineKnjiga.Add Item:=intTezinaKnjige,
Key:=strNaslovKnjige
Loop
Close #1
Exit Sub
Preskoci:
Select Case Err.Number
Case 53
Err.Raise Number:=vbObjectError + 512 + 1, _
Description:="Nije pronadjen dokument
Tezina.txt"
Exit Sub
Case Else
Err.Raise Number:=vbObjectError + 512 + 2, _
Description:="Neocekivana greska na komponenti
Tezina"
Exit Sub
End Select
End Sub
4. Pohranite Ivamar.
Analiza

Novost je...
Err.Raise Number:=vbObjectError + 512 + 1, _
Description:="Nije pronadjen dokument
Tezina.txt"
8JUDHQLREMHNWErr ima metodu Raise7DHPHWRGDSULMDYLWLJUHNXSURJUDPX
koji koristi ActiveX komponentu. Na tom je programu dalje, tj. na njegovu
SURJUDPHUXWRHLQLWLVWRPJUHNRP9DQRMHGDSURJUDPHUPRHSULPLWL
poruku o greci unutar ActiveX komponente.
130

=DWRVPRL]PLVOLOLQHNLQDEURMJUHNHSD]HLGDVHWDMEURMQHSRNORSLVYH
SRVWRMHLPEURMHYLPDX9LVXDO%DVLFX.DGDELVHSRNORSLRSRUXNDQHELL]LODL]
komponente i aplikacija koja koristi komponentu bi pala.
8VNRURHPRYLGMHWLNDNRHVHVWRPJUHNRPQRVLWLQDN{GX([FHOX
Kreiranje projekta ActiveX.DLL
1. File/New Project.
2. Pritisnite dva puta tipku mia na ActiveX DLL.
3. View/Project Explorer.
4. Pritisnite desnu tipku mia na Class1.
5. 8VNUDHQRPL]ERUQLNXRGDEHULWH5HPRYHFODVV
6. No.
6DGDHPRGRGDWLFODVVPRGXO7H]LQDX$FWLYH;'//
7. 3URMHFW$GG&ODVV0RGXOH([LVWLQJSURQDLWHPRGXO7H]LQD

8. Pritisnite dva puta tipku mia na class modul Tezina i isti se kopirao u
ActiveX.DLL.
131

9. 2]QDLWHFODVVPRGXO7H]LQDX$FWLYH;'//SULWLVQLWH)GDVHRWYRUL
prozor Properties.
10. Promijenite svojstvo Instancing od Private u MultiUse.

11. Project/Project1 Properties. Umjesto imena Project1 tipkajte ime


IvamarTezina.

12. OK.
13. .RPSDMOLUDMWHYDXNRPSRQHQWXSRPRXQDUHGEH)LOH0DNH
IvamarTezina.dll.
132

14. Pohranite IvamarTezina.dll u mapu C:\Ivamar. OK.


15. Odaberite Save.
16. Pohranite projekt pod imenom TezinaDLL.vbp u mapu C:\Ivamar.

17. Save.
Analiza
1DSUDYLOLVPRNRPSRQHQWX$FWLYH;'//7RMHSXWNRMLXYLMHNPRHWHSRQRYLWL
0MHVWRSRKUDQMLYDQMDNRPSRQHQWH$FWLYH;'// NDRL$FWLYH;(;( QLMHYDQR
3RKUDQMXMHWHQDORNDOQRPGLVNXJGMHHOLWH8WUHQXWNXSRKUDQMLYDQMD:LQGRZV
5HJLVWU\H]DSLVDWLSXWGRYDHNRPSRQHQWH7DNRHVYHDSOLNDFLMHQDYDHP
UDXQDOXNRMHSRGUDYDMXWHKQRORJLMX$FWLYH;YLGMHWLX5HIHUHQFHVYDX
komponentu.
Iz toga proizlazi da ne smijemo mijenjati mjesto na kojem je komponenta
pohranjena.
A sada iskoristimo nau komponentu ActiveX.DLL, najprije u nekom novom
projektu, a onda i u Excelu.
Novi projekt STANDARD.EXE i komponenta IvamarTezina.DLL
1. Pokrenite novi projekt Standard.EXE i na formu dodajte kontrolu
command button.
133

2. Project/References i odaberite referencu IvamarTezina:

3. OK.
4. Pritisnite dva puta tipku mia na kontrolu command button i tipkajte ovaj
kd:
Private Sub Command1_Click()
Dim objTezina As New IvamarTezina.Tezina
objTezina.NaslovKnjige = "HTMLCDROM"
MsgBox "Tezina ovog formata knjige je " & _
objTezina.TezinaKnjige
Set objTezina = Nothing
End Sub
5. Pohranite projekt u mapu C:\Ivamar pod imenom Test komponente i
imenom forme Test komponente ActiveX.
6. Pokrenite projekt. Pritisnite Command1.
134

7. A sada promijenite ime datoteke Tezina.txt u Tezina1.txt.


8. Pokrenite projekt Test komponente.

2YRMHRHNLYDQDSRUXNDMHUREMHNWXNRPSRQHQWLQLMHSURQDDRSRWUHEQX
datoteku Tezina.txt.
9. Unesite 'error handler' u svoj projekt:
Private Sub Command1_Click()
On Error GoTo Preskoci
Dim objTezina As New IvamarTezina.Tezina
objTezina.NaslovKnjige = "HTMLCDROM"
MsgBox "Tezina ovog formata knjige je " & _
objTezina.TezinaKnjige
Set objTezina = Nothing
Exit Sub

135

Preskoci:
Select Case Err.Number
Case -2147220991 'Datoteka nije nadjena
MsgBox "Program Ivamar nije pronasao datoteku. " &
_
"Pohranite datoteku Tezina.txt u istu mapu " &
_
"u kojoj je i Ivamar."
Unload Me
Exit Sub
Case Else
MsgBox "Neocekivana greska. Kontaktirajte
dobavljaca."
Unload Me
Exit Sub
End Select
End Sub
10. Pohranite projekt Test komponente.
11. Pritisnite Command1.

12. OK.
Programer projekta Test komponente tako se nosi s grekama u naoj komponenti
ActiveX.DLL.
13. Ponovo promijenite naziv datoteke u originalni Tezina.txt.
Analiza

Kako programer zna da naa komponenta stvara greku "File Not Found"?
Case -2147220991 'Datoteka nije nadjena
136

Samo ako smo uz nau komponentu osigurali i dobru dokumentaciju s popisom


svih greaka koje se mogu javiti u komponenti.
Excel i naa komponenta ActiveX.DLL
1. Otvorite Excel.
2. Pohranite radnu knjigu kao Book1 u C:\Ivamar.
3. 2G$QDQLHLVSLLWHVYHNQMLJHRQDNRNDNRVXQDSLVDQHXGRNXPHQWX
Tezina.txt:

4. U Excelu odaberite Tools/Macro/Visual Basic Editor.


5. Odaberite Tools/References u Visual Basic Editoru.
137

6. 8NOMXLWHQDXNRPSRQHQWX$FWLYH;'//,YDPDU7H]LQD
7. OK.
8. Insert/Module u Visual Basic Editoru.
9. Tipkajte ovaj kd u modul Visual Basic Editor:
Sub Tezina()
Dim objTezina As New IvamarTezina.Tezina
Dim intBrojac As Integer
Range("A1").Select
ActiveCell.FormulaR1C1 = "Ivamar - tezine pojedinih
knjiga i formata"
Range("A1").Font.Bold = True
For intBrojac = 4 To 18
Range("A" & intBrojac).Select
objTezina.NaslovKnjige = ActiveCell.FormulaR1C1
Range("B" & intBrojac).Select
ActiveCell.FormulaR1C1 = objTezina.TezinaKnjige
Next intBrojac
Set objTezina = Nothing
End Sub
10. Zatvorite Visual Basic Editor i vratite se u Excel.
11. 2GDEHULWH7RROV0DFUR0DFURVR]QDLWHPDNUR7H]LQD5XQ
12. .RPSRQHQWD$FWLYH;'//,YDPDU7H]LQDMHL]EDFLODVYHWHLQHQD
SUHGYLHQRPMHVWRX([FHOX

138

Analiza

Najprije smo 'instancirali' objekt Tezina.


Dim objTezina As New IvamarTezina.Tezina
'HNODUDFLMDYDULMDEOH]DSUDHQMHEURMDUHGDNDXUDGQRPOLVWX([FHOD
Dim intBrojac As Integer
Zaglavlje naeg radnog lista:
Range("A1").Select
ActiveCell.FormulaR1C1 = "Ivamar - tezine pojedinih
knjiga i formata"
Range("A1").Font.Bold = True
139

Prvi redak petlje For... u kojem zadajemo granice varijable intBrojac...


For intBrojac = 4 To 18
VOLMHGLWLMHORSHWOMHXNRMHPVHXSUYRPNUXJXR]QDLVWDQLFD$
Range("A" & intBrojac).Select
SDVHSULGRGDMHYULMHGQRVW]DWHHQDX$VYRMVWYX1DVORY.QMLJHREMHNWD
objTezina...
objTezina.NaslovKnjige = ActiveCell.FormulaR1C1
Slijedi skok na B4...
Range("B" & intBrojac).Select
...i upisivanje vrijednosti svojstva TezinaKnjige...
ActiveCell.FormulaR1C1 = objTezina.TezinaKnjige
6OLMHGLQDUHGED]DGUXJLNUXJSHWOMHXNRMHPHELWLSRSXQMHQDVWDQLFD%LWG
Next intBrojac
Kada se zadani broj ciklusa petlje obavio, slijedi ponitavanje objekt varijable...
Set objTezina = Nothing
End Sub
Na kraju
7DNRVPRGROLGRNUDMDLWUHHNQMLJHR9LVXDO%DVLFX1DDDSOLNDFLMD,YDPDU
VDGDMHSRWSXQRREMHNWQRRULMHQWLUDQDDSOLNDFLMD1DXLOLVPRNUHLUDWLL$FWLYH;
NRPSRQHQWHLGLMHOLWLLKPHXDSOLNDFLMDPDQDQDHPUDXQDOX
Jo nismo gotovi s Visual Basicom. Sve tri knjige do sada su nam donijele
LVNXVWYRXVDPRVWRMQLPDSOLNDFLMDPDQDMHGQRPUDXQDOX3UHRVWDORQDPMHMR
YLGMHWLNDNRVH9LVXDO%DVLFDSOLNDFLMHXJUDXMXQDPUHXNRQNUHWQR,QWHUQHWL
QMHJRYXDUKLWHNWXUXNOLMHQWSRVOXLWHOM
6DGDNDGDVPRLVNRUDLOLXREMHNWQRRULMHQWLUDQRSURJUDPLUDQMHQDL]OD]DNQD
,QWHUQHWMHVDPRQDVWDYDNWRJLVWRJQDLQDUD]PLOMDQMD
9LVXDO%DVLFL,QWHUQHW
MH
WHPDPRMHHWYUWHNQMLJHR9LVXDO%DVLFX
0LOMHQMDVDPNDNRHVYHDSOLNDFLMHQDNUDMX]DYULWLQD,QWHUQHWX]DWRMHPRM
VDYMHWQH]DXVWDYOMDMWHVHQDRYRMNQML]LQHJRLVNRUDLWHLQD,QWHUQHW
Zato bi sve aplikacije zavrile na Internetu?
%%%&LGUXJHVNUDHQLFHYHVXGDQDVVPQRJRN{GDLVSXQLOHSRVOXLWHOMHL
klijente. Dvije firme (dva biznisa) danas u svijetu prebacuju svoju rutinsku
140

komunikaciju na aplikacije. Isto tako, svaka firma svoju rutinsku komunikaciju s


NXSFLPDWDNRHUSUHEDFXMHQDDSOLNDFLMH
Pada mi na um primjer firme koja daje knjigovodstvene usluge. Neka zapoljava
GHVHWDNNQMLJRYRDLSODDQDMDP]DSURVWRUXJUDGX$NRWDILUPDVWDYLVYRM
VRIWZDUHQD,QWHUQHWNQMLJRYRHSRVDRPRJXUDGLWLLL]VYRMHNXH.OLMHQWLH
WDNRHUVODWLGRNXPHQWHSUHNR,QWHUQHWDDPRGDVHLWDYH]DDXWRPDWL]LUDX
QHNLPIXQNFLMDPDLDSOLNDFLMHNOLMHQDWDVHSRYHXQD]DMHGQLNLVRIWZDUHQD
Internetu.

141

You might also like