ZaΦßteΦnφk

PokroΦil²

Profesionßl

Prostor pro experimentovßnφ

Programßtorskß laborato°

 

Budete pot°ebovat p°ibli₧n∞ 1 hodinu

OperaΦnφ systΘm pou₧it² v p°φsp∞vku: Windows 2000

V²vojovΘ nßstroje: Visual Basic .NET

 

 

 

Aktivace optimalizace kompilßtora

Pou₧itφ voliteln²ch (optional) parametr∙

Jak zjistit, zdali byla stisknuta klßvesa Enter

Ukßzka prßce strukturovanΘ sprßvy chyb

Tvorba kontextovΘ nabφdky klonovßnφm

 

 

Aktivace optimalizace kompilßtora

 

Pokud pracujete ve VB .NET, tento typ bude pro vßs zcela jist∞ u₧iteΦn². Ka₧d² programßtor se jednou dostane do situace, kdy zatou₧φ po rychlejÜφm provßd∞nφ svΘho programovΘ k≤du. Jak mo₧nß vφte, Φas strßven² peΦliv²m studiem k≤du a prom²Ülenφm, jak zefektivnit tu Φi onu proceduru nebo funkci, b²vß leckdy ne·nosn∞ dlouh². Jestli₧e pat°φte do skupiny programßtor∙, kte°φ by pro optimalizaci k≤du ud∞lali tak°ka vÜechno, vyzkouÜejte nßsledujφcφ postup:

 

  1. Spus¥te VB .NET a otev°ete vßÜ projekt.
  2. V okn∞ Pr∙zkumnφka °eÜenφ (Solution Explorer) klepn∞te prav²m tlaΦφtkem myÜi na nßzev vaÜφ aplikace. M∞la by se objevit kontextovß nabφdka. Z nabφdky vyberte poslednφ polo₧ku Properties. Za okam₧ik se zobrazφ okno Property Pages.
  3. Zam∞°te svou pozornost na seznam, jen₧ se nachßzφ v levΘ Φßsti dialogovΘho okna. V seznamu klepn∞te na polo₧ku Configuration Properties.á
  4. Aktivovanß polo₧ka se ärozbalφô a ukß₧e vßm sv∙j obsah. V tΘto chvφli klepn∞te na p°φkaz Optimizations.
  5. Zatrhn∞te pole Enable optimizations (obr. 1).

 

 

Obr. 1 û Zapnutφ optimalizace kompilßtora v okn∞ Property Pages

 

  1. Aktivujte tlaΦφtko OK.

 

Jakmile v budoucnu vydßte p°φkaz na sestavenφ aplikace .NET, kompilßtor pou₧ije r∙znß optimalizaΦnφ nastavenφ. P°i svΘ prßci se bude sna₧it, aby vygenerovan² v²stup byl kapacitn∞ mΘn∞ nßroΦn², rychlejÜφ a efektivn∞jÜφ.

 

Proto₧e kompilßtor p°i svΘ prßci m∙₧e v zßsadnφ mφ°e zm∞nit strukturu programovΘho k≤du na ·rovni jazyka MSIL, m∙₧ete mφt po sestavenφ aplikace se zapnutou optimalizacφ kompilßtoru problΘmy s pozd∞jÜφm dalÜφm odla∩ovßnφm tΘto aplikace. Proto se doporuΦuje, abyste automatickou optimalizaci kompilßtoru pou₧φvali jenom pro pln∞ odlad∞nou aplikaci, kterß je generovßna v re₧imu Release.

 

AΦkoliv se jednß o automatickou optimalizaci, je mo₧nΘ, ₧e v n∞kter²ch p°φpadech dosßhnete nav²Üenφ v²konu vaÜφ aplikace. Nem∞li byste ovÜem oΦekßvat, ₧e zapnutφ uvedenΘ optimalizaΦnφ volby zcela nahradφ komplexnφ proces peΦlivΘ kontroly a ämanußlnφô optimalizace programovΘho k≤du vaÜφ aplikace.

 

Zp∞t na obsah

 

Pou₧itφ voliteln²ch (optional) parametr∙á

á

Pod pojmem voliteln² parametr se rozumφ parametr v signatu°e funkce nebo procedury Sub, kter² je uveden klφΦov²m slovem Optional. Pro volitelnΘ parametry platφ nßsledujφcφ pravidla:

 

  1. VÜem voliteln²m parametr∙m musejφ b²t p°i°azeny inicializaΦnφ hodnoty.
  2. InicializaΦnφ hodnota musφ mφt konstantnφ povahu (nap°. hodnota volitelnΘho parametru m∙₧e b²t inicializovßna numerickou konstantou).
  3. Ka₧d² parametr, jen₧ nßsleduje za voliteln²m parametrem musφ b²t rovn∞₧ voliteln² (nenφ tedy p°φpustnΘ mφchat povinnΘ a volitelnΘ parametry v signatu°e funkce Φi procedury).

 

Dobrß, tolik °φkß teorie a te∩ se podφvejme, jak vypadß deklarace voliteln²ch parametr∙ v praxi. Postupujte dle t∞chto instrukcφ:

 

  1. ZapiÜte do okna editoru pro zßpis programovΘho k≤du k≤d funkce PropoΦet:

 

ááá Private Function PropoΦet _

ááá (ByVal cena As Single, _

á ááOptional ByVal mno₧tvφ As Integer = 10) As Single

 

ááááááá MessageBox.Show((cena * mno₧tvφ).ToString)

áEnd Function

 

Jde o soukromou funkci, kterß vypoΦφtßvß cenu obstarßnφ n∞jakΘ komodity. Funkce pracuje se dv∞ma parametry. Prvnφm parametrem je cena v²robku v podob∞ datovΘho typu Single. Druh² parametr p°edstavuje nakoupenΘ mno₧stvφ v²robk∙ a jak si m∙₧ete vÜimnout, jde o voliteln² parametr, kterΘho datov² typ je Integer. Jak ji₧ vφte, voliteln² parametr musφ b²t inicializovßn (zde na hodnotu deseti kus∙ v²robk∙). V²sledkem prßce funkce je v²poΦet celkovΘ ceny obstarßnφ, kterß se poslΘze zobrazφ v dialogovΘm okn∞.á

 

  1. Zkuste p°idat na formulß° tlaΦφtko a do zpracovatele udßlosti Click tlaΦφtka umφst∞te tento °ßdek k≤du:

 

áááááá Call PropoΦet(100.5)

 

V p°φpad∞, ₧e nezadßte mno₧stvφ v²robk∙, kterΘ jste nakoupili, pou₧ije se standardnφ mno₧stvφ (10 ks). Takto by vßs cel² nßkup stßl rovn²ch 1005 korun. Jestli₧e budeme abstrahovat od obchodnφch zßle₧itostφ a budeme se soust°edit jenom na programov² k≤d, m∙₧eme °φct, ₧e prßv∞ toto je hlavnφ ·kol volitelnΘho parametru. Kdy₧ toti₧ nenφ zadßna hodnota druhΘho parametru, pou₧ije se p°edem stanovenß hodnota, co₧ uÜet°φ trochu nßmahy p°i psanφ signatury funkce. Pokud vÜak chcete, m∙₧ete hodnotu druhΘho parametru zm∞nit, t°eba na 20:

 

á

áááááá Call PropoΦet(100.5, 20)

 

P°i zßpisu hodnoty druhΘho parametru vßm op∞t pom∙₧e technologie IntelliSense a povφ vßm, ₧e druh² parametr je voliteln² a rovn∞₧ zobrazφ i jeho konstantnφ hodnotu. Jenom p°ipomenu, ₧e volitelnost druhΘho parametru je v popisku indikovßna p°φtomnostφ hranat²ch zßvorek (viz obrßzek).

 

 

  1. I tentokrßt se vypoΦte sprßvnß hodnota, kterou uvidφte v dialogovΘm okn∞.

 

Zp∞t na obsah

 

Jak zjistit, zdali byla stisknuta klßvesa Enter

 

Zjistit, zdali byla aktivovßna klßvesa Enter, lze pom∞rn∞ jednoduÜe pomocφ nßsledujφcφho k≤du:

 

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

ááá ByVal e As System.Windows.Forms.KeyPressEventArgs) _

ááá Handles TextBox1.KeyPress

 

ááááááá If e.KeyChar = Microsoft.VisualBasic.ChrW(13) Then

ááááááááááá MessageBox.Show("Byla aktivovßna klßvesa ENTER.")

ááááááá End If

 

ááá End Sub

 

V uvedenΘm v²pisu se p°edpoklßdß, ₧e na formulß°i se nachßzφ textovΘ pole s nßzvem TextBox1. A jak pracuje uveden² k≤d? SkuteΦnost, zdali byla po₧adovanß klßvesa stisknuta Φi nikoliv, budeme testovat v obsluze udßlosti KeyPress textovΘho pole. K udßlosti KeyPress dojde v₧dy, kdy₧ u₧ivatel stiskne klßvesu, kterß disponuje p°φsluÜn²m ASCII k≤dem. Mezi takovΘto klßvesy pat°φ alfabetickΘ a numerickΘ klßvesy, podobn∞ jako i n∞kterΘ jinΘ klßvesy (jako je nap°. klßvesa Enter). Aby bylo mo₧no rozeznat, kterß klßvesa byla stisknuta, m∙₧eme testovat hodnotu vlastnosti KeyPressEventArgs.KeyChar. Na identifikaci klßvesy Enter pou₧ijeme funkci ChrW. TΘto funkci jako parametr p°edßme ASCII k≤d klßvesy Enter, kter² je reprezentovßn Φφselnou hodnotou 13. V₧dy, kdy₧ u₧ivatel zapφÜe do textovΘho pole n∞kolik znak∙, testujeme, zdali ASCII k≤d zadanΘho znaku neodpovφdß ASCII k≤du klßvesy Enter. Je-li tomu tak, zobrazφ se dialogovΘ okno se zprßvou, kterß °φkß, ₧e byla zmßΦknuta hledanß klßvesa.

 

Zp∞t na obsah

 

Ukßzka prßce strukturovanΘ sprßvy chyb

 

VB .NET p°ichßzφ s novinkami takΘ v oblasti oÜet°ovßnφ chyb a odla∩ovßnφ program∙. St°etßvßme se zde s tzv. strukturovanou sprßvou chyb, podstatu kterΘ si ihned vysv∞tφme. Jestli₧e mßte zkuÜenosti s VB 6.0, bude pro vßs lepÜφ, kdy₧ budou p°edstaveny oba systΘmy sprßvy chyb (tak ve VB 6.0, jako i ve VB .NET) a vy budete moci porovnat prezentovanΘ rozdφlnosti.

 

Pokud jste cht∞li ve VB 6.0 vlo₧it do funkce nebo procedury chybovou rutinu, ve v∞tÜin∞ p°φpad∙ programov² k≤d tΘto chybovΘ rutiny vypadal asi takto:

 

Private Sub btn1_Click()

On Error GoTo Napravit_chybu

 

Dim x As Integer, y As Integer

x = 1000

y = 0

 

Me.Caption = x \ y

 

Exit Sub

 

Napravit_chybu:

MsgBox "Tuto operaci nelze provΘst."

End Sub

 

V p°φklad∞ m∙₧ete pozorovat autorovu snahu o vyvolßnφ chyby Φ. 11 s nßzvem Division by zero (D∞lenφ nulou). Proto₧e takovßto operace je z matematickΘho hlediska nep°φpustnß, vyskytne se chyba. Aby jsme mohli chybu tohoto typu oÜet°it, vklßdßme do programovΘho k≤du konstrukci On Error Goto Nßv∞stφ, kde Nßv∞stφ p°edstavuje tu sekci k≤du, kterß se mß provΘst v p°φpad∞, ₧e dojde v programu k chyb∞. Kdy₧ se vrßtφme k uvedenΘmu k≤du, uvidφme, ₧e nßzev Nßv∞stφ je Napravit_chybu. M∙₧eme tedy °φci, ₧e v₧dy, kdy₧ dojde v tΘto udßlostnφ procedu°e k chyb∞, exekuce programu bude pokraΦovat provßd∞nφm k≤du, jen₧ je umφst∞n pod nßzvem Nßv∞stφ (tedy pod °et∞zcem Napravit_chybu).

 

Poj∩me se nynφ podφvat na to, jakß je situace v tomto sm∞ru ve VB .NET. Pro analogii pou₧ijeme ji₧ uvedenou podobu programovΘho k≤du (i kdy₧ samoz°ejm∞ uzp∙sobenou pro novou verzi jazyka) a budeme pozorovat rozdφly.

 

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

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

ááááááá Try

ááááááááááá Dim x, y As Integer

ááááááááááá x = 1000

ááááááááááá y = 0

 

ááááááááááá Me.Text = x \ y

áááááá áCatch

ááááááááááá MessageBox.Show("Tuto operaci nelze provΘst.")

ááááááá End Try

ááá End Sub

áá

Zde mßte mo₧nost vid∞t ukßzku prßce modernφ strukturovanΘ sprßvy chyb. O co vlastn∞ jde? ZjednoduÜen∞ lze prohlßsit, ₧e vÜechen k≤d, o kterΘm si myslφme, ₧e by mohl zp∙sobit jakoukoliv chybu, umφstφme do bloku Try. V bloku Try dßle vytvo°φme jeden (nebo i n∞kolik) blok∙ Catch. Blok Catch obsahuje programov² k≤d pro oÜet°enφ vzniklΘ chyby. Kdy₧ tedy dojde k chyb∞, exekuce programu se p°enese do bloku Catch a provede se ten k≤d, jen₧ se v danΘm bloku nachßzφ (p°esn∞ji dojde k zobrazenφ chybovΘho hlßÜenφ pomocφ t°φdy MessageBox). Celou chybovou rutinu uzavφrß p°φkaz End Try.

 

Jenom pro zajφmavost p°ipomenu, ₧e i v prost°edφ jazyka VB .NET m∙₧ete pou₧φvat starÜφ (nestrukturovanou) sprßvu chyb prost°ednictvφm konstrukce On Error Goto Nßv∞stφ. P°esto₧e je tento zp∙sob oÜet°ovßnφ chyb stßle podporovßn, m∞li byste dßt p°ednost novΘ koncepci psanφ chybov²ch rutin.

 

Zp∞t na obsah

 

Tvorba kontextovΘ nabφdky klonovßnφm

áá

Nßplnφ poslednφ programovΘ ukßzky bude zhotovenφ kontextovΘ nabφdky klonovßnφm jednΘ z nabφdek hlavnφho menu programu. P°itom tak hlavnφ nabφdku, jako i kontextußln∞ vßzanou nabφdku vytvo°φme pomocφ programovΘho k≤du. Podφvejte se nejprve na samotn² k≤d a pak si k n∞mu °ekneme pßr slov.

 

ááááááá Dim hlavnφ_nabφdka As New MainMenu()

ááááááá Dim nabφdka1 As New MenuItem()

ááááááá nabφdka1.Text = "Nabφdka Φ.1"

ááááááá hlavnφ_nabφdka.MenuItems.Add(nabφdka1)

ááááááá nabφdka1.MenuItems.Add("Polo₧ka Φ.1")

ááááááá Me.Menu = hlavnφ_nabφdka

 

 

ááááááá Dim kontextovß_nabφdka As New ContextMenu()

ááááááá kontextovß_nabφdka.MenuItems.Add(nabφdka1.CloneMenu())

 

ááááááá TextBox1.ContextMenu = kontextovß_nabφdka

á

V prvnφ °ad∞ je pot°ebnΘ vytvo°it novou hlavnφ nabφdku (hlavnφ_nabφdka). Dßle vytvo°φme jednu parcißlnφ nabφdku (nabφdka1), kterou poslΘze p°idßme do hlavnφ nabφdky. Do prßv∞ vytvo°enΘ parcißlnφ nabφdky p°idßme pomocφ metody Add jednu polo₧ku. Nakonec urΦφme, ₧e hlavnφ nabφdka se mß stßt prßvoplatnou nabφdkou aktivnφ instance formulß°e.

 

NaÜe dalÜφ ·silφ je spojenΘ s tvorbou kontextußln∞ vßzanΘ nabφdky (s nßzvem kontextovß_nabφdka). Prßv∞ v tΘto chvφli se dostßvßme k zlatΘmu h°ebφku p°edstavenφ, kter²m je aplikace metody CloneMenu. Tato metoda vytvß°φ p°esnou kopii parcißlnφ nabφdky nabφdka1 (a vÜech souΦßstφ tΘto nabφdky). Kopie je nßsledn∞ p°i°azena kontextovΘ nabφdce. Poslednφ °ßdek pak determinuje, ₧e vytvo°enß kontextovß nabφdka se bude vztahovat na po₧adovanou instanci ovlßdacφho prvku TextBox.

 

Pro praktickΘ vyzkouÜenφ prßce programovΘho k≤du m∙₧ete na formulß° umφstit jednu instanci ovlßdacφho prvku Button a rovn∞₧ jednu instanci ovlßdacφho prvku TextBox. Udßlostnφ proceduru Click tlaΦφtka vypl≥te uveden²m k≤dem a spus¥te testovacφ aplikaci. Klepn∞te nejd°φve na tlaΦφtko. Uvidφte, ₧e se vytvo°φ hlavnφ nabφdka, parcißlnφ nabφdka a jedna polo₧ka tΘto nabφdky. Kdy₧ klepn∞te prav²m tlaΦφtkem myÜi na instanci ovlßdacφho prvku TextBox, objevφ se kontextovß nabφdka, kterß vznikla klonovßnφm (obr. 2).

 

 

Obr. 2 û Kontextovß nabφdka vytvo°enß klonovßnφm

 

Zp∞t na obsah

 

 

Jßn Hanßk