Serißl - 3. dφl
Zßkladnφ p°φkazy, funkce, procedury a udßlosti

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


6. Zßkladnφ p°φkazy

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.


6.1. P°φkazy cyklu

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

Zp∞t na obsah


6.2. V∞tvenφ programu

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.

Zp∞t na obsah


6.3. Dialogy

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)

Zp∞t na obsah


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 funkce

V²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.

Zp∞t na obsah


7.2. Vlastnosti

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
...

Zp∞t na obsah


7.3. Udßlosti

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 jmenovat cmdOK 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

Zp∞t na obsah