|
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
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:
Obr. 1 û Zapnutφ optimalizace kompilßtora v okn∞ Property
Pages
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.
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:
Dobrß, tolik °φkß teorie a te∩ se podφvejme, jak vypadß deklarace voliteln²ch parametr∙ v praxi. Postupujte dle t∞chto instrukcφ:
ááá 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∞.á
áááááá 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). |
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.
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. |
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
Jßn Hanßk