cool web a perfektni rs- Doporucuji

Saturday, June 30, 2007

Vysvětlivky pro textová pole (nebo jiné ovládací prvky)

Možná u textového pole postrádáte vlastnost, která by se jmenovala ToolTipText nebo tak nějak. Chceteli
k oběma textovým polím připojit vysvětlivky (okénka se žlutým podkladem, která se objevují, když uživatel
umístí na ovládací prvek kurzor myši), dá se to pohodlně udělat pomocí neviditelné komponenty, která se
jmenuje ToolTip. Postupujte takto:
1. V návrhovém zobrazení hlavního formuláře klepněte v soupravě nástrojů na tlačítko WinForms,
pak na nástroj ToolTip a klepněte na formuláři.
2. Na podnos neviditelných komponent se přidá ikona ovládacího prvku ToolTip s výchozím názvem
ToolTip1.
3. Klepněte pravým tlačítkem myši na textovém poli txtKredit a z místní nabídky zvolte Properties.
4. Nastavte vlastnost ToolTip on ToolTip1 na Zadejte částku, kterou chcete obětovat.
5. Obdobně klepněte pravým tlačítkem myši na textovém poli txtSázka, a z místní nabídky zvolte
Properties a nastavte vlastnost ToolTip on ToolTip1 na Kolik chcete vsadit na jedno roztočení.
Ovládací prvek ToolTip je vybaven několika vlastnostmi, které umožňují stanovit určité časové údaje
(prodlevy) v milisekundách, které souvisejí s okénkem vysvětlivky:
AutomaticDelay udává dobu, po jejíž uplynutí se vysvětlivka objeví (výchozí hodnota je 500).
AutoPopDelay udává, jak dlouho bude vysvětlivka vidět, když je na ovládacím prvku kurzor myši
(výchozí je 10 * AutomaticDelay)
InitialDelay udává, jak dlouho musí být kurzor myši na ovládacím prvku, aby se vysvětlivka zobrazila
(výchozí hodnota je jako AutomaticDelay).
Reshow udává, jak dlouho to trvá, než se vysvětlivka objeví, když se přechází mezi různými oblastmi
ovládacího prvku ToolTip (výchozí je pětina AutomaticDelay).

Labels:

Wednesday, June 27, 2007

Textová pole pro kredit a sázku

Výchozí hodnoty pro kredit a velikost sázky můžete nastavit už v návrhovém režimu, v naší ukázce tyto
hodnoty nastavíte v kódu formuláře. Pod řádek uvozený ‘TODO ve vygenerovaném kódu formuláře přidejte tyto
příkazy:
txtKredit.Text = "1000"
txtSázka.Text = "10"
U textových polí lze docílit mnohé funkčnosti pouhým nastavením vlastností. Připomenu alespoň několik
z nich, které se v praxi často využívají. Předně, zobrazený text je hodnota vlastnosti Text. Jak je vidět z výše
uvedených příkazů, lze ji nastavovat i při běhu. Do textového pole lze zapsat až 2048 znaků. Délku textu lze
omezit nastavením vlastnosti MaxLength. Potřebujete-li víc, vytvořte víceřádkové textové pole. Uděláte to
tak, že nastavíte vlastnost MultiLine na True. Pak budete moci textové pole obsahovat až 32K textu.
Zalamování textu ovlivňuje vlastnost WordWrap, posuvníky přidáte pomocí vlastnosti ScrollBars. Je-li
textové pole určeno pouze pro čtení, nastavte vlastnost ReadOnly na True. Chcete-li, aby se text zobrazoval
odprava, nastavte vlastnost TextAlign na Right.
Převod zapsaného textu na velká či malá písmena (v našem případě to nemá smysl, protože pracujeme
pouze s číslicemi) zajistí vhodné nastavení vlastnosti CharacterCasing (na Upper, resp. Lower). Má-li se do
textového pole psát heslo, které nemá být vidět, docílíte to nastavením vlastnosti PasswordChar na zvolený
znak (obvykle se používá hvězdička, *). Pak se místo zapisovaných znaků budou objevovat hvězdičky.
Konečně, potřebujete-li (z kódu) vybírat text zobrazený v textovém poli nebo jeho část, využijte vlastnosti
SelectionStart a SelectionLength. SelectionStart určuje pozici kurzoru (nula znamená, že se kurzor umístí
nalevo od prvního znaku). SelectionLength určuje délku právě vybraného textu, resp. počet znaků od pozice
kurzoru, které chcete vybrat. Požadované akce se obvykle programují v událostní proceduře GotFocus textového
pole.

Labels:

Tuesday, June 26, 2007

Přidání ovládacích prvků na formulář

Teď začnete přidávat na formulář potřebné ovládací prvky (viz obrázek běžícího formuláře parametrů dále
v textu).
1. Nastavte tyto vlastnosti formuláře: Text na Zadání parametrů pro automat, BorderStyle na
Fixed Dialog, MinimizeBox a MaximizeBox na False.
2. Na formulář přidejte popisek (ovládací prvek Label) a nastavte jeho vlastnosti Text na K&redit
}v Kč). Znak ampersand (&) v popisku poslouží jako přístupová klávesa pro sdružené textové pole,
do něhož bude hráč zadávat kredit.
3. Přidejte na formulář textové pole pro kredit. Nazvěte ho txtKredit.
Protože jste textové pole umístili na formulář těsně po popisku, který se k němu vztahuje, bude
v tabelátorovém řazení prvků bezprostředně následovat za popiskem. Proto přístupová klávesa popisku
bude vlastně simulovat přístupovou klávesu textového pole (popisek je totiž jeden z ovládacích
prvků, který nemůže uživatel aktivovat (prvek nemůže „získat fokus“).
4. Obdobně sestrojte popisek a textové pole pro velikost sázky. Nazvěte textové pole txtSázka.
5. Přidejte na formulář dvě příkazová tlačítka, nastavte jejich vlastnosti Name na btnPokračovat,
resp. btnKonec a hodnotu vlastností Text na &Pokračovat, resp. &Konec.
6. Nastavte vlastnost AcceptButton formuláře na btnPokračovat. Tlačítko bude mít stejnou funkci,
jako když uživatel stiskne klávesu Enter.
7. Nastavte vlastnost CancelButton formuláře na btnKonec. Tlačítko bude mít stejnou funkci, jako
když uživatel stiskne klávesu Esc.
8. Přidejte na formulář ovládací prvek CheckBox, nastavte jeho vlastnosti Name na chkCingrlátka,
Text na &Blikání a zvuky? a Checked na True (aby jeho výchozí hodnota byla „zaškrtnuté“).
Až budete s návrhem formuláře parametrů co do vzhledu hotovi, měl by jeho návrh vypadat přibližně tak,
jak ukazuje obrázek:
Opět je tu něco navíc, co vás teprve čeká, jak ukazují dvě neviditelné komponenty na podnosu pod návrhem.
Za předpokladu, že jste nastavili pro textová pole výchozí hodnoty a vysvětlivky, bude formulář při
běhu vypadat takto (samozřejmě se vždy zobrazí jen jediná vysvětlivka):

Labels:

Monday, June 25, 2007

Nastavení startovacího objektu

Když sestrojíte pro projekt nový formulář a chcete ho ladit, usnadníte si jeho testování tím, že ho nejprve
prověříte samostatně, bez případných vazeb na jiné části budované aplikace. Pohodlně se to udělá tak, že se
formulář prohlásí za startovací objekt projektu, takže když pak klepnete na tlačítko Start (nebo stisknete F5),
spustí se formulář, který jste prohlásili za spouštěcí a můžete ho vyzkoušet:
1. Nevidíte-li průzkumníka řešení, zvolte View > Solution Explorer.
2. Klepněte pravým tlačítkem myši na název projektu-v našem případě na položku Automat (název
projektu) a z místní nabídky zvolte Properties.
3. V dialogovém okně stránek vlastností projektu (v našem případě Automat Property Pages) vyberte
ze seznamu Startup object název formuláře, který chcete prohlásit za spouštěcí a klepněte na OK.

Saturday, June 23, 2007

Přidání formuláře parametrů

Nové prvky se do projektu přidávají hlavně prostřednictvím nabídky Project:
1. Zvolte Project > Add Windows Form.
2. V dialogovém okně Add New Item – Automat vyberte v levé části složku Local Project Items a
v pravém dvojitě klepněte na ikonu Windows Form.
3. Do textového pole Name napište název formuláře, například frmZadáníParametrů a klepněte na
OK.
Nový formulář se zařadí do projektu a jeho název uvidíte ve složce projektu v průzkumníkovi řešení.

Labels:

Thursday, June 21, 2007

Rozšíření prototypu

Hlavní formulář aplikace už v podstatě dělá všechno, co jsme si předsevzali, ovšem hodnoty kreditu a velikosti
sázky pro jedno roztočení automatu jsou nastaveny fixně a netestuje se, aby hráč nemohl hrát dál, pokud
počáteční kredit vyčerpá. Nyní proto rozšíříme prototyp automatu o další formulář, v němž bude moci
uživatel zadat hodnotu kreditu a velikosti sázky.
Prostřednictvím pomocného formuláře jakýchsi vstupních parametrů aplikace se seznámíte s dalším typickým
ovládacím prvkem uživatelských rozhraní aplikací. Na formulář parametrů přidáte zaškrtávací políčko
(CheckBox). Jeho vyčištěním bude moci uživatel úplně potlačit multimediální efekty, které jsme na hlavní
formulář přidali v předchozích oddílech.
Seznámíme se s tím, jak se do projektu Visual Basicu přidá nový formulář, jak se určí, který formulář bude
spouštěcí, co to jsou modální a nemodální formuláře a jak je možno pracovat s hodnotami vlastností jednoho
formuláře na jiném formuláři. Naučíte se také, jak si paletu ovládacích prvků můžete obohatit vlastními
ovládacími prvky. Podrobný postup obsahují příští oddíly.

Labels:

Tuesday, June 19, 2007

Předjímání chyb

Mnohé chyby lze předjímat a kritické situace ošetřit ještě dříve, než k chybě může dojít. Předjímání chyb
se netýká jen chyb při běhu. Například, výskytu mnohých syntaktických chyb nebo zapeklitých logických
chyb zabráníte snadno tím, že důsledně používáte příkaz Option Explicit, který vyžaduje explicitní deklarace
všech použitých proměnných.
Podobně, chystáte-li se dělit a může přitom dojít k dělení nulou, můžete předem otestovat, je-li jmenovatel
roven nule, zařídit se podle toho a žádnou chybu zpracovávat nebudete muset. Podobně je to ostatně
i s naší chybou, kdy neexistuje soubor, který potřebujete, protože i to lze předjímat.
Dokonce nemusíte aplikaci nechat doběhnout až tak daleko. Těsně po jejím startu můžete otestovat, zda
existují všechny soubory, s nimiž má aplikace pracovat a pokud ne, rozhodnout podle závažnosti a třeba i
aplikaci ukončit – ne proto, že by byl například obrázek s výhrou pro aplikaci životně důležitý, ale proto, že
jeho nepřítomnost možná indikuje závažnější závady:
If "" = Dir(Application.StartupPath & "\Money.wmf") Then
Messagebox.Show _
("Chybí některé soubory aplikace. Doporučujeme aplikaci znovu nainstalovat.")
' Přiřazení náhradního obrázku
' nebo ukončení aplikace
' nebo jiné řešení této situace
End If
Při prohlížení kódu aplikací Visual Basicu někdy zjistíte, že se používají chybové rutiny, i když by se
chyby daly předjímat (například zda existuje uživatel daného jména, zda existuje nebo neexistuje dotaz
s daným názvem v databázi, s níž pracujete apod.).
Dělá se to z toho důvodu, že předjímání chyby by bylo neefektivní (aby se zjistilo, zda existuje dotaz
v databázi, musela by se projít kolekce – možná objemná - všech dotazů a testovat, zda se názvy shodují).
V takových případech je výhodnější předpokládat, že (nový) objekt, s nímž chcete pracovat neexistuje (nebo
existující existuje) a pokusit se vykonat požadovanou činnost.přímo. V tom nepatrném procentu případů, kdy
dojde k výjimečné situaci, se pak uplatní chybová rutina.

Labels:

Monday, June 18, 2007

Chcete-li sledování chyb (předčasně, před ukončením procedury) vypnout, zařaďte na dané místo příkaz
On Error GoTo 0 (není to skok na řádek kódu s číslem 0).
Chybové rutiny se někdy nepohodlně ladí (dokud se rutina nevykoná, nevíte, zda funguje dobře), protože
někdy bývá obtížné navodit situaci, kdy skutečně dojde k chybě s testovaným číslem. V těchto případech pomáhá
metoda Raise objektu Err. Chcete-li například vyzkoušet větev Case Else ve výše uvedeném kódu,
zařaďte někam do procedury (za příkaz On Error) třeba příkaz:
Err.Raise(13)
V našem případě prostě jiné číslo než 5. Kdybyste takto chtěli testovat chyby při strukturovaném zpracovávání
konstrukcí Try, i to je možné. Umístíte-li volání metody Raise do bloku Try, „zachytíte“ tento druh
chyby větví:
Catch echyba As InvalidCastException
MessageBox.Show("Nesouhlas typů.")

Labels:

Sunday, June 17, 2007

Do procedury, v níž chcete zpracovávat chyby, zařaďte příkaz On Error Goto Návěští, jímž zapnete
sledování zachytitelných chyb při běhu. Návěští (ukončené dvojtečkou) musí být v téže proceduře, a indikuje,
kde začíná kód, který zpracovává chyby, jemuž se obvykle říká chybová rutina. Před chybovou rutinu je třeba
zařadit příkaz Exit, protože jinak by kód pokračoval dále do chybové rutiny bez ohledu na to, zda k chybě
došlo nebo ne.
Že se jedná o chybu s číslem 5 můžete zjistit tím, že si vypíšete zprávu podobnou té, která je uvedena ve
výpisu výše ve větvi Case Else. Poskytuje ji vlastnost Number chybového objektu Err, který je jedním
z vnitřních globálních objektů Visual Basicu (nemusíte ho nijak deklarovat).
Co se má stát, když k chybě dojde, se obvykle určuje jednou z variant příkazu Resume. Resume Next
znamená, že kód bude pokračovat bezprostředně za příkazem, který způsobil chybu (ten se tedy ignoruje).
Kdybyste uvedli pouze slovo Resume, znamenalo by to, že se řízení vrátí na příkaz, který způsobil chybu
a Visual Basic by se pokusil příkaz vykonat znovu. Jiná varianta příkazu Resume umožňuje například určit
místo, odkud se má dál pokračovat.

Tradiční zpracování chyb

Výše uvedený způsob zpracování chyb nebyl ve Visual Basicu až do verze 6.0 včetně možný, dříve se
používal způsob, založený na příkazu On Error a podporuje se i nadále. (Ještě bych chtěl poznamenat, že
při práci s některými objektovými hierarchiemi, například s objekty pro přístup k datům (DAO, ADO), jste se
možná setkali ještě s jiným druhem zpracování chyb – přes speciální chybové objekty (kolekce Errors) nebo
události Error. Těmito způsoby zpracování chyb se zde zabývat nebudeme.) Výše uvedenému strukturovanému
zpracování chyb zhruba odpovídá následující výpis:
' Začátek procedury
' Zapne se sledování chyb
On Error Goto ChybíObrázek
' kód procedury, mj. příkaz:
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Money.wmf")
' Ukončení procedury, když proběhla dobře:
Exit Sub
' Chybová rutina:
ChybíObrázek:
Select Case Err.Number
Case 5
MessageBox.Show("Chybí soubor s obrázkem")
picVýhra.Image = Nothing
Resume Next
Case Else
MessageBox.Show("Neošetřená chyba: " & _
Err.Number & " " & err.description)
Application.Exit()
End Select
End Sub

Labels:

Friday, June 15, 2007

' tady by mohlo dojít k chybě při běhu
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Money.wmf")
Catch echyba As ArgumentException
' Obrázek není, aplikace může pokračovat,
' ale při určité výhře se nezobrazí obrázek
' Zpracování chyby:
picVýhra.Image = Nothing
Catch echyba As Exception
' Došlo k jiné chybě, která nemá speciální zpracování.
' Vypíše se zpráva a aplikace skončí
' Součástí zprávy by mělo být doporučení, co má uživatel udělat před opětovným
' opětovným spuštěním aplikace. I když nemá dělat nic, mělo by se mu to sdělit
MessageBox.Show("Neočekávaná chyba. Aplikace bude ukončena.")
Application.Exit()
Finally
' Výsledky, které už lze získat bezpečně
' a (nebo) údržbový kód (uzavírání souborů, uvolňování objektů apod.)
End Try
Při ladění výjimek se obvykle používají pomocné zprávy nebo výpisy do výstupního okna. Vlastnost
Message třídy Exception pojmenovaného prostoru System poskytuje text chybové zprávy. V našem případě
by příkaz
MessageBox.Show(echyba.Message)
zobrazil zprávu „Invalid parameter used“. Podrobnější informace poskytuje metoda ToString téže třídy
(plně kvalifikovaný název výjimky, text chybové zprávy a kde k ní došlo). Příkazem
MessageBox.Show(echyba.ToString)
byste získali informace podobné těmto:
Jak vidíte z výpisu, může být větví Catch v konstrukci Try více (podobně jako ve struktuře Select Case)
a můžete tak „rozškatulkovat“ možné výjimečné situace do několika kategorií. (Do které třídy patří výjimka,
k níž právě došlo, poskytuje první řádek výpisu metody ToString). Říká se tomu filtrování chyb.
Filtrování chyb lze v zásadě řešit dvěma způsoby. Buď filtr založit na nějaké třídě výjimek, nebo na uživatelsky
definovaných číslech chyb (pak se používá fráze Catch When).

Labels:

Wednesday, June 13, 2007

Strukturované zpracování chyb

Až na stará kolena jsem se konečně dočkal toho, že i z Visual Basicu bude možno odhodit zastaralou veteš
konstrukcí typu „jdi někam, odtamtud jdi jinam, pak zase jinam“, neboli návěští a příkazy typu GoTo
(i když jeden z nich se stále podporuje, jak uvidíte v příštím oddílu „Tradiční zpracování chyb“. Visual Basic.
NET podporuje novou programovou strukturu Try – Catch – Finally, která kombinuje řídící strukturu,
zpracování výjimek, zabezpečené bloky kódu a filtry. Předvedeme si ji na drobné ukázce z naší aplikace.
Při zobrazování obrázků výher, přehrávání zvukových souborů (nebo když aplikace potřebuje jakýkoli jiný
soubor) se může stát, že soubor z nějakého důvodu na předpokládaném místě není. V takovém případě dojde
k chybě při běhu (například chybou skončí volání metody FromFile při načítání obrázku výhry), zobrazí
se ošklivá nesrozumitelná zpráva, o níž uživatel neví, co si má myslet. Budu moci aplikaci spouštět znovu?
Mám ji znovu instalovat? Mám to ignorovat? Mohu klepnout beztrestně na OK? Atd.
Strukturované zpracování chyby tvoří větev Try, v níž vydáte příkaz (blok kódu), v němž může dojít
k chybě při běhu. Do větve Catch se vykonávání kódu dostane tehdy, když se blok kódu ve větvi Try nepodaří
úspěšně vykonat. Kód ve větvi Finally se vykoná nakonec, vždy, těsně předtím, než obor bloku kódu
pro zpracování chyb skončí. Kód ve větvi Finally se tedy vykoná bez ohledu na to, zda se vykonal kód ve
větvi Catch nebo ne.

Labels:

Tuesday, June 12, 2007

Témata související s chybami

aplikací a s laděním by (podobně jako jiné okruhy otázek v brožuře nakousnuté)
hravě zaplnila ne jednu, ale několik takovýchto svazků. Berte proto následující odstavce jen jako
velmi stručný úvod, v němž bych chtěl zdůraznit tyto věci:
Existují sice programátoři, kteří tvrdí, že v jejich programech k chybě při běhu dojít nemůže, dříve nebo
později se to ale stane.
Bez zpracování chyb při běhu není možno žádnou aplikaci považovat za uspokojivě vyřešenou.
VB.NET poskytuje zcela nové strukturované programovací prvky pro zpracování chyb při běhu.
Pokud je to možné (a není to příliš neefektivní), měli byste chyby, které mohou při běhu vzniknout, předjímat.

Labels:

Monday, June 11, 2007

Zpracování chyb

Až do této chvíle jsem se v brožuře vůbec nedotkl jedné oblasti programovacího jazyka, bez níž se neobejdete
v žádné aplikaci – zachycování chyb a jejich odstraňování. Při programování se setkáváte se třemi zásadními
druhy chyb:
Syntaktické chyby se ve vývojovém prostředí Visual Basicu už dávno snadno odstraňují přímo při psaní a
VB.NET dále rozšířil aparát pomůcek, které pomáhají k tomu, aby kód, který napíšete, byl syntakticky
správný.
Logické chyby – nejhorší druh – způsobují, že aplikace sice běží, ale dělá něco jiného, než jste od ní očekávali.
Při odstraňování těchto chyb se využívají ladicí prostředky vývojového prostředí, které jsou také
velmi vyspělé.
Zbývají chyby při běhu – které vznikají proto, že aplikace sice projde kompilací, ale při běhu nastane nějaká
výjimečná situace, která způsobí, že aplikace dál běžet nemůže.
My se v brožuře krátce zastavíme u tzv. zachytitelných chyb (většinou se jedná o chyby při běhu), tj. takových,
které můžete (a měli byste) ve své aplikaci zpracovat a rozhodnout, co se má dít dál (zda může aplikace
pokračovat, že musí skončit apod.). Velmi nenáročnou (jen trochu nudnou a někdy přehlíženou) součástí
zpracování chyb je zobrazování srozumitelných a přívětivých zpráv uživatelům. Přitom tato zdánlivá drobnost
může mít enormní vliv na úspěšnost vašich aplikací (=jak se budou dobře prodávat).

Labels:

Sunday, June 10, 2007

Přidání komponenty bez ovládacího prvku na podnosu

Komponenty lze také do aplikace přidávat přímo v kódu, aniž byste použili soupravu nástrojů. Například,
náš časovač můžete zařadit do kódu tímto postupem:
1. Přidejte do třídy formuláře příkaz
Private WithEvents Timer1 As System.WinForms.Timer
2. Do událostní procedury Form1_Activated přidejte příkazy
Timer1 = New System.WinForms.timer()
Timer1.Enabled = False
Timer1.Interval = 100
Další příkazy, v nichž se časovač využívá, zůstanou stejné, jako při vizuálním řešení.
Námět na procvičování. Některé procedury zařazené do formuláře mají obecnější charakter a možná
byste je rádi využívali i v jiných projektech. Zkuste z nich vyrobit samostatnou třídu nebo je učiňte za základ
svého vlastního pojmenovaného prostoru.

Labels:

Friday, June 08, 2007

Časovač a kód

s ním sdružený přidáte do formuláře takto:
1. Při práci v návrháři formulářů klepněte v soupravě nástrojů na tlačítko Components, pak na nástroj
Timer a klepněte na formuláři.
2. Klepněte na ikonu Timer1 na podnosu komponent pravým tlačítkem myši a z místní nabídky zvolte
Properties. Nastavte hodnotu vlastnosti Interval časovače na 100.
Interval časovače určuje dobu, po jejímž uplynutí se vykoná (je-li časovač zapnutý) kód, který
umístíte do událostní procedury Tick časovače. Interval se nastavuje v milisekundách, takže 100
znamená desetinu vteřiny.
Tikání hodin časovače se zapíná pomocí vlastnosti Enabled. Je-li její hodnota rovna False, hodiny
časovače neběží. Časovač je možno zapnout v návrhovém režimu, aby se jeho hodiny rozběhly
automaticky od okamžiku, kdy se formulář objeví. Dá se ale také zapínat dynamicky až při běhu,
a to v případech, kdy chcete časovač rozběhnout až tehdy, kdy nastane nějaká konstelace okolností,
kterou nejde v návrhovém režimu předpovědět (když uživatel aplikace vyhraje).
3. Přejděte do okna kódu, vyberte ze seznamu vlevo položku Timer1 a ze seznamu vpravo událost
Tick. Do těla procedury napište kód, jehož výpis následuje:
Public Sub Timer1_Tick(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Timer1.Tick
KolikrátBlikat = KolikrátBlikat + 1
Blikat = FlashWindow(Me.Hwnd, 1)
If KolikrátBlikat * Timer1.Interval > 2800 Then
Timer1.Enabled = False
KolikrátBlikat = 0
End If
End Sub
Konstanta 2800 v konstrukci If určuje horní mez, kdy časovač sám sebe vypne a blikání tedy skončí.
Dříve se neprogramovala událostní procedura Tick, ale procedura s názvem stejným,
jako je název ovládacího prvku, tedy Timer. Další rozdíl spočívá v tom, že se dříve dal časovač
vypínat nastavením jeho vlastnosti Interval na nulu. Nyní to musíte dělat jen tak, že nastavíte
vlastnost Enabled časovače na False (nastavíte-li Interval na nulu, přepne se
automaticky na hodnotu 1).

Labels:

Wednesday, June 06, 2007

Blikání pomocí časovače

Protože funkce FlashWindow blikne jen jednou, je třeba tuto funkci volat opakovaně a tedy nějak zařídit,
aby okno blikalo tak dlouho, dokud uživatel blikání nepřeruší nebo dokud nevyprší určitý limit, který si pro
blikání stanovíme. Pro úlohy tohoto typu se často využívá ovládací prvek, kterému se česky říká časovač (anglicky
Timer).
Časovač patří mezi tzv. neviditelné komponenty, s jejichž pomocí získáváte pro svou aplikaci nové schopnosti.
Protože jsou tyto komponenty určeny pro vás, vývojáře, neposkytují rozhraní pro uživatele a nemá proto
smysl, aby se uživateli na formuláři zobrazovaly.
Instance těchto komponent sice umisťujete na formulář stejnou technikou jako jiné ovládací prvky, návrhář
formulářů Visual Basic.NET však ikony těchto komponent už nezobrazuje na formuláři, ale na jakémsi
podnosu (tray), který se nachází pod oknem návrhu formuláře. Velikost podnosu lze měnit a z něho také přistupujete
k vlastnostem neviditelných komponent. Vlastnosti nastavujete stejně jako u jiných ovládacích prvků
ze soupravy nástrojů.
Na obrázku na příští stránce vidíte na podnosu pod návrhem formuláře ikonu časovače a několika dalších
neviditelných komponent. Ikony jsou zvětšeny. Velké ikony zobrazíte tak, že na podnosu klepnete pravým
tlačítkem myši a z místní nabídky zvolíte Large Icons. Text vedle ikon představuje výchozí názvy instancí.

Labels:

Tuesday, June 05, 2007

Při přenášení kódu deklarací

a volání funkcí API ze starších verzí je třeba dát pozor na
řadu drobností. Uvedu alespoň několik z nich, které se přímo týkají procedur volaných v naší
aplikaci. Předně nezapomínejte na změny v datových typech. Konkrétně, všude tam, kde je
v našich příkazech Declare uveden typ Integer, byl původně ve VB6 typ Long. Přenášíteli
kód deklarace, v níž není explicitně uveden typ předávání parametrů, uvědomte si, že se ve
VB.NET změní. Ve VB6 byl totiž standardní způsob ByRef, ve VB.NET je ByVal.
Přehlédnete-li to, nebudou vám správně fungovat funkce, které mají něco modifikovat
a potřebují předat parametr odkazem.
Je-li v příkazu Declare uveden typ As Any, musíte deklaraci upravit, protože tato fráze se už
nepodporuje. Doporučený způsob řešení je vyrobit přetěžovanou funkci pro každý předávaný
datový typ. V deklaracích konstant příkazu Const musí být uveden datový typ frází As.
Ve volání procedury PlaySound si všimněte, že přibyly nové logické operátory pro porovnávání
po bitech. Operátory And, Or, Not a Xor se dříve používaly pro Booleovská porovnávání
i bitová porovnávání. Nyní se používají výhradně pro Booleovské operace a pro bitové operace
jsou k dispozici nové operátory BitAnd, BitOr, BitNot a BitXor. Operátory Eqv a Imp
se už nepodporují. První se dá nahradit porovnávacím operátorem rovná se, druhý součinností
operátorů Not a Or.
Připomenu ještě, že při logických operacích se nyní používá tzv. zkrácené vyhodnocování. Jeli
výraz složen z více podmínek a v určité situaci je jasné, jaká bude výsledná hodnota výrazu
(například první podmínka v mnoha „Orech“ vede na True, další podmínky se už nevyhodnocují.
Dříve se vždy vyhodnocovaly všechny podmínky.

Labels:

Monday, June 04, 2007

Zvukový soubor s potleskem

o němž předpokládáme (podobně jako jsem to předpokládali o souborech
s obrázky), že je uložen ve složce, v níž se vytváří spustitelný soubor aplikace, se bude přehrávat asynchronně.
Nemáte-li potřebné vybavení nebo se soubor nenajde, měl by se ozvat standardní systémový zvuk.
Protože efekty mohou dlouho trvat a hráče už to třeba nebaví poslouchat, dáme mu možnost, efekty spojené
s danou výhrou ukončit. Například to můžeme zařídit tak, že ukončení efektů spojíme s událostí Click
formuláře. Když uživatel klepne na volné ploše formuláře, blikání a tleskání skončí. Výpis událostní procedury
Form1_Click je uveden na příští stránce.
Public Sub Form1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Form1.Click
Timer1.Enabled = False
PlaySound("", 0, 0)
End If
End Sub

Labels:

Saturday, June 02, 2007

Tleskání a blikání

Jaký by to byl hrací automat, kdyby neobsahoval alespoň primitivní multimediální efekty. Když uživatel
vyhraje, zatleskáme mu a rozblikáme okno automatu. Poskytneme hráči také možnost tyto efekty předčasně
ukončit. Později (na pomocném formuláři parametrů) mu také umožníme, aby mohl tyto efekty vypnout natrvalo.
Úlohu zde řešíme pomocí funkcí API Windows. Podrobnější výklad práce s funkcemi API přesahuje rámec
i rozsah této brožury. Bude-li se vám kód zdát nesrozumitelný, použijte ho tak, jak je, nebo efekty do
aplikace nedávejte a prostě tento oddíl přeskočte.
Chcete-li volat v kódu Visual Basicu nějaké procedury z API Windows, musíte je nejprve deklarovat příkazem
Declare. Obvykle se také zároveň deklarují potřebné symbolické konstanty-ve Visual Basicu příkazem
Const. (Deklarace lze opsat pomocí různých prohlížečů API.) Do třídy formuláře přidejte nad první
proceduru kód vypsaný na příští stránce.
' Handle aktivního okna
Private Declare Function GetActiveWindow Lib "user32" () As Integer
' Blikání okna
Private Declare Function FlashWindow _
Lib "user32" (ByVal hwnd As Integer, ByVal bInvert As Integer) As Integer
' Přehrávání zvuků
Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
(ByVal lpszName As String, ByVal hModule As Integer, _
ByVal dwFlags As Integer) As Integer
' Konstanty pro přehrávání zvuků
Private Const SND_ASYNC As Integer = &H1 ' přehraje asynchronně
Private Const SND_FILENAME As Integer = &H20000 ' lpszName je název souboru
Pro účely blikání si připravíme ještě pomocné proměnné. První z nich bude určovat, kolikrát má okno zablikat
(pokud uživatel blikání předčasně neukončí), do druhé uložíme manipulační číslo aktivního okna:
Private KolikrátBlikat, Hwnd As Integer
Manipulační číslo aktivního okna vrací funkce GetActiveWindow:
Hwnd = GetActiveWindow()
Funkce pro přehrávání zvuků a blikání budete volat tehdy, když uživatel vyhrál. Například, do konstrukce
Select Case vypsané výše, která testuje různé situace po vylosování čísel, přidejte kód podobný tomuto
(uvádím kód jen pro jednu větev konstrukce Select Case):
Case "DVESTEJNE"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Money.wmf")
VýšeVýhry = CInt(CDbl(lblSázka.Text) / 10)
' Začne blikat okno
Timer1.Enabled = True
' Potlesk
PlaySound(Application.StartupPath & "\Applause.wav", 0, _
SND_ASYNC BitOr SND_FILENAME)

Labels:

Friday, June 01, 2007

Ptáte se možná:

„Ani taková základní věc jako funkce MsgBox ve Visual Basicu nezůstala?“
Pokud ji chcete volat i nadále, najdete ji spolu se spoustou dalších programovacích
prvků (včetně Beep nebo InputBox) v pojmenovaném prostoru Microsoft.VisualBasic.
Interaction. Chcete-li ji volat, udělejte to takto.Přidejte k příkazům Imports tento:
Imports Microsoft.VisualBasic.MsgBoxStyle
Chcete-li zobrazit okno s tlačítky Ano, Ne a s informační ikonou:
dá se to zapsat příkazem:
MsgBox("Chceš si ještě vsadit?", Information BitOr YesNo, "Dotaz")
Zatímco ve Visual Basicu 6 byste to napsali takto:
MsgBox "Chcete ještě sázet?", vbInformation + vbYesNo, "Dotaz"
nebo takto, pokud byste chtěli uložit návratovou hodnotu
Výsledek = MsgBox("Chcete ještě sázet?", vbInformation + vbYesNo, "Dotaz")
Tyto ukázky neuvádím proto, že bych se chtěl vyžívat na oknech se zprávami, ale protože jejich
prostřednictvím mohu upozornit na další dva závažné rozdíly mezi VB6 a VB.NET.
Především vidíte, že vnitřní konstanty Visual Basicu už nemají předponu vb.
Druhý rozdíl spočívá v tom, že se při volání procedur Sub, které mají neprázdný seznam parametrů,
musejí vždy uvádět závorky, takže typ zápisu bez nich (druhý zdola) už povolen není!
Nemá-li procedura parametry, lze závorky vynechat. Příkaz Call je nepovinný, na tvar zápisu
nemá vliv, z čehož plyne, že nemá smysl ho používat, takže s ním přestaňte, pokud snad tak
dosud činíte.

Labels: