IntegrovanΘ prost°edφ rubriky Visual Basic

Autor: Jßn Hanßk

Programßtorskß laborato°

Prostor pro experimentovßnφ

╚asovß nßroΦnost

(min):

70

ZaΦßteΦnφk

PokroΦil²

Profesionßl

Pou₧it² operaΦnφ systΘm : Hlavnφ v²vojov² nßstroj :

DalÜφ v²vojov² software :

Jin² software :

Windows 2000 SP3

Visual Basic .NET 2002

Äßdn²

Äßdn²

 

 

 

Pou₧itφ sdφlen²ch datov²ch Φlen∙, vlastnostφ a metod

Vytvß°enφ miniatur obrßzk∙ (thumbnails)

Deklarovßnφ a generovßnφ udßlostφ

 

 

Pou₧itφ sdφlen²ch datov²ch Φlen∙, vlastnostφ a metod

 

Zßjemci o studium objektov∞ orientovanΘho programovßnφ ve Visual Basicu .NET Φasto narß₧ejφ na potφ₧e ve chvφli, kdy se jich zeptßte, jak² je rozdφl mezi instanΦnφmi datov²mi Φleny, vlastnostmi a metodami a jejich sdφlen²mi prot∞jÜky. ZkuÜen∞jÜφ jedinci sice dokß₧φ vysv∞tlit v²znam a pou₧itφ instanΦnφch datov²ch polo₧ek na p°ijatelnΘ ·rovni, ovÜem o°φÜkem tak°ka v₧dycky b²vß charakteristika sdφlen²ch datov²ch Φlen∙. Abychom si ud∞lali v nastφn∞nΘ situaci po°ßdek, zam∞°φme se na popis jak instanΦnφch datov²ch polo₧ek, tak i jejich sdφlen²ch koleg∙.

 

Jist∞ vφte, ₧e kdy₧ pou₧ijete sprßvnou syntaxi p°φkazu s klφΦov²m slovem New a nßzvem t°φdy, vytvo°φte instanci danΘ t°φdy. Tato nov∞ vytvo°enß instance je ulo₧ena do generace 0 °φzenΘ hromady poΦφtaΦe.

 

╪φzenß hromada je oblast poΦφtaΦovΘ pam∞ti, do kterΘ jsou uklßdßny takzvanΘ °φzenΘ instance t°φd. ╪φzenß hromada je kontrolovßna prost°ednictvφm spoleΦnΘho b∞hovΘho prost°edφ (Common Language Runtime, CLR). CLR za ·Φelem kontroly a sprßvy °φzenΘ hromady vyu₧φvß slu₧eb automatickΘ sprßvy pam∞ti s nßzvem Garbage Collection. AΦkoliv nebudeme zachßzet p°φliÜ do hloubky, m∞li byste v∞d∞t, ₧e instance, neboli objekty, jsou °azeny do t°φ generacφ (generace 0, 1 a 2). NejmladÜφ, resp. posledn∞ vytvo°enΘ objekty, jsou v₧dy umφs¥ovßny do nultΘ generace.á

á

V∞tÜina instancφ obsahuje svß vlastnφ data, kterß jsou ulo₧ena v privßtnφch datov²ch Φlenech ka₧dΘ instance. Instance se sv²mi daty pracujφ pomocφ programovacφch konstrukcφ, mezi n∞₧ pat°φ vlastnosti a metody. Ka₧dß vytvo°enß instance obsahuje svou vlastnφ kopii vÜech implementovan²ch datov²ch Φlen∙, co₧ znamenß, ₧e pro ka₧dou instanci a jejφ datovΘ polo₧ky je v pam∞ti vytvo°en separßtnφ prostor, ve kterΘm jsou ulo₧ena citlivß data danΘ instance. Tφmto zp∙sobem mohou r∙znΘ instance existovat a pracovat nezßvisle na sob∞. DatovΘ Φleny, kterΘ pat°φ instanci, se naz²vajφ instanΦnφ datovΘ Φleny. Analogicky, programovacφ konstrukce, kterΘ p°istupujφ k instanΦnφm datov²m Φlen∙m, tedy vlastnosti a metody, jsou znßmΘ jako instanΦnφ vlastnosti a metody. Pro instanΦnφ datovΘ Φleny, vlastnosti a metody je charakteristick² jejich vztah k danΘ instanci. JednoduÜe, instanΦnφ metody mohou provßd∞t operace jenom nad daty konkrΘtnφ instance.

 

Na druhΘ stran∞ existujφ sdφlenΘ datovΘ Φleny a takΘ sdφlenΘ vlastnosti a metody.

 

V n∞kter²ch programovacφch jazycφch, t°eba v C# a v °φzenΘm C++, jsou datovΘ Φleny tohoto typu oznaΦovßny jako statickΘ. Pokud tedy n∞kdy uslyÜφte svΘ kolegy pracujφcφ v C# mluvit o statick²ch metodßch, budete v∞d∞t, ₧e jejich diskuse se toΦφ kolem sdφlen²ch metod.

 

SdφlenΘ datovΘ Φleny se vztahujφ na t°φdu, spφÜe ne₧ na jednotlivΘ instance t°φdy. SdφlenΘ datovΘ Φleny jsou ve Visual Basicu .NET deklarovßny pomocφ klφΦovΘho slova Shared. Pro vÜechny sdφlenΘ datovΘ Φleny je na °φzenΘ hromad∞ vytvo°en souvisl² prostor bajt∙, v n∞m₧ jsou tyto sdφlenΘ datovΘ Φleny ulo₧eny. Aby bylo mo₧nΘ k sdφlen²m datov²m Φlen∙m p°istupovat, musejφ existovat takΘ sdφlenΘ vlastnosti a metody. Tyto entity operujφ se sdφlen²mi Φleny, tedy daty t°φdy.

áá

Je d∙le₧itΘ pochopit, ₧e sdφlenΘ vlastnosti a metody mohou pracovat jenom se sdφlen²mi datov²mi Φleny t°φdy, nikoliv s datov²mi Φleny instancφ danΘ t°φdy.

áá

Abyste lΘpe pochopili rozdφl mezi instanΦnφmi datov²mi Φleny a sdφlen²mi datov²mi Φleny, prostudujte si nφ₧e uvedenΘ obrßzky.

 

 

Obr. 1 û Grafickß ilustrace dvou objekt∙ a jejich datov²ch Φlen∙

 

 

Obr. 2 û Grafickß ilustrace t°φdy a sdφlen²ch datov²ch Φlen∙

 

Na nßsledujφcφch °ßdcφch si p°edvedeme dv∞ programovΘ ukßzky, v nich₧ uvidφte pou₧itφ sdφlen²ch datov²ch Φlen∙, vlastnostφ a metod.

 

Ukßzka Φ. 1 û ZjiÜt∞nφ poΦtu alokovan²ch objekt∙ pomocφ sdφlen²ch Φlen∙

V prvnφ ukßzce uvidφte, jak nßm mohou sdφlenΘ Φleny pomoci p°i zjiÜ¥ovßnφ aktußlnφho stavu vytvo°en²ch objekt∙. Postupujte nßsledovn∞:

 

  1. Spus¥te Visual Basic .NET a vytvo°te standardnφ aplikaci pro Windows (Windows Application).
  2. P°idejte do projektu soubor s k≤dem t°φdy (Projectà Add Class).
  3. Implicitn∞ vytvo°en² programov² k≤d t°φdy upravte podle uvedenΘho vzoru:

 

Public Class T°φdaA

ááá Private Shared PoΦetObjekt∙ As Integer

 

ááá Sub New()

ááááááá PoΦetObjekt∙ += 1

ááá End Sub

 

ááá Protected Overrides Sub Finalize()

ááááááá PoΦetObjekt∙ -= 1

ááá End Sub

 

ááá Public Shared ReadOnly Property ZjistitPoΦetObjekt∙() As Integer

ááááááá Get

ááááááááááá Return PoΦetObjekt∙

ááááááá End Get

ááá End Property

End Class

á

Jednß se o t°φdu s nßzvem T°φdaA. V t∞le t°φdy se nachßzφ jeden sdφlen² datov² Φlen typu Integer s nßzvem PoΦetObjekt∙. VÜimn∞te si, ₧e p°ed nßzvem datovΘho Φlen∙ je umφst∞no klφΦovΘ slovo Shared. Tφm je v²slovn∞ naznaΦeno, ₧e pracujeme se sdφlen²m datov²m Φlenem, jen₧ se vztahuje ke t°φd∞ jako celku.

 

Sdφlen² datov² Φlen PoΦetObjekt∙ je deklarovßn rovn∞₧ pou₧itφm klφΦovΘho slova Private. Jde tedy o soukrom² sdφlen² datov² Φlen, co₧ je vhodnΘ, proto₧e takto dodr₧ujeme princip skr²vßnφ dat. Princip skr²vßnφ dat p°edstavuje jeden ze zßkladnφch pilφ°∙ koncepce OOP. JednoduÜe °eΦeno, v²znam tohoto principu spoΦφvß v tom, ₧e nikdy neposkytneme klientskΘmu k≤du p°φm² p°φstup k datovΘmu Φlenu t°φdy. Mφsto toho hodnotu p°φsluÜnΘho datovΘho Φlenu zjistφme pomocφ implementovanΘ ve°ejnΘ sdφlenΘ vlastnosti.á á

á

Filozofie ukßzky je zcela p°φmoΦarß: V₧dy, kdy₧ dojde k vytvo°enφ instance t°φdy T°φdaA, bude v konstruktoru t°φdy inkrementovßn sdφlen² datov² Φlen PoΦetObjekt∙. Datov² Φlen PoΦetObjekt∙ je implicitn∞ inicializovßn na nulovou hodnotu. Po vytvo°enφ ka₧dΘ instance bude hodnota sdφlenΘho Φlenu PoΦetObjekt∙ zv²Üena o jednotku. P°ed likvidacφ instance je proveden k≤d, jen₧ je umφst∞n v chrßn∞nΘ a p°ekrytΘ Sub procedu°e s nßzvem Finalize. Jeliko₧ je danß instance urΦena k likvidaci, je nutnΘ v procedu°e Finalize dekrementovat hodnotu sdφlenΘho datovΘho Φlenu PoΦetObjekt∙. Aktußlnφ hodnotu sdφlenΘho datovΘho Φlenu PoΦetObjekt∙ nßm na po₧ßdßnφ nabφdne sdφlenß vlastnost ZjistitPoΦetObjekt∙. Nßvratovß hodnota sdφlenΘ vlastnosti je typu Integer a odpovφdß skuteΦnΘmu poΦtu instancφ danΘ t°φdy, kterΘ se jeÜt∞ nachßzejφ na °φzenΘ hromad∞. áá

 

  1. Na formulß° p°idejte jednu instanci ovlßdacφho prvku Button a takΘ jednu instanci komponenty Timer.
  2. Ujist∞te se, ₧e vlastnost Enabled instance komponenty Timer je nastavena na hodnotu False a ₧e vlastnost Interval tΘto instance obsahuje hodnotu 100 (milisekund).
  3. Zpracovatele udßlosti Click instance ovlßdacφho prvku Button upravte nßsledovn∞:

 

ááá Private Sub Button1_Click(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs) Handles Button1.Click

ááááááá Timer1.Enabled = True

ááááááá Dim i As Integer

ááááááá Dim Objekt As Object

ááááááá For i = 1 To 1000

ááááááááááá Objekt = New T°φdaA()

ááááááá Next

ááá End Sub

 

Tento k≤d vytvo°φ 1000 instancφ t°φdy T°φdaA.

 

  1. Obsluhu udßlosti Tick instance komponenty Timer vypl≥te tφmto k≤dem:

 

ááá Private Sub Timer1_Tick(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs)

ááááááá Me.Text = "PoΦet objekt∙: " & T°φdaA.ZjistitPoΦetObjekt∙

ááá End Sub

 

Spus¥te testovacφ aplikaci a klepn∞te na tlaΦφtko. V titulkovΘm pruhu dialogovΘho okna se objevφ zprßva o vytvo°enφ 1000 objekt∙. Jak jsme si ji₧ °ekli, vÜechny objekty jsou ulo₧eny do generace 0 °φzenΘ hromady. Objekty vÜak po svΘm vytvo°enφ nejsou nijak vyu₧φvßny, a proto se za krßtkou dobu stanou soustem pro automatickou sprßvu pam∞ti. Aktußlnφ poΦet alokovan²ch objekt∙ se zobrazuje v titulkovΘm pruhu dialogu p°ibli₧n∞ ka₧d²ch 100 milisekund. Jeliko₧ je generace 0 °φzenΘ hromady vyhrazena pro doΦasnΘ objekty, za krßtkou dobu budou vÜechny vytvo°enΘ instance z pam∞ti odstran∞ny (titulek dialogovΘho okna bude ukazovat nulovou hodnotu).

 

Ukßzka Φ. 2 û Pou₧itφ sdφlenΘ funkce t°φdy pro p°idßnφ instance t°φdy Button na aktivnφ formulß°

ZajistΘ jste se ji₧ n∞kdy st°etli s t°φdou, kterß p°φmo neumo₧≥ovala tvorbu sv²ch instancφ. U takovΘto t°φdy tedy nenφ mo₧nΘ pou₧φt znßmou syntaxi s klauzulφ New. AΦkoliv t°φda neposkytuje mo₧nost p°φmΘho vytvß°enφ instancφ, p°esto m∙₧e b²t u₧iteΦnß. Ano, klφΦem k ·sp∞chu je za°azenφ sdφlenΘ funkce (resp. metody). Vlo₧te do stßvajφcφho projektu Visual Basicu .NET dalÜφ t°φdu a jejφ podobu upravte takto:

 

Public Class T°φdaB

ááá Public Shared Function P°idatTlaΦφtko _

ááá (ByVal JmΘno As String, ByVal Nßv∞stφ As String, _

ááá ByVal èφ°ka As Integer, ByVal V²Üka As Integer, _

ááá ByVal Pozice As Point) As Boolean

ááááááá Try

ááááááááááá Dim TlaΦφtko As New Button()

ááááááááááá With TlaΦφtko

ááááááááááááááá .Name = JmΘno

áááááááááááá ááá.Text = Nßv∞stφ

ááááááááááááááá .Width = èφ°ka

ááááááááááááááá .Height = V²Üka

ááááááááááááááá .Location = Pozice

ááááááááááá End With

ááááááááááá Form.ActiveForm.Controls.Add(TlaΦφtko)

ááááááá Catch x As System.Exception

ááááááááááá Throw New System.Exception("Vytvß°enφ tlaΦφtka se nezda°ilo.")

ááááááá End Try

ááááááá Return True

ááá End Function

End Class

 

P°edm∞tem naÜeho zßjmu je sdφlenß funkce P°idatTlaΦφtko. Signatura tΘto sdφlenΘ funkce je znaΦka rozsßhlß, poz∙stßvß s mno₧stvφ parametr∙, kterΘ specifikujφ:

 

 

P°idejte na formulß° dalÜφ instanci ovlßdacφho prvku Button a do zpracovatele udßlosti Click tΘto instance umφst∞te tento programov² k≤d:

 

ááá Private Sub Button2_Click(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs) Handles Button2.Click

ááááááá Me.Text = CStr(T°φdaB.P°idatTlaΦφtko _

ááááááá ("btnTlaΦφtko1", "TlaΦφtko", 100, 60, New Point(10, 200)))

ááá End Sub

 

K≤d volß sdφlenou metodu P°idatTlaΦφtko t°φdy s nßzvem T°φdaB. V²sledkem prßce sdφlenΘ metody je vytvo°enφ novΘ instance t°φdy Button a zaΦlen∞nφ tΘto instance do kolekce instancφ aktußlnφho formulß°e (tedy formulß°e, jeho₧ programov² k≤d je prßv∞ podroben exekuci). V naÜem p°φpad∞ bude lev² roh regionu instance t°φdy Button umφst∞n na bod∞ se sou°adnicemi (10, 200), instance bude mφt Üφ°ku 100 pixel∙ a v²Üku 60 pixel∙. Prob∞hnou-li vÜechny operace ·sp∞Ün∞, sdφlenß funkce vrßtφ hodnotu True, kterß bude zobrazena v titulkovΘm pruhu aktußlnφho formulß°e.

 

Zp∞t na obsah

 

Vytvß°enφ miniatur obrßzk∙ (thumbnails)

 

Grafick² subsystΘm platformy .NET Framework s nßzvem GDI+ vßm poskytuje relativn∞ snadnou cestu pro vytvß°enφ grafickΘ miniatury (thumbnail) jakΘhokoliv obrßzku, jeho₧ data jsou ulo₧ena v jednom z nativn∞ podporovan²ch grafick²ch soubor∙. Budete-li chtφt rychle vytvo°it grafickou zmenÜeninu vßmi po₧adovanΘho obrßzku, pou₧ijte nßsledujφcφ programov² k≤d:

 

ááááááá Dim obr As Image = Image.FromFile("c:\obr1.bmp")

ááááááá Dim th As Image = obr.GetThumbnailImage(200, 150, Nothing, IntPtr.Zero)

ááááááá Dim g As Graphics = Me.CreateGraphics

ááááááá g.DrawImage(th, 10, 10, th.Width, th.Height)

 

Uveden² k≤d pracuje podle tohoto algoritmu:

 

  1. ZaΦφnßme deklaracφ referenΦnφ prom∞nnΘ obr, kterß m∙₧e uchovßvat referenci na instanci t°φdy Image.
  2. Jestli₧e p°edßme sdφlenΘ metod∞ FromFile t°φdy Image pln∞ kvalifikovanou cestu k souboru s grafick²mi daty, tato metoda zabezpeΦφ vytvo°enφ instance t°φdy Image na °φzenΘ hromad∞. Vytvo°enß instance bude p°edstavovat grafick² objekt, jeho₧ data byla naΦtena ze specifikovanΘho souboru.
  3. PokraΦujeme deklaracφ dalÜφ referenΦnφ prom∞nnΘ th. Podobn∞ jako prom∞nnß obr, takΘ prom∞nnΘ th m∙₧e obsahovat ukazatel na instanci t°φdy Image. Rozdφl mezi ob∞ma prom∞nn²mi je vÜak v tom, ₧e zatφmco prom∞nnß obr obsahuje referenci na p∙vodnφ grafick² objekt, do prom∞nnΘ th bude za chvφli ulo₧en odkaz na novou instanci t°φdy Image. Tato novß instance bude obsahovat grafickou miniaturu p∙vodnφho obrßzku.
  4. KlφΦem k ·sp∞chu je nepopirateln∞ aktivace metody GetThumbnailImage, jejφ₧ generickß podoba je nßsledovnφ:

 

Public Function GetThumbnailImage( _

áá ByVal thumbWidth As Integer, _

áá ByVal thumbHeight As Integer, _

áá ByVal callback As Image.GetThumbnailImageAbort, _

áá ByVal callbackData As IntPtr _

) As Image á

 

áááááááá Popis parametr∙ je uveden v tab. 1.

 

Parametr

Charakteristika

thumbWidth

èφ°ka miniatury grafickΘho obrßzku m∞°enß v pixelech.á

thumbHeight

V²Üka miniatury grafickΘho obrßzku m∞°enß v pixelech.

Pokud jsou hodnoty parametr∙ thumbWidth a thumbHeight nulovΘ, jsou rozm∞ry grafickΘ miniatury urΦeny na zßklad∞ implicitnφch nastavenφ systΘmu.

callback

Delegßt Image.GetThumbnailAbort. Ve verzi GDI+ 1.0 se tento delegßt nevyu₧φvß. AΦkoliv oficißlnφ dokumentace °φkß, ₧e je nevyhnutnΘ delegßta vytvo°it, nemusφ tomu b²t nutn∞ tak. V praxi toti₧ staΦφ, kdy₧ do parametru callback ulo₧φte hodnotu Nothing.

callbackData

Parametr musφ obsahovat hodnotu sdφlenΘho Φlenu Zero struktury IntPtr. Sdφlen² datov² Φlen Zero reprezentuje ukazatel, jen₧ byl inicializovßn na nulovou hodnotu.á

 

Tab. 1 û Charakteristika parametr∙ metody GetThumbnailImage

 

  1. Pokud je volßnφ metody ·sp∞ÜnΘ, finßlnφm v²sledkem je instance t°φdy Image. Tato instance p°edstavuje grafickou miniaturu, tedy modifikovan² p∙vodnφ obrßzek.

 

N∞kterΘ grafickΘ formßty dovolujφ krom∞ samotnΘho grafickΘho obrazce ulo₧it v jednom souboru takΘ miniaturu tohoto grafickΘho obrazce. Pokud metoda zjistφ, ₧e soubor disponuje i grafickou miniaturou, je naΦtena tato miniatura. V opaΦnΘm p°φpad∞ je zmenÜen p∙vodnφ grafick² obrazec pomocφ transformaΦnφch algoritm∙.

 

  1. Grafick² objekt aktußlnφ instance formulß°e si p°ipravφme pomocφ metody CreateGraphics a poslΘze pou₧ijeme metodu DrawImage, kterß zabezpeΦφ vykreslenφ grafickΘ miniatury (obr. 3).

 

 

Obr. 3 û Vytvo°enφ grafickΘ miniatury pou₧itφm metody GetThumbnailImage

 

Zp∞t na obsah

 

Deklarovßnφ a generovßnφ udßlostφ

 

Visual Basic .NET ruku v ruce s platformou .NET nabφzφ v²vojß°∙m mno₧stvφ t°φd, ovlßdacφch prvk∙ a komponent. Instance t∞chto entit ₧ijφ ve sv∞t∞, jen₧ je °φzen modelem zalo₧en²m na udßlostech. Ano, programovßnφ °φzenΘ udßlostmi je dnes v kurzu, a i proto se m∙₧ete tak°ka na ka₧dΘm kroku st°etnout s udßlostmi.

 

Udßlost m∙₧eme definovat jakou souhru faktor∙, kterß nastane v jistΘm ΦasovΘm okam₧iku. Udßlost tak °φkß, ₧e nastala jistß situace. ProgramovΘ entity, jako nap°φklad objekty, musφ v∞d∞t, jak se majφ chovat v p°φpad∞, kdy nastane jistß udßlost. ZvyΦejn∞ objekt nevφ, jak na vzniklou situaci smyslupln∞ reagovat, a proto jej to musφme nauΦit. Tato v²uka je zalo₧enß na implementaci zpracovatel∙ p°φsluÜn²ch udßlostφ. Mezi udßlostφ a jejφm zpracovatelem je z°ejm² vzßjemn² vztah: Je to udßlost sama, kdo iniciuje Φinnost zpracovatele udßlosti, p°iΦem₧ vÜak ₧ßdn² zpracovatel nenφ aktivovßn do okam₧iku, kdy nenastane jistß udßlost. V tomto tipu si ukß₧eme, jak pracovat s udßlostmi a jejφmi zpracovateli v programovΘm k≤du. Uvidφte, jak se udßlost deklaruje a takΘ, jak ji lze vygenerovat.

 

Postupujte nßsledovn∞:

 

  1. Vytvo°te nov² projekt Visual Basicu .NET pro standardnφ aplikaci Windows (Windows Application).
  2. Na formulß° p°idejte instanci ovlßdacφho prvku Button a na vytvo°enou instanci poklepejte.
  3. Prvnφ etapou v ₧ivotnφm cyklu udßlosti je jejφ deklarace. Pro deklaraci udßlosti je k dispozici p°φkaz Event:

 

ááá ááááááá Public Event Udßlost(ByVal hwnd As Form)

 

Zde vidφte kompletnφ ukßzku deklarace udßlosti. P°ed klφΦov²m slovem Event se nachßzφ modifikßtor p°φstupu udßlosti, kter² je v naÜem p°φpad∞ Public. Za klφΦov²m slovem Event se nachßzφ nßzev udßlosti a je jenom na vßs, jak svoji udßlost pojmenujete (m∞li byste ovÜem dodr₧ovat pravidla pro pojmenovßvßnφ programov²ch jednotek). Za nßzvem udßlosti nßsleduje signatura, teda seznam parametr∙, s kter²m bude udßlost pracovat. P°esn∞ji °eΦeno, s t∞mito parametry nebude pracovat p°φmo udßlost, ale jejφ zpracovatel, jak sami za chvφli uvidφte. Parametry mohou b²t p°edßvßny hodnotou, nebo odkazem (zde je zvolen prvnφ zp∙sob). Parametrickß prom∞nnß hwnd je schopna uchovßvat ukazatel na instanci t°φdy Form.á

á

  1. Jakmile je udßlost deklarovßna, m∙₧eme za°adit do k≤du takΘ zpracovatele tΘto udßlosti. Je d∙le₧itΘ v∞d∞t, ₧e ka₧dß udßlost musφ disponovat sv²m zpracovatelem. Ve dvojici udßlost -zpracovatel je prßv∞ zpracovatel tφm aktivnφm prvkem, kter² iniciuje exekuci programov²ch operacφ v okam₧iku, kdy dojde ke generovßnφ udßlosti. K≤d zpracovatele udßlosti m∙₧e mφt t°eba tuto podobu:

 

ááá Public Sub Zpracovatel(ByVal hwnd As Form)

ááááááá Dim f As Integer = FreeFile()

ááááááá Try

ááááááááááá FileOpen(f, "d:\info.txt", OpenMode.Output, OpenAccess.Write)

ááááááááááá Print(f, "Handle okna: " & hwnd.Handle.ToString & _

ááááááááááá vbCrLf & "Titulek okna: " & hwnd.Text & _

ááááááááááá vbCrLf & "Nepr∙hlednost (%): " & (hwnd.Opacity) * 100 & _

ááááááááááá vbCrLf & "V²Üka okna (pixely): " & hwnd.Height & _

ááááááááááá vbCrLf & "èφ°ka okna (pixely): " & hwnd.Width)

ááááááááááá Me.Text = "Soubor s informacemi byl ·sp∞Ün∞ vytvo°en."

ááááááááááá FileClose(f)

ááááááá Catch x As Exception

ááááááááááá MessageBox.Show("P°i vytvß°enφ souboru doÜlo k chyb∞.", _

ááááááááááá "Zprßva o chyb∞", MessageBoxButtons.OK, MessageBoxIcon.Error)

ááááááááááá Me.Text = "Soubor s informacemi nebylo mo₧nΘ vytvo°it."

ááááááá End Try

ááá End Sub

 

Zpracovatel udßlosti musφ mφt stejnou signaturu jako samotnß udßlost.

 

Po formßlnφ strßnce je zpracovatel udßlosti Sub procedurou, co₧ znamenß, ₧e zpracovatel udßlosti nem∙₧e nikdy vracet ₧ßdnou nßvratovou hodnotu. V∞°φm, ₧e v²pis k≤du je vßm jasn² na prvnφ pohled û jednoduÜe jsou zjiÜt∞ny informace o cφlovΘ instanci t°φdy Form a tyto informace jsou vzßp∞tφ ulo₧eny do textovΘho souboru na logick² oddφl pevnΘho disku.á á

 

  1. Po deklaraci udßlosti a implementaci jejφho zpracovatele je naΦase vytvo°it mezi t∞mito dv∞ma entitami p°epojenφ. Toto p°epojenφ je velmi d∙le₧itΘ proto, aby udßlost mohla najφt svΘho zpracovatele. Z pohledu tvorby zdrojovΘho k≤du je p°epojenφ mezi udßlostφ a jejφm zpracovatele realizovßno prost°ednictvφm p°φkazu AddHandler:

 

áááá

ááá Private Sub Form1_Load(ByVal sender As Object, _

ááá ByVal e As System.EventArgs) Handles MyBase.Load

 

ááááááá AddHandler Udßlost, AddressOf Zpracovatel

 

ááá End Sub

 

Jeliko₧ nenφ mo₧nΘ vytvo°it p°epojenφ mezi udßlostφ a jejφm zpracovatelem ve fßzi psanφ k≤du, musφ b²t toto p°epojenφ vytvo°eno a₧ za b∞hu programu. Z tohoto d∙vodu se k≤d p°φkazu AddHandler nachßzφ v udßlostnφ procedu°e Form1_Load. ááá

 

Tento °ßdek k≤du naznaΦuje, ₧e p°i startu aplikace bude vytvo°en vztah mezφ udßlostφ a jejφm zpracovatelem. Ve skuteΦnosti je situace komplikovan∞jÜφ, proto₧e Visual Basic .NET automaticky vytvo°φ delegßta, kter² obsahuje adresu zpracovatele udßlosti. Pokud byste programovali nap°φklad v C#, museli byste p°φsluÜnΘho delegßta explicitn∞ deklarovat, ovÜem Visual Basic .NET tuto operaci provßdφ za vßs, a tφm minimalizuje vaÜe programßtorskΘ ·silφ.

 

  1. Nakonec zb²vß u₧ jenom vygenerovat udßlost. Udßlost m∙₧e b²t generovßna tak°ka kdykoliv, zßvisφ tedy jenom na programßtorovi, kdy bude chtφt udßlost generovat. Generovßnφ udßlostφ je realizovßno pou₧itφm p°φkazu RaiseEvent:

 

ááá Private Sub Button1_Click(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs) Handles Button1.Click

 

ááááááá RaiseEvent Udßlost(Me)

 

ááá End Sub

 

Za p°φkazem RaiseEvent nßsleduje nßzev udßlosti, kterou chceme generovat. Pokud udßlost pracuje s parametry, je nutnΘ tyto pat°iΦn∞ naplnit. Jak si m∙₧ete vÜimnout, udßlost bude generovßna v okam₧iku, kdy u₧ivatel klepne na tlaΦφtko Button1 (udßlosti mohou b²t samoz°ejm∞ vyvolßvßny takΘ p°i mnoha dalÜφch p°φle₧itostech).

 

Zp∞t na obsah

 

 

Prßv∞ jste doΦetli poslednφ tip sekce Programßtorskß laborato°.á

 

Jestli₧e se chcete dozv∞d∞t vφce informacφ o programovßnφ ve Visual Basicu .NET, nevßhejte a navÜtivte takΘ dalÜφ sekce rubriky Visual Basic. A jakß₧e je dneÜnφ nabφdka?

TΘma m∞sφce

Inteligentnφ znaΦky (Smart Tags)

Serißl ZaΦφnßme s VB .NET

Porovnßvacφ operßtory Is a Like, p°i°azovacφ operßtory...