IntegrovanΘ prost°edφ rubriky Visual Basic

Autor: Jßn Hanßk

Programßtorskß laborato°

Prostor pro experimentovßnφ

╚asovß nßroΦnost

(min):

75

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²

 

Nep°ehlΘdn∞te exkluzivnφ Specißl pro programßtory, kter² pojednßvß o jazykovΘ interoperabilit∞ mezi jazyky Managed Extensions for C++ a Visual Basic .NET.

 

 

Tvorba zapeΦet∞nΘ t°φdy

P°φstup k registr∙m operaΦnφho systΘmu Windows

Vytvß°enφ vlastnφho delegßta

 

 

Tvorba zapeΦet∞nΘ t°φdy

 

V jist²ch situacφch je pro programßtora ne₧ßdoucφ, aby t°φda, kterou vytvo°il sv²mi vlastnφmi silami, byla zdrojem pro dalÜφ odvozenΘ t°φdy. Jestli₧e programßtor pou₧ije v deklaraci t°φdy klφΦovΘ slovo NotInheritable, v²slovn∞ na°izuje, ₧e danß t°φda nem∙₧e slou₧it jako bßzovß t°φda. T°φd∞ s uveden²mi charakteristikami se °φkß zapeΦet∞nß t°φda. Pokud porovnßme standardnφ t°φdu a jejφ zapeΦet∞nou kolegyni, m∙₧eme pozorovat, ₧e primßrnφm rozdφlem mezi t∞mito dv∞ma t°φdami je jejich chovßnφ p°i d∞d∞nφ.

 

Pod pojmem ästandardnφ t°φdaô budeme v nßsledujφcφm textu rozum∞t t°φdu, v deklaraci kterΘ se nenachßzφ klφΦovΘ slovo NotInheritable, jako₧to ani jinΘ modifikßtory, kterΘ jak²mkoliv zp∙sob ovliv≥ujφ chovßnφ t°φdy.

 

Zatφmco od standardnφ t°φdy m∙₧eme odvodit tolik podt°φd, kolik budeme chtφt, zapeΦet∞nß t°φda touto dovednostφ nedisponuje. OvÜem ob∞ t°φdy mohou vytvß°et svΘ instance, v tomto sm∞ru se zapeΦet∞nß t°φda chovß ·pln∞ stejn∞ jako jejφ standardnφ prot∞jÜek.

 

I kdy₧ nenφ tvorba zapeΦet∞nΘ t°φdy zcela b∞₧nou zßle₧itostφ, existuje n∞kolik pßdn²ch d∙vod∙ pro oznaΦenφ t°φdy klφΦov²m slovem NotInheritable:

 

 

ZapeΦet∞nΘ t°φdy jsou zpravidla t°φdy, jejich₧ stavba pln∞ pokr²vß vy°eÜenφ jistΘ problematiky. JednoduÜe °eΦeno, zapeΦet∞nß t°φda obsahuje vÜechny prvky (vlastnosti, metody a datovΘ Φleny), kterΘ budou instance tΘto t°φdy vyu₧φvat. ZapeΦet∞nß t°φda je tak daleko objemn∞jÜφ a robustn∞jÜφ jako jakßkoliv jinß t°φda. Tato skuteΦnost vypl²vß prßv∞ z faktu, ₧e zapeΦet∞nß t°φda si äveze vÜechno s sebouô. Abyste vid∞li hlavnφ rozdφly mezi nßvrhem a tvorbou standardnφ a zapeΦet∞nΘ t°φdy, uve∩me si n∞kterΘ podstatnΘ znaky (tab. 1).

 

KomparaΦnφ znaky

Typ t°φdy

Standardnφ t°φda

ZapeΦet∞nß t°φda

Proces nßvrhu

P°i nßvrhu standardnφ t°φdy je ve v∞tÜin∞ p°φpad∙ brßn do ·vahy po₧adavek na pozd∞jÜφ rozÜi°itelnost t°φdy pomocφ d∞diΦnosti, a proto se standardnφ t°φda navrhuje jako bßzovß t°φda. To znamenß, ₧e do bßzovΘ t°φdy je za°azena pouze vÜeobecnß, resp. zßkladnφ funkcionalita, ovÜem veÜkerΘ konkrΘtnφ nebo specifickΘ rysy jsou implementovßny a₧ v odvozen²ch t°φdßch.

Proces nßvrhu zapeΦet∞nΘ t°φdy musφ poz∙stßvat z peΦlivΘ anal²zy vÜech aspekt∙ funkcionality tΘto t°φdy. Proto₧e charakter zapeΦet∞nΘ t°φdy nem∙₧e b²t pozd∞ji rozÜφ°en v podt°φdßch, musφ zapeΦet∞nß t°φda obsahovat vÜechny Φleny, kterΘ budou instance tΘto t°φdy ke svΘ prßci pot°ebovat.

D∞diΦnost

OdvozenΘ t°φdy vznikajφ na zßklad∞ techniky jednoduchΘ d∞diΦnosti, kterß je p°φmo podporovßna platformou .NET (p°esn∞ji spoleΦnou jazykovou specifikacφ û Common Language Specification). Standardnφ t°φda nenφ v procesu d∞d∞nφ nijak omezena, a proto je mo₧nΘ vytvß°et libovolnΘ mno₧stvφ podt°φd. á

ZapeΦet∞nß t°φda d∞diΦnost nepodporuje, co₧ znamenß, ₧e nem∙₧e slou₧it jako bßzovß t°φda pro tvorbu odvozen²ch t°φd.

RozÜφ°enφ

RozÜφ°enφ standardnφ t°φdy m∙₧e v zßsad∞ probφhat ve dvou sm∞rech:

          rozÜφ°φ se p°φmo programov² k≤d standardnφ t°φdy

          rozÜφ°enφ se uskuteΦnφ upravenφm programovΘho k≤du odvozen²ch t°φd

RozÜφ°enφ zapeΦet∞nΘ t°φdy se musφ uskuteΦnit prost°ednictvφm zaΦlen∞nφ dodateΦnΘho programovΘho k≤du do samotnΘ zapeΦet∞nΘ t°φdy.

Vytvß°enφ instancφ

Plnß podpora vytvß°enφ instancφ t°φdy.*

Plnß podpora vytvß°enφ instancφ t°φdy.*

* Za p°edpokladu, ₧e programßtor nezaΦlenil do k≤du t°φdy privßtnφ konstruktor.

* Za p°edpokladu, ₧e programßtor nezaΦlenil do k≤du t°φdy privßtnφ konstruktor.

á

Tab. 1 û Komparace standardnφ a zapeΦet∞nΘ t°φdy

 

Na nßsledujφcφch °ßdcφch je uveden v²pis zdrojovΘho k≤du zapeΦet∞nΘ t°φdy:

 

Option Strict On

Public NotInheritable Class ZapeΦet∞nßT°φda

ááá Private m_PoΦet As Byte

 

ááá Public Property ZjistitPoΦetFormulß°∙() As Byte

ááááááá Get

ááááááááááá Return m_PoΦet

ááááááá End Get

ááááááá Set(ByVal Value As Byte)

ááááááááááá m_PoΦet = Value

ááááááá End Set

ááá End Property

 

ááá Public Sub Vytvo°itFormulß°e(ByVal PoΦet As Byte)

ááááááá m_PoΦet = PoΦet

ááááááá If PoΦet <= 0 Or PoΦet > 10 Then

ááááááááááá MessageBox.Show("Bylo zadßno nevhodnΘ Φφslo (" & PoΦet _

ááááááááááá & ") pro poΦet formulß°∙." & vbCrLf & _

ááááááááááá "Nynφ bude zobrazen dialog, v n∞m₧ budete moci zadat " & _

ááááááááááá "sprßvnΘ Φφslo pro poΦet formulß°∙.", "Zprßva o chyb∞", _

ááááááááááá MessageBoxButtons.OK, MessageBoxIcon.Error)

ááááááááááá Dim odp As Byte = CByte(InputBox _

ááááááááááá ("Zadejte Φφslo pro poΦet formulß°∙ (<1, 10>).", _

ááááááááááá "UrΦenφ poΦtu formulß°∙", "1"))

ááááááááááá PoΦet = odp

ááááááááááá GoTo Tvorba_Formulß°∙

ááááááá Else

Tvorba_Formulß°∙:

ááááááááááá Dim a As Byte

ááááááááááá Dim frm(PoΦet - 1) As Form

ááááááááááá For a = 0 To CByte(PoΦet - 1)

ááááááááááááááá frm(a) = New Form()

ááááááááááááááá With frm(a)

ááááááááááááááááááá .Text = "Formulß° Φ. " & a + 1

ááááááááááááááááááá .Show()

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

ááááááááááááááá Application.DoEvents()

ááááááááááá Next

ááááááá End If

ááá End Sub

End Class

 

Ukßzkovß zapeΦet∞nß t°φda slou₧φ na vytvß°enφ polφ instancφ t°φdy Form. Jak si m∙₧ete vÜimnout, v t∞le t°φdy se nachßzφ ve°ejnß metoda Vytvo°itFormulß°e, kterß odvßdφ veÜkerou pot°ebnou prßci. PoΦet vytvo°en²ch formulß°∙ je ulo₧en do soukromΘho datovΘho Φlenu s nßzvem m_PoΦet. Hodnotu Φlenu m_PoΦet lze zφskat zavolßnφm ve°ejnΘ vlastnosti ZjistitPoΦetFormulß°∙. V∞°φm, ₧e jako profesionßlnφm programßtor∙m je vßm k≤d zapeΦet∞nΘ t°φdy vφcemΘn∞ jasn², ovÜem cht∞l bych vßs upozornit na tyto skuteΦnosti:

 

  1. K≤d metody Vytvo°itFormulß°e testuje hodnotu formßlnφho parametru PoΦet (typu Byte). Jestli₧e je hodnota tohoto parametru jinß ne₧ jsou povolenΘ hodnoty z intervalu <1, 10>, zobrazφ se varovnφ hlßÜenφ. HlßÜenφ informuje programßtora, ₧e byla zadßna nep°φpustnß celoΦφselnß hodnota. Jakmile bude zav°eno okno s varovn²m hlßÜenφm, bude zavolßna funkce InputBox, kterß zobrazφ dialogovΘ okno s textov²m polem pro zadßnφ sprßvnΘ hodnoty pro poΦet formulß°∙, kterΘ se majφ vytvo°it. Zadanß hodnota bude explicitn∞ konvertovßna do typu Byte a ulo₧ena do prom∞nnΘ odp. Nßsledn∞ bude proveden p°φkaz GoTo, kter² p°eskoΦφ na specifikovanΘ nßv∞stφ (Tvorba_Formulß°∙). áá

 

VÜimn∞te si, ₧e v k≤du nenφ proveden test nßvratovΘ hodnoty funkce InputBox (jednoduÜe p°edpoklßdßme, ₧e u₧ivatel zadß sprßvnou hodnotu z ohraniΦenΘho celoΦφselnΘho intervalu). Pokud bude tento k≤d pou₧φvat v reßln²ch aplikacφch, ujist∞te se, ₧e jste provedli takΘ test nßvratovΘ hodnoty funkce InputBox. A to z toho d∙vodu, ₧e i kdy₧ se u₧ivatel ji₧ jednou zm²lil, nenφ v∙bec vylouΦeno, ₧e tak ud∞lß i podruhΘ.á

áá á

  1. K≤d, jen₧ nßsleduje za nßv∞stφm Tvorba_Formulß°∙, inicializuje pole frm() na hodnotu o jednotku menÜφ ne₧li je hodnota parametru PoΦet. Zde je d∙le₧itΘ zd∙raznit, ₧e Visual Basic .NET p°istupuje k deklaraci polφ jinak ne₧ jeho p°edch∙dce. Dolnφ hranice pole je po novΘm v₧dy rovna nule, zatφmco hornφ hranice nenφ prakticky omezenß. P°i deklaraci pole je pot°ebnΘ zadat hodnotu, kterß reprezentuje hornφ hranici pole (naproti tomu, v n∞kter²ch jin²ch jazycφch platformy .NET se p°i deklaraci pole udßvß hodnota, je₧ p°edstavuje poΦet prvk∙ pole û typicky v Managed Extensions for C++). Tak je p°ipraveno pole, jeho₧ prvky budou schopny ulo₧it odkazy na instance t°φdy Form. V cyklu jsou vÜechny prvky pole napln∞ny p°φsluÜn²mi odkazy na vytvo°enΘ instance t°φdy Form.á áááá

 

K pou₧itφ instance zapeΦet∞nΘ t°φdy nßm bude staΦit n∞kolik °ßdk∙ programovΘho k≤du:

 

ááááááá Dim x As New ZapeΦet∞nßT°φda()

ááááááá x.Vytvo°itFormulß°e(3)

ááááááá Me.Text = "PoΦet vytvo°en²ch formulß°∙: " & _

ááááááá CStr(x.ZjistitPoΦetFormulß°∙)

 

Zp∞t na obsah

 

P°φstup k registr∙m operaΦnφho systΘmu Windows

 

Snad vÜichni programßto°i a v²vojß°i cht∞jφ, aby byly jejich aplikace co mo₧nß nejvφc u₧ivatelsky p°φv∞tivΘ. U₧ivatelskß p°φv∞tivost je znaΦn∞ rozsßhl² pojem, jen₧ v sob∞ absorbuje velkΘ mno₧stvφ doporuΦen²ch standard∙, kterΘ °φkajφ, jak mß aplikace vypadat a jak se mß chovat. Dodr₧ovßnφm t∞chto standard∙ tak mohou programßto°i zabezpeΦit, ₧e u₧ivatel∙m se bude s aplikacφ pracovat pohodln∞, rychle a bez jak²chkoliv potφ₧φ. Jednφm z po₧adavk∙, kterΘ jsou na reßlnou aplikaci kladeny, je schopnost aplikace pamatovat si pot°ebnΘ informace o stavech, v nich₧ se b∞hem svΘ Φinnosti ocitla. Tak si aplikace m∙₧e pamatovat seznam posledn∞ otev°en²ch soubor∙, p°esnou pozici svΘho dialogovΘho okna, nebo Φasov² interval pro automatickΘ ulo₧enφ editovanΘho dokumentu. Na ulo₧enφ a poslΘze naΦφtanφ vÜech uveden²ch informacφ lze s v²hodou vyu₧φt registr∙ operaΦnφho systΘmu.

 

Ve Visual Basicu .NET m∙₧eme aplikovat dv∞ koncepce p°φstupu k registr∙m:

 

  1. Starou koncepci, kterß je znßmß ji₧ z Visual Basicu 6 a p°i kterΘ se pou₧φvajφ vestav∞nΘ funkce pro prßci s registry (jde o funkce SaveSetting, GetSetting, DeleteSetting a GetAllSettings). Nev²hodou tΘto koncepce je to, ₧e vÜechny informace lze ulo₧it jenom do p°edem urΦenΘ sekce registr∙ (p°esn∞ji jde o sekci s nßzvem HKEY_CURRENT_USER\Software\VB and VBA Program Settings). Pro ulo₧enφ informacφ do jin²ch sekcφ registr∙ je nutnΘ zavolat adekvßtnφ API funkce, ovÜem jednß se o znaΦn∞ nßroΦnou zßle₧itost. Pou₧ijete-li novou koncepci, nemusφte si s tφmto omezenφm dßle lßmat hlavu, proto₧e novΘ t°φdy rßmce .NET Framework vßm umo₧≥ujφ provßd∞t zßpis do libovoln²ch oblastφ registr∙.á á

 

  1. Novou a unikßtnφ koncepci, kterou nabφzφ Visual Basic .NET. Pro p°φstup k registr∙m pou₧ijeme t°φdy za tφmto ·Φelem vytvo°enΘ (p°esn∞ji jde o t°φdy Registry a RegistryKey). AΦkoliv je pou₧itφ novΘ koncepce pon∞kud komplikovan∞jÜφ, m∙₧ete ·daje o svΘ aplikaci uklßdat do rozliΦn²ch sekcφ registr∙, Φφm₧ je okam₧it∞ likvidovßno omezenφ starΘ koncepce.

 

Abyste vid∞li, jak ob∞ koncepce pracujφ, ukß₧eme si jejich pou₧itφ v praxi. Poka₧dΘ provedeme vytvo°enφ registrovΘho klφΦe, jemu₧ p°i°adφme p°φsluÜnou hodnotu a tuto hodnotu naplnφme p°edem urΦen²mi daty.

 

P°i prßci s registry je zapot°ebφ odliÜovat dva pojmy: jmΘno hodnoty a data hodnoty. Zatφmco jmΘno hodnoty p°edstavuje textov² °et∞zec, kter² hodnotu u₧ivatelsky deklaruje, data hodnoty determinujφ hodnotu po datovΘ strßnce. JednoduÜe °eΦeno, data hodnoty jsou vlastnictvφm hodnoty, a jsou to prßv∞ data, kterΘ jsou p°edm∞tem vstupn∞-v²stupnφch operacφ p°i prßci s registry. Mezi data hodnoty mohou pat°it Φφsla, textovΘ °et∞zce, nebo specifickΘ konstanty.á

 

Registry operaΦnφho systΘmu jsou velmi d∙le₧itou entitou, a to jak ve vztahu k nainstalovan²m aplikacφm, tak i v∙Φi samotnΘmu operaΦnφmu systΘmu. P°ed zßsahem do registr∙ prove∩te v₧dy nejprve jejich zßlohu. P°i zßsazφch do registr∙ se ujist∞te, ₧e nemodifikujete ·daje, kterΘ byly zapsßny jinou aplikacφ a p°φmo upravujte jenom ty informace, kterΘ jste do registr∙ sami zapsali.á

 

Demonstrace starΘ koncepce p°φstupu k registr∙m

Postupujte podle nßsledujφcφch instrukcφ:

 

  1. Spus¥te Visual Basic .NET a vytvo°te novou aplikaci pro Windows (Windows Application).
  2. Na formulß° p°idejte dv∞ instance ovlßdacφho prvku Button, p°iΦem₧ jednu pojmenujte jako btnZßpisHodnot a druhou zase btn╚tenφHodnot. Rovn∞₧ vhodn∞ upravte vlastnost Text obou instancφ. á
  3. Udßlostnφ proceduru Click instance btnZßpisHodnot upravte takto:

 

ááá Private Sub btnZßpisHodnot_Click(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs) Handles btnZßpisHodnot.Click

ááááááá SaveSetting("MojeAplikace", "Data", "ID aplikace", "1001")

ááá End Sub

 

  1. Udßlostnφ proceduru Click instance btn╚tenφHodnot modifikujte tφmto zp∙sobem:

 

ááá Private Sub btn╚tenφHodnot_Click(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs) Handles btn╚tenφHodnot.Click

ááááááá MessageBox.Show("ID aplikace je: " & _

ááááááá GetSetting("MojeAplikace", "Data", "ID aplikace"))

ááá End Sub

 

  1. Spus¥te aplikaci (F5) a klepn∞te nejprve na tlaΦφtko pro zßpis hodnot do registr∙ a potΘ aktivujte druhΘ tlaΦφtko. M∞li byste obdr₧et informace o datech hodnoty klφΦe \MojeAplikace\Data\ID aplikace. Podφvßte-li se do registr∙, uvidφte, ₧e byl vytvo°en p°φsluÜn² klφΦ a byla mu p°i°azena hodnota (obr. 1).

 

 

Obr. 1 û Pou₧itφ funkcφ SaveSetting a GetSetting pro p°φstup k hodnot∞ ulo₧enΘ v registrech

 

Demonstrace novΘ koncepce p°φstupu k registr∙m

Jak jsme si ji₧ °ekli, p°i pou₧itφ tΘto koncepce se vyhneme pou₧itφ funkcφ typu SaveSetting a GetSetting. Mφsto nich toti₧ povolßme k prßci specializovanΘ t°φdy Registry a RegistryKey z jmennΘho prostoru Microsoft.Win32. Postupujte takto:

 

  1. RozÜi°te stßvajφcφ kolekci instancφ ovlßdacφho prvku Button o dalÜφ dv∞, kterΘ pojmenujte jako btnZßpisHodnot2 a btn╚tenφHodnot2 (op∞t upravte takΘ hodnoty vlastnosti Text obou instancφ).
  2. P°ed k≤d t°φdy formulß°e (implicitn∞ Form1) vlo₧te nßsledujφcφ °ßdek pro vlo₧enφ jmennΘho prostoru Microsoft.Win32:

 

Imports Microsoft.Win32

 

  1. Udßlostnφ proceduru Click instance btnZßpisHodnot2 pozm∞≥te nßsledovn∞:

 

ááá áááá

ááá Private Sub btnZßpisHodnot2_Click(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs) Handles btnZßpisHodnot2.Click

ááááááá Dim reg As RegistryKey

ááááááá reg = Registry.LocalMachine.CreateSubKey("Software\MojeAplikace\Data")

ááááááá reg.SetValue("ID aplikace", "1002")

ááá End Sub

 

Pohled do registr∙ p°ibli₧uje obr. 2.

 

 

Obr. 2 û Pou₧itφ t°φd Registry a RegistryKey pro p°φstup k hodnot∞ ulo₧enΘ v registrech

 

I kdy₧ op∞t vytvß°φme klφΦ se stejn²m nßzvem, v tomto p°φpad∞ je klφΦ ulo₧en do jinΘ sekce registr∙ (p°esn∞ji do HKEY_LOCAL_MACHINE\Software). Abychom zφskali p°φstup do tΘto sekce registr∙, musφme pou₧φt t°φdu Registry a jejφ ve°ejn² sdφlen² datov² Φlen LocalMachine. Pro vytvo°enφ novΘho klφΦe pou₧ijeme metodu CreateSubKey, kterΘ p°edßme dopl≥kovou cestu ke klφΦi v uvedenΘ podob∞ (plnß cesta k naÜemu klφΦi vypadß takto: HKEY_LOCAL_MACHINE\Software\MojeAplikace\Data). Nßvratovou hodnotou metody CreateSubKey je instance t°φdy RegistryKey, p°iΦem₧ odkaz na tuto instanci je ulo₧en do prom∞nnΘ reg. Dobrß, v tΘto chvφli mßme vytvo°en klφΦ, ovÜem nßÜ ·kol jeÜt∞ nenφ spln∞n. Abychom klφΦi p°i°adili hodnotu a hodnotu asociovali s platn²mi daty, zavolßme metodu SetValue, kterß nabφdneme jmΘno hodnoty ve tvaru datovΘho typu String ("ID aplikace") a data hodnoty (1002).

 

Budete-li chtφt data hodnoty naΦφst, upravte udßlostnφ proceduru btn╚tenφHodnot2_Click tak, jak je uvedeno nφ₧e:

 

ááá Private Sub btn╚tenφHodnot2_Click(ByVal sender As System.Object, _

ááá ByVal e As System.EventArgs) Handles btn╚tenφHodnot2.Click

ááááááá Dim reg2 As RegistryKey

ááááááá reg2 = Registry.LocalMachine.OpenSubKey("Software\MojeAplikace\Data", False)

ááááá ááMessageBox.Show("Hodnota zapsanß v registrech: " & _

ááááááá CStr(reg2.GetValue("ID aplikace")))

ááá End Sub

 

Abychom otev°eli po₧adovan² registrov² klφΦ, zavolßme metodu OpenSubKey. V naÜem p°φpad∞ je pou₧ita p°etφ₧enß varianta metody, kterß pracuje se dv∞ma parametry: prvnφm je nßzev klφΦe a druh²m pak booleovskß hodnota, kterß urΦuje, zdali je mo₧nΘ hodnotu klφΦe modifikovat. K dat∙m hodnoty se dostaneme pomocφ metody GetValue, kterß poskytneme jmΘno hodnoty, data kterΘ chceme obdr₧et. Metoda GetValue vracφ data hodnoty (v podob∞ datovΘho typu Object), kterß jsou v naÜφ ukßzce p°etypovßna do podoby datovΘho typu String a zobrazena v dialogu.

 

Zp∞t na obsah

 

Vytvß°enφ vlastnφho delegßta

 

P°echßzφte-li na programovßnφ pro platformu .NET, zcela jist∞ si zanedlouho vÜimnete specißlnφho programovacφho aparßtu, kter² se doposud v programovßnφ nevyskytoval. Ano, touto novinkou jsou delegßti, neboli objekty, kterΘ usnad≥ujφ p°φstup k metodßm a funkcφm jin²ch objekt∙ za b∞hu programu. O delegßtech se Φasto mluvφ jako o typov∞ bezpeΦn²ch funkΦnφch ukazatelφch. Pokud pat°φte mezi programßtory v C/C++, mohli byste namφtat, ₧e funkΦnφ ukazatele jsou tady ji₧ n∞jak² ten pßtek, tak jakß₧to novinka. OvÜem, v jistΘm smyslu mßte pravdu, avÜak t°eba zd∙raznit, ₧e delegßty nabφzejφ daleko v∞tÜφ funkcionalitu ne₧li opravdovΘ funkΦnφ ukazatele. Krom∞ toho, s delegßty m∙₧ete pracovat v mnoha .NET jazycφch, nap°. v C# Φi Managed Extensions for C++.

 

V dneÜnφ ukßzce si p°edvedeme, jak sestrojit vlastnφho delegßta. JeÜt∞ p°edtφm se vÜak podφvejme na zßkladnφ zp∙sob prßce delegßta. Delegßt je objekt, jen₧ m∙₧e za b∞hu aplikace zφskat runtime adresu po₧adovanΘ procedury a poslΘze tuto proceduru aktivovat. Ve skuteΦnosti ovÜem m∙₧e delegßt aktivovat jakoukoliv proceduru, kterß mß stejn² seznam parametr∙ a stejnou nßvratovou hodnotu jako samotn² delegßt. Delegßt tak nemusφ nutn∞ volat jednu a tu samou proceduru, nebo¥ je schopen aktivovat libovolnou proceduru, kterß vyhovuje po₧adovan²m podmφnkßm. Rozhodnutφ, kterou proceduru zavolat, lze vy°eÜit a₧ za b∞hu aplikace. áá

 

 

Obr. 3 û SchematickΘ znßzorn∞nφ prßce delegßta

 

A nynφ si uka₧me, jak p°istoupit k tvorb∞ delegßta:

 

  1. Spus¥te Visual Basic .NET a vytvo°te aplikaci pro Windows (Windows Application).
  2. Na plochu formulß°e klepn∞te prav²m tlaΦφtkem myÜi a z kontextovΘ nabφdky vyberte polo₧ku View Code.
  3. Programov² k≤d t°φdy Form1 upravte podle nφ₧e uvedenΘho vzoru:

 

Option Strict On

'Vlo₧enΘ odkazy na pot°ebnΘ jmennΘ prostory.

Imports System.Drawing

Imports System.Drawing.Drawing2D

 

Public Class Form1

ááá Inherits System.Windows.Forms.Form

 

ááá 'Deklarace delegßta.

ááá Private Delegate Function Delegßt() As Boolean

 

ááá '****** Deklarace prvnφ cφlovΘ funkce. ******

ááá 'Funkce vytvß°φ instanci t°φdy ListBox, do kterΘ budou ulo₧ena

ááá 'nßhodn∞ vygenerovanß Φφsla.

ááá Private Function MojeFunkce() As Boolean

ááááááá Try

ááááááááááá 'Vytvo°enφ instance t°φdy ListBox a jejφ umφst∞nφ

ááááááááááá 'do kolekce ovlßdacφch prvk∙ formulß°e.

ááááááááááá Dim lstSeznam As New ListBox()

ááááááááááá With lstSeznam

ááááááááááááááá .Location = New Point(0, 0)

ááááááááááááááá .Size = New Size(Me.Width \ 2, Me.Height \ 2)

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

ááááááááááá Me.Controls.Add(lstSeznam)

 

ááááááááááá 'V²poΦet druhΘ mocniny Φφsel z intervalu <0, 9>.

ááááááááááá Dim a As Byte

ááááááááááá a = 0

ááááááááááá Do While a < 10

ááááááááááááááá Dim x As Short

ááááááááááááááá x = CShort(a ^ 2)

ááááááááááááááá lstSeznam.Items.Add(x)

ááááááááááááááá a += CByte(1)

ááááááááááá Loop

ááááááááááá 'Zachycenφ jakΘkoliv v²jimky, kterß by mohla b²t generovßna.

ááááááá Catch e As Exception

ááááááááááá 'Dojde-li k chyb∞, funkce je ukonΦena a vracφ hodnotu False.

ááááááááááá Return False

ááááááá End Try

ááááááá 'P°i ·sp∞ÜnΘm ukonΦenφ funkce je vrßcena hodnota True.

ááááááá Return True

ááá End Function

 

ááá '****** Deklarace druhΘ cφlovΘ funkce. ******

ááá 'Funkce vypl≥uje plochu formulß°e gradientnφ v²plnφ.

ááá Private Function MojeKreslφcφFunkce() As Boolean

ááááááá Try

ááááááááááá 'Vytvo°enφ instance t°φdy Rectangle

ááááááááááá Dim rec As New Rectangle(New Point(0, 0), _

ááááááááááááááááááá New Size(Me.Width, Me.Height))

ááááááááááá 'Vytvo°enφ grafickΘho Üt∞tce pomocφ t°φdy LinearGradientBrush

ááááááááááá Dim br As New LinearGradientBrush(rec, Color.Gold, _

ááá ááááááááColor.Magenta, LinearGradientMode.ForwardDiagonal)

ááááááááááá 'Vytvo°enφ grafickΘho objektu

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

ááááááááááá 'Kreslenφ gradientnφ v²pln∞.

ááááááááááá g.FillRectangle(br, rec)

ááááááá Catch e As Exception

ááááááááááá 'Dojde-li k chyb∞, funkce je ukonΦena a vracφ hodnotu False.

ááááááááááá Return False

ááááááá End Try

ááááááá 'P°i ·sp∞ÜnΘm ukonΦenφ funkce je vrßcena hodnota True.

ááááááá Return True

ááá End Function

 

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

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

ááááááá 'Inicializace generßtoru nßhodn²ch Φφsel na bßzi systΘmovΘho Φasu

ááááááá Randomize()

ááááááá 'Deklarace prom∞nnΘ, ve kterΘ bude ulo₧eno zφskanΘ

ááááááá 'nßhodnΘ Φφslo

ááá ááááDim sHodnota As Short

ááááááá 'Vytvo°enφ referenΦnφ prom∞nnΘ, kterß bude uchovßvat odkaz

ááááááá 'na pozd∞ji vytvo°enou instanci delegßta

ááááááá Dim InstanceDelegßta As Delegßt

ááááááá 'Generovßnφ nßhodnΘho Φφsla z intervalu <1,10>

ááááááá sHodnota = CShort(Int(10 * Rnd()) + 1)

ááááááá 'Jestli₧e je vygenerovanΘ Φφslo z intervalu <1,5> tak...

ááááááá If sHodnota >= 1 And sHodnota <= 5 Then

ááááááááááá 'Vytvo°enφ instance delegßta, kterß obsahuje

ááááááááááá 'runtime adresu funkce MojeFunkce

ááááááááá ááInstanceDelegßta = New Delegßt(AddressOf MojeFunkce)

ááááááááááá 'jinak...

ááááááá Else

ááááááááááá 'Vytvo°enφ instance delegßta, kterß obsahuje runtime

ááááááááááá 'adresu funkce MojeKreslφcφFunkce

ááááááááááá InstanceDelegßta = New Delegßt(AddressOf MojeKreslφcφFunkce)

ááááááá End If

ááááááá 'Test nßvratovΘ hodnoty cφlovΘ funkce

ááááááá If InstanceDelegßta.Invoke() Then

ááááááááááá Me.Text = "Funkce byla ·sp∞Ün∞ zavolßna."

ááááááá Else

ááááááááááá Me.Text = "P°i prßci funkce doÜlo k potφ₧φm."

ááááááá End If

ááá End Sub

End Class

 

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

Programovßnφ vφcevlßknov²ch aplikacφ

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

Klasifikace operßtor∙, aritmetickΘ a porovnßvacφ operßtory.

 

Nep°ehlΘdn∞te exkluzivnφ Specißl pro programßtory, kter² pojednßvß o jazykovΘ interoperabilit∞ mezi jazyky Managed Extensions for C++ a Visual Basic .NET.