V dneÜnφm dφlu si ukß₧eme n∞kterΘ Φasto pou₧φvanΘ p°φkazy z VB, nap°. FOR..NEXT
,
IF..THEN
atd. V dalÜφ kapitole se dozvφte, jak vytvß°et procedury a funkce ve VB,
co to jsou udßlosti a vlastnosti a jak je pou₧φvat.
V minulΘm dφlu jsme chybn∞ uvedli Φφsla kapitol. Tφmto se omlouvßme a pokud mßte zßjem, zkopφrujte si opravenou verzi.
6. Zßkladnφ p°φkazy
6.1. P°φkazy cyklu
6.2. V∞tvenφ programu
6.3. Dialogy
7. Procedury, funkce, udßlosti
7.1. Procedury a funkce
7.2. Vlastnosti
7.3. Udßlosti
V tΘto kapitole se vßs budeme sna₧it nauΦit nejb∞₧n∞ji pou₧φvanΘ p°φkazy ve VB. P∙jde o p°φkazy cyklu, tedy iteraΦnφ p°φkazy a o p°φkazy, kterΘ umo₧≥ujφ v∞tvenφ programu. TakΘ, aby bylo naÜe programovßnφ alespo≥ trochu spojeno s okny, vßm ukß₧eme dv∞ funkce pro pou₧itφ dialog∙.
Chcete-li vyzkouÜet p°φklady uvedenΘ v tΘto kapitole, vytvo°te nov² projekt, a vlo₧te k≤d p°φkladu do udßlosti Form_Load formulß°e Form1. Pokud si u₧ nevzpomφnßte jak na to, klikn∞te dvakrßt na Form1 a hned se Vßm otev°e k≤d tΘto udßlosti. P°φklad je potom proveden p°i startu aplikace. M∙₧ete takΘ na formulß° vlo₧it tlaΦφtko (CommandButton) a vlo₧it k≤d do jeho udßlosti Click. K≤d se potom provede p°i jeho stisku.
VB mß mnoho mo₧nostφ, jak vytvo°it opakujφcφ se cyklus. Dalo by se °φci, ₧e ze vÜech jazyk∙ mß nejvφce zp∙sob∙ pro jeho vytvo°enφ (mo₧nß a₧ p°φliÜ mnoho).
FOR .. NEXT
For pocitadlo = zacatek To konec [Step krok]
[p°φkazy]
[Exit For]
[p°φkazy]
Next [pocitadlo]
pocitadlo je prom∞nnß, kterß nab²vß hodnot od zacatek po konec. Nepovinnß
Φßst Step krok
urΦuje, o kolik se bude pocitadlo zv∞tÜovat. Standardn∞
je to 1. P°φkaz Exit For
zp∙sobφ ukonΦenφ cyklu a skok na °ßdek za p°φkazem
Next
.
P°φklad:
Dim x As Long
'vypφÜe do okna Immediate hodnoty 1, 2, 3, ... , 9, 10
For x=1 to 10
Debug.Print x
Next x
'vypφÜe do okna Immediate hodnoty 0, 5, 10, 15, 20
For x=0 to 20 Step 5
Debug.Print x
Next x
'vypφÜe do okna Immediate hodnoty 1, 2, 3
For x=1 to 5
Debug.Print x
If x=3 Then Exit For
Next x
DO .. LOOP
VB nemß p°φkaz Until
. Cykly, kterΘ jsou v jin²ch jazycφch d∞lßny pomocφ
Until
a While
, se ve VB d∞lajφ pomocφ Do .. Loop
.
Do [{While | Until} podmφnka]
[p°φkazy]
[Exit Do]
[p°φkazy]
Loop
nebo
Do
[p°φkazy]
[Exit Do]
[p°φkazy]
Loop [{While | Until} podmφnka]
Vykonßvß p°φkazy uvedenΘ mezi Do
a Loop
, dokud platφ podmφnka
uvedenß za While
, tzn. jejφ vyhodnocenφ je True, nebo, v p°φpad∞
pou₧itφ Until
, dokud nenφ vyhodnocenφ podmφnky True. While
nebo
Until
mohou b²t uvedeny bu∩ za Do
nebo za Loop
. Obojφ
zßrove≥ nenφ mo₧nΘ. Stejn∞ jako u For .. Next
je i zde mo₧no z cyklu
vyskoΦit, a to pomocφ Exit Do
.
P°φkaz lze takΘ pou₧φt bez Until
i While
, tak₧e cyklus
bude probφhat neustßle. UkonΦit p∙jde pouze pomocφ Exit Do
.
P°φklad:
Dim x As Long
'Do okna Immediate vypφÜe hodnoty 1, 2, 3, 4
x=1
Do While x<5
Debug.Print x
x=x+1
Loop
'Do okna Immediate vypφÜe hodnoty 1, 2, 3, 4
x=1
Do
Debug.Print x
x=x+1
Loop While x<5
WHILE .. WEND
P°φkaz je zjednoduÜenou obdobou p°φkazu Do .. Loop
.
While podmφnka
[p°φkazy]
Wend
Dokud platφ podmφnka, jsou vykonßvßny p°φkazy mezi While
a
Wend
.
P°φklad:
'VypφÜe do okna Immediate hodnoty 1, 2, 3, 4, 5
Dim x As Long
x=1
While x<=5
Debug.Print x
x=x+1
Wend
VB mß dva zßkladnφ p°φkazy pro v∞tvenφ programu. P°φkaz If
a p°φkaz
Select
. If
je lΘpe pou₧φt pro mΘn∞ v∞tvφ, Select
naopak
pro vφce.
IF .. THEN .. ELSE
If podmφnka Then [p°φkazy] [Else p°φkazy]
nebo
If podmφnka Then
[p°φkazy]
[ElseIf podmφnka-n Then
[p°φkazy]
[Else
[p°φkazy]
End If
P°φkaz vykonß ten blok programu, pro n∞j₧ je platnß podmφnka. podmφnka-n v Φßsti
ElseIf
znamenß, ₧e tato Φßst se m∙₧e opakovat vφcekrßt. Ze syntaxe p°φkazu vypl²vß,
je-li p°φkaz na jeden °ßdek, nemusφ b²t ukonΦen End If
.
P°φklad:
'V zßvislosti na hodnot∞ x vypφÜe do okna Immediate bu∩ "prvni" nebo "druhy"
Dim x As Long
Randomize 'Inicializuje generßtor nßhodn²ch Φφsel
x = Int((2 * Rnd) + 1) 'Generuje nßhodnΘ celΘ Φφslo od 1 do 2
If x=1 Then Debug.Print "prvni" Else Debug.Print "druhy"
nebo zapsßno p°ehledn∞ji
If x=1 Then
Debug.Print "prvni"
Else
Debug.Print "druhy"
End If
'Stejn∞ jako p°edchozφ p°φklad zapφÜe do okna Immediate hodnotu zßvislou na hodnot∞ x
Dim x As Long
Randomize 'Inicializuje generßtor nßhodn²ch Φφsel
x = Int((4 * Rnd) + 1) 'Generuje nßhodnΘ celΘ Φφslo od 1 do 4
If x=1 Then
Debug.Print "prvni"
ElseIf x=2 Then
Debug.Print "druhy"
ElseIf x=3 Then
Debug.Print "treti"
Else
Debug.Print "ctvrty"
End If
SELECT
P°φkaz Select
vykonßvß prakticky stejnou funkci jako If
. Je lepÜφ
ho pou₧φt v p°φpad∞ vφce variant testovanΘ podmφnky a ve stejnΘm p°φpad∞ takΘ pro lepÜφ Φitelnost zdrojovΘho k≤du.
Select Case testovan²_v²raz
[Case seznam1
[p°φkazy-1]]
[Case seznam2
[p°φkazy-2]]
.
.
[Case Else
[p°φkazy-n]]
End Select
testovan²_v²raz je prom∞nnß nebo v²raz, na jeho₧ zßklad∞ se program dßle rozd∞luje
na vφce blok∙. seznam1, seznam2 atd. jsou mo₧nΘ varianty testovanΘ prom∞nnΘ nebo
v²razu. Za ka₧d²m slovem Case
m∙₧e b²t jedna hodnota nebo vφce hodnot odd∞len²ch
Φßrkou. M∙₧ete zadat takΘ interval, nap°. 1 to 10
.
Pro lepÜφ pochopenφ si op∞t pom∙₧eme p°φkladem.
'Stejn∞ jako p°φklad pro IF zapφÜe do okna Immediate hodnotu zßvislou na hodnot∞ x
Dim x As Long
Randomize 'Inicializuje generßtor nßhodn²ch Φφsel
x = Int((4 * Rnd) + 1) 'Generuje nßhodnΘ celΘ Φφslo od 1 do 4
Select Case x
Case 1
Debug.Print "prvni"
Case 2,3
Debug.Print "prostredni"
Case 4
Debug.Print "posledni"
End Select
'Vyhodnotφ v²raz a vypφÜe zprßvu do okna Immediate. V tomto p°φpad∞ je vhodn∞jÜφ pou₧φt p°φkaz IF
Dim x As Long
Randomize 'Inicializuje generßtor nßhodn²ch Φφsel
x = Int((10 * Rnd) + 1) 'Generuje nßhodnΘ celΘ Φφslo od 1 do 10
Select Case x < 5
Case True
Debug.Print "X je mensi nez 5"
Case False
Debug.Print "X je vetsi nebo rovno 5"
End Select
Do tΘto kapitoly by se daly za°adit jeÜt∞ dalÜφ p°φkazy kterΘ existujφ ve VB. Nemß p°φliÜ
velk² v²znam uvßd∞t jejich syntaxi a jak se pou₧φvajφ, to m∙₧ete zjistit z nßpov∞dy. Abyste
alespo≥ v∞d∞li kde hledat, jsou to tyto p°φkazy: Choose
,
IIf
a Switch
.
Funkce MsgBox
Tato funkce slou₧φ pro zobrazenφ dialogu s textem a tlaΦφtky kterΘ si vyberete.
Vracφ hodnotu typu Integer
, kterß indikuje, kterΘ tlaΦφtko u₧ivatel
stiskl. Funkce m∙₧e b²t volßna i jako procedura.
MsgBox(text[, tlaΦφtka] [, titulek] [, nßpov∞da, kontext])
text
je zprßva, kterß se zobrazφ p°φmo v okn∞.
tlaΦφtka
je Φφslo, kterΘ je souΦtem vÜech hodnot, urΦujφcφch zobrazenß
tlaΦφtka a ikony. Zde je nejlΘpÜφ pou₧φt konstanty.
titulek
je zprßva, kterß se zobrazφ v zßhlavφ okna. Pokud neuvedete
tento parametr, zobrazφ se v titulku nßzev projektu.
nßpov∞da
je cesta k souboru nßpov∞dy.
kontext
je Φφslo, kterΘ specifikuje Φßst nßpov∞dy, kterß se mß
zobrazit.
P°φklad:
'Ukß₧e dialog s tlaΦφtkem OK (standardn∞) a textem "Moje zprßva"
MsgBox "Moje zprßva", , "Zprßva"
'Ukß₧e dialog s tlaΦφtkem OK, s ikonou I v koleΦku
MsgBox "Moje zprßva", vbInformation
'Zobrazφ dialog s tlaΦφtky Ano a Ne a ikonou otaznφku v koleΦku
'Pokud u₧ivatel zvolφ Ano, ukonΦφ se program
If MsgBox("UkonΦit program?", vbQuestion + vbYesNo, "Dotaz") = vbYes Then End
'Stejn² p°φklad jako v²Üe, pouze lΘpe Φiteln²
Dim i As Integer
i=MsgBox("UkonΦit program?", vbQuestion + vbYesNo, "Dotaz")
If i=vbYes Then
End
End If
Funkce InputBox
Funkce zobrazφ dialog s textov²m polem, a Φekß na u₧ivatele. Pokud stiskne OK, vracφ °et∞zec, kter² je obsahem textovΘho pole, tedy toho, co u₧ivatel napsal, stiskne-li Cancel, je navrßcenß hodnota rovna "", prßzdn² °et∞zec.
InputBox(zprßva[, titulek] [, default] [, x] [, y] [, nßpov∞da, kontext])
Nenφ t°eba vysv∞tlovat parametry, kterΘ jsou stejnΘ s funkcφ MsgBox
. DalÜφ
parametry znamenajφ:
default
je hodnota, kterß je p°edvypln∞na v textovΘm poli.
x
je hodnota na ose x obrazovky, kam bude umφst∞n lev² hornφ roh dialogu.
y
je stejnΘ jako x, pouze na ose y.
P°φklad:
'Zobrazφ v²zvu pro vlo₧enφ jmΘna
Dim jmeno As String
jmeno=InputBox("Vlo₧te jmΘno", "JmΘno")
If jmeno="" Then
MsgBox "Nebylo vlo₧eno ₧ßdnΘ jmΘno"
Else
MsgBox jmeno
End If
'Zobrazφ v²zvu pro vlo₧enφ data s nastaven²m dneÜnφm datem na pozici x=10, y=20
'DneÜnφ datum vracφ funkce Now
Dim datum As String 'pouze pro nßzornost, lΘpe samoz°ejm∞ pou₧φt typ date
datum=InputBox("Vlo₧te datum", "Datum", Now, 10, 20)
7. Procedury, funkce, udßlosti
Vzhledem k tomu, ₧e VB je pom∞rn∞ Φlenit² jazyk, je nßzev tΘto kapitoly pom∞rn∞ zavßd∞jφcφ. V kapitole bude zabrßno trochu ÜirÜφ spektrum. Sprßvn² nßzev, i kdy₧ ne a₧ tak srozumiteln² by mohl znφt Zp∙soby Φlen∞nφ k≤du a jejich pou₧itφ.
K Φemu slou₧φ procedury a funkce by m∞lo b²t ka₧dΘmu Φtenß°i tohoto serißlu jasnΘ. Proto pouze krßtkou rekapitulaci. Procedury a funkce slou₧φ pro strukturovanΘ rozd∞lenφ programu na menÜφ logickΘ Φßsti. Tyto jsou vhodnΘ p°edevÜφm pro takovΘ Φßsti programu, kterΘ se Φasto opakujφ nebo jsou pou₧φvßny ruzn²mi Φßstmi programu, p°φpadn∞ i jin²mi aplikacemi. Rozdφl mezi funkcemi a procedurami je jednodduch², funkce vracφ hodnotu a procedura ne.
Procedury a funkce m∙₧eme ve VB d∞lit podle zp∙sobu a mφsta pou₧itφ (nebudeme zde brßt p°φliÜ z°etel na to, kdy se spφÜe jednß o klasickou proceduru z pohledu strukturovanΘho programovßnφ a kdy jde ji₧ o metodu z pohledu OOP).
7.1. Procedury a funkceV²skyt:Form, MDIForm, Module, ClassModule, User Control, Property Page
Funkce:
[Private|Public] [Static] Function jmΘno_funkce (argumenty) [As type]
[Exit Function]
End Function
Procedura:
[Private|Public] [Static] Sub jmΘno_funkce (argumenty)
[Exit Sub]
End Sub
Klauzule Private
a Public
stejn∞ jako u prom∞nn²ch urΦujφ zdali jsou na ·rovni danΘho modulu (nechßpejte zde modul jako Module, ale pouze jako volnΘ oznaΦenφ rßmce vymezujφcφho k≤d v rßmci n∞jakΘho prvku jako Form, PropertyPage nebo i Module.) privßtnφ Φi ve°ejnΘ. To znamenß, ₧e urΦujφ, zdali budou p°φstupnΘ z vn∞jÜku danΘho modulu.
V dalÜφ Φßsti se nachßzφ slovo Static
. V p°φpad∞, ₧e se objevφ v deklaraci, znamenß to, ₧e vÜechny prom∞nnΘ v nφ deklarovanΘ jsou Static
, Φφm₧ si uchovßvajφ svou hodnotu i v dob∞, kdy nenφ danß funkce Φi procedura provßd∞na.
Po indikßtoru, kter² urΦuje zdali se jednß o funkci Φi proceduru, nßsleduje jmΘno funkce. Za tφmto jsou argumenty, kterΘ se mezi sebou odd∞lujφ Φßrkou.
[Optional] [ByRef|ByVal] jmΘno_argumentu [AS datov²_typ]
Klauzule Optional
urΦuje zdali je parametr nepovinn². Je li pou₧ito nepovinn²ch parametr∙, mohou b²t v deklaraci uvedeny a₧ po poslednφm povinnΘm argumentu. Testovßnφ, zdali byl parametr zadßn, je mo₧nΘ provßd∞t funkcφ IsMissing()
, kterß vracφ hodnotu True, jestli₧e parametr nebyl zadßn. Slova ByRef
a ByVal
stanovujφ jak²m zp∙sobem bude parametr p°edßn. V prvnφm p°φpad∞ je argument p°edßn odkazem, co₧ znamenß, ₧e je p°edßn odkaz do pam∞ti. Dφky tomu je mo₧nΘ, aby funkce nebo procedura zm∞nila jejφ hodnotu. P°esto, ₧e tento zp∙sob je ve VB standardnφ, pro optimalizaci k≤du je vhodn∞jÜφ zvolit druhou mo₧nost. V tomto p°φpad∞ je p°edßvßna pouze kopie, tak₧e p°i zm∞n∞ hodnoty argumentu se tato zm∞na projevφ jen na tΘto kopii. Stejn∞ jako u ka₧dΘ prom∞nnΘ se definuje typ i u argument∙. V p°φpad∞, ₧e je vynechßn, je automaticky p°i°azen typ Variant. Stejn∞ tomu je i u funkcφ, kde se narozdφl od procedur definuje i typ nßvratovΘ hodnoty.
ParamArray jmΘno_pole_argument∙()
Jestli₧e je poΦet argument∙ pohybliv², a pou₧itφ klauzule Optional
by bylo znaΦn∞ nepraktickΘ, je mo₧no pou₧φt pole parametr∙. Tento typ parametr∙ se deklaruje slovem ParamArray
. Typ jeho prvk∙ je v₧dy a jedin∞ Variant. Pro jeho pou₧itφ navφc platφ pravidla, ₧e m∙₧e b²t uveden a₧ jako poslednφ argument, a p°edchßzet mu mohou jedin∞ parametry povinnΘ. Kdy₧ pak budeme chtφt ve funkci nebo procedu°e prochßzet jednotlivΘ prvky pole, je nejlepÜφ a nejrychlejÜφ metoda, znßzorn∞nß v p°φkladu.
Public Function Suma(ParamArray pole()) As Long
Dim Soucet As Long
For Each prvek In pole
Soucet = Soucet + prvek
Next
Suma = Soucet
End Function
Nedφlnou souΦßstφ tΘto kapitoly je i volßnφ procedur a funkcφ z k≤du. VB zde nabφzφ n∞kolik mo₧nostφ. Prvnφ dv∞ mo₧nosti platφ pro funkce, kde nenφ d∙le₧itß nßvratovß hodnota a pro procedury.
jmΘno_funkce prvnφ_argument, druh² argument
Call jmΘno_funkce(prvnφ_argument, druh² argument)
U funkcφ, kde je t°eba zφskat nßvratovou hodnotu se pou₧ije jednoduchΘ p°i°azenφ jako u prom∞nn²ch. Je li nßvratov²m typem objekt nesmφme zapomenout na klφΦovΘ slovo Set
.
jmΘno_prom∞nnΘ = jmΘno_funkce(prvnφ_argument, druh² argument)
Set jmΘno_prom∞nnΘ = jmΘno_funkce(prvnφ_argument, druh² argument)
Poslednφ dv∞ mo₧nosti se t²kßjφ zp∙sobu zadßvßnφ nepovinn²ch parametr∙. V p°φpad∞, ₧e chceme n∞kter² z prost°ednφch parametr∙ vynechat, m∙₧e to vypadat takto (ob∞ uvedenß pou₧itφ jsou ekvivalentnφ).
Public Function Suma3(Optional a As Long, Optional b As Long, Optional c As Long) As Long
...
Print Suma3(22,,6)
Print Suma3(22,c:=6)
Z uvedenΘho je z°etelnΘ, ₧e bu∩ hodnotu parametru prost∞ nenapφÜeme nebo p°i°adφme identifikßtoru argumentu pomocφ ":=
" hodnotu.
V²skyt:Form, MDIForm, Module, ClassModule, User Control, Property Page
U₧ v minulΘm dφle jsme se zmφnili o vlastnostech objektu. Tato mo₧nost velice zp°ehled≥uje k≤d. Kdyby jsme m∞li nap°φklad nastavenφ barvy realizovat pomocφ metod (pro naÜi v∞c ji m∙₧eme nazvat i funkcφ), mohlo by to vypadat asi takto.
x=Objekt.GetBarva()
Objekt.SetBarva(x)
Jeliko₧ se navenek jevφ jako prom∞nnΘ p°φsluÜejφcφ n∞jakΘmu objektu, je zßpis mnohem p°ehledn∞jÜφ. Posu∩te sami, o co lΘpe vypadß uveden² k≤d napsan² p°i vyu₧itφ vlastnostφ.
x=Objekt.Barva
Objekt.Barva=x
AΦkoli to tak nevypadß, nevyhneme se rozd∞lenφ k≤du vlastnosti na dv∞ Φßsti (ve v²jmeΦn²ch p°φpadech dokonce na t°i). Prvnφ Φßst se starß o zjiÜt∞nφ hodnoty vlastnosti a druhß o jejφ nastavenφ. Ani zde nesmφme zapomenout na p°φpady, kdy je vlastnost typu objekt a nastavovat a psßt vlastnosti s ohledem na to.
[Private|Public] [Static] Property Get jmeno_vlastnosti(1,..., n) As typ
[Private|Public] [Static] Property Let jmeno_vlastnosti(1,..., n, n+1)
[Private|Public] [Static] Property Set jmeno_vlastnosti(1,..., n, n+1)
Co se t²Φe deklarace vlastnostφ, niΦφm zßsadnφm se od procedur a funkcφ neliÜφ, pouze identifikßtor je Property Get|Let|Set
. DalÜφm rysem je rozdφl v poΦtu argument∙ mezi Φßstmi, kde se hodnota zjiÜ¥uje a kde se nastavuje. U Property Get
je n parametr∙ vlastnosti a jejφ nßvratov² typ musφ b²t shodn² s typem parametru n+1 u Property Let|Set
. Tento poslednφ parametr se narozdφl od jin²ch nachßzφ za rovnφtkem a zprost°edkovßvß p°edßnφ hodnoty pro k≤d. Pro snadn∞jÜφ pochopenφ uvedu k≤d, na kterΘm uvidφte zp∙sob pou₧itφ vlastnostφ.
'Prvnφ Φßst k≤du je modul t°φdy s nßzvem Pole
Private mMax as Long 'Maximßlnφ poΦet prvk∙ v poli
Private mPoleVar() As Variant 'DynamickΘ pole pro ulo₧enφ prvk∙ libovolnΘho typu
'Prvnφ vlastnost slou₧φ pro urΦenφ poΦtu prvk∙ pole.
Public Property Get Maximum() As Long
Maximum=mMax
End Property
Public Property Let Maximum(NoveMax As Long)
mMax=NoveMax
Redim Preserve mPoleVar(1 to mMax) 'Zm∞na velikosti pole
End Property
'Tato vlastnost se starß o uklßdßnφ a zφskßvßnφ prvk∙ pole. Jeliko₧ m∙₧e jφt o prom∞nnou jednoduchΘho typu nebo o objekt mß jak Φßst Let tak i Set.
Public Property Get PoleVariant(Index As Long) As Variant
If Index<=mMax Then PoleVariant=mPoleVar(Index)
End Property
Public Property Let PoleVariant(Index As Long, NovyPrvek As Variant)
If Index<=mMax Then mPoleVar(Index)=NovyPrvek
End Property
Public Property Set PoleVariant(Index As Long, NovyPrvek As Variant)
If Index<=mMax Then Set mPoleVar(Index)=NovyPrvek
End Property
'Tato Φßst k≤du se nachßzφ nap°φklad v modulu formulß°e
...
Dim i As Long
Dim Pokus As New Pole
Pokus.Maximum=10
Pokus.PoleVariant(1) = "Hello, world!"
...
Pokus.PoleVariant(10) = 666
For i=1 To Pokus.Maximum 'Prochßzφ prvky vlastnosti PoleVariant
Print Typename(Pokus.PoleVariant(i)) 'Tiskne typ prom∞nnΘ
Next i
...
Udßlosti dßvajφ objekt∙m schopnost, kterß jim umo₧≥uje p°enechat reakci na urΦitou akci Φi zm∞nu stavu (m∙₧e p°ichßzet od u₧ivatele, systΘmu nebo od jin²ch objekt∙) na programßtorovi. Ten m∙₧e obslou₧it udßlost libovoln²m zp∙sobem. Samoz°ejm∞ nemusφ na udßlost reagovat v∙bec. Toto je znamenit² zp∙sob, jak spolu mohou spolupracovat a reagovat na sebe nezßvislΘ objekty.
SouΦßstφ v∞tÜiny ActiveX prvk∙ ve VB jsou udßlosti, kterΘ vßm umo₧nφ spojit s nimi k≤d a tφm je takΘ obslou₧it. Ve vlastnφch objektech m∙₧ete vytvß°et i vlastnφ udßlosti a to tak, ₧e bu∩ "p°esm∞rujete" udßlosti jin²ch objekt∙ a nebo ud∞lßte svoji, kterß se t°eba vyvolß p°i zm∞n∞ stavu.
Pro p°φklad p°esm∞rovßnφ udßlosti vytvo°te nov² projekt, p°idejte ActiveX Control (menu Project | Add User Control) a na n∞j umφstφte dv∞ tlaΦφtka. Prvnφ se bude jmenovatcmdOK
a druhΘ cmdStorno
.
Do vlastnosti Caption zapφÜete u prvnφho "OK" a u druhΘho "Storno". Hotov² prvek vlo₧φte na formulß°,
pojmenujete ho jako Pokus
a doplnφte nßsledujφcφ k≤d. PotΘ aplikaci m∙₧ete spustit (prvek p°idßte
na formulß° jeho vybrßnφm v okn∞ nßstroj∙ a standardnφm umφst∞nφm n∞kde na formulß°).
'Tato Φßst k≤du se nachßzφ v modulu vytvo°enΘho ActiveX Control
'Deklarace vlastnφch udßlostφ
Event OK()
Event Storno()
Private Sub cmdOK_Click()
RaiseEvent OK() 'Vyvolß udßlost OK
End Sub
Private Sub cmdStorno_Click()
RaiseEvent Storno() 'Vyvolß udßlost Strono
End Sub
'Nßsledujφcφ Φßst k≤du se nachßzφ v modulu formulß°e
Private Sub Pokus_OK()
MsgBox "U₧ivatel zmßΦkl OK."
End Sub
Private Sub Pokus_Storno()
MsgBox "U₧ivatel zmßΦkl Storno."
End Sub
Syntaxe deklarace udßlosti vypadß takto. Dßle je uvedena hlaviΦka pro obslou₧enφ udßlosti.
[Public] Event jmΘno_udßlosti [(argumenty)]
[Private] Sub nßzevobjektu_nßzevudßlosti [(argumenty)]
Podtr₧φtko u hlaviΦky udßlosti je nutnΘ pro odd∞lenφ nßzvu objektu a udßlosti. Jinak platφ
stejnß pravidla jako u procedur a funkcφ.
UrΦit∞ jste si vÜimli, ₧e kdy₧ vytvo°φte t°φdu a pou₧ijete ji t°eba v modulu formulß°e, nevidφte v
hornφch rozbalovacφch nabφdkßch ani jejφ nßzev ani vytvo°enΘ udßlosti. V tomto p°φpad∞ je t°eba v deklaraci
instance uvΘst klφΦovΘ slovo WithEvents
. To zp∙sobφ, ₧e se udßlosti objevφ v hornφch
nabφdkßch a je mo₧no s t∞mito udßlostmi pracovat.
Pro lepÜφ pochopenφ uvedu p°φklad. Po jeho vytvo°enφ se m∙₧ete podφvat, zdali se v nabφdkßch
objevila instance t°φdy a jejφ udßlosti. Vytvo°te t°φdu a nazv∞te ji "Zasobnik". Na formulß° vlo₧te
tlaΦφtko se jmΘnem cmdRun
a do vlastnosti caption vlo₧te text "Spus¥". Dßla vlo₧te
na formulß° ListBox a nazv∞te jej lstEvents
. PotΘ p°idejte do projektu nßsledujφcφ
k≤d.
'Tento k≤d pat°φ do t°φdy Zasobnik
Private zas(1 To 10) As Long 'Pole pro zßsobnφk
Private pocet As Long 'Pocet hodnot v zßsobnφku
'Udßlost nastßvajφcφ p°i p°eteΦenφ zßsobnφku
Event Pretekl()
'Udßlost nastßvajφcφ p°i nemo₧nosti odebrat hodnotu z prßzdnΘho zßsobnφku
Event Prazdny()
'Udßlost nastßvajφcφ p°i vlo₧enφ hodnoty
Event Vlozeno(hodnota As Long)
'Udßlost nastßvajφcφ p°i odebrßnφ hodnoty
Event Odebrano(hodnota As Long)
Public Sub Vloz(hodnota As Long)
If pocet = 10 then
RaiseEvent Pretekl
Else
pocet = pocet + 1
zas(pocet) = hodnota
RaiseEvent Vlozeno(hodnota)
End If
End Sub
Public Function Odeber() As Long
If pocet = 0 then
RaiseEvent Prazdny
Else
Odeber = zas(pocet)
RaiseEvent Odebrano(zas(pocet))
pocet = pocet - 1
End If
End Sub
'Tento k≤d pat°φ do modulu formulß°e
'Deklarace instance t°φdy vΦetn∞ udßlostφ
Private WithEvents z As Zasobnik
Private Sub Form_Load()
Set z = New Zasobnik
End Sub
Private Sub cmdRun_Click()
Dim i As Long
Randomize
'Napln∞nφ zßsobnφku
For i = 1 To 11
z.Vloz Clng(Rnd*1000)
Next
'Vyprßzdn∞nφ zßsobnφku
For i = 1 To 11
z.Odeber
Next
End Sub
Private Sub z_Odebrano(hodnota As Long)
lstEvents.AddItem "Byla odebrßna tato hodnota:" & hodnota
End Sub
Private Sub z_Prazdny()
lstEvents.AddItem "Zßsobnφk je prßzdn². Nelze odebrat hodnotu."
End Sub
Private Sub z_Pretekl()
lstEvents.AddItem "Zßsobnφk p°etekl. Nelze p°idat hodnotu."
End Sub
Private Sub z_Vlozeno(hodnota As Long)
lstEvents.AddItem "Byla vlo₧ena tato hodnota:" & hodnota
End Sub