Stáhnout e

Transkript

Stáhnout e
Slovo autora
Protože jste sáhli po této brožuře, patrně jste se už
rozhodli, že vaším vývojářským nástrojem bude (i nadále) Visual Basic. Jestliže o tom stále ještě přemítáte, neváhejte. Úsilí a náklady, které věnujete jemu a nové
vývojářské platformě .NET, budou patrně vaší nejlepší
investicí a na rozdíl od nejistých akciových trhů se vám
vložené prostředky brzy vrátí, navíc s vysokými úroky.
Od svého vzniku se Visual Basic postupně stal nejpopulárnějším programovacím nástrojem. Odemkl a široce otevřel bránu do světa programování Windows
"obyčejným lidem", protože už nevyžaduje dlouhodobé
a náročné předběžné studium a přestává být výsadou
vysoce kvalifikovaných specialistů.
Převratné schopnosti nového vývojového prostředí,
jehož integrovanou součástí Visual Basic.NET je, umožňují inteligentním lidem začít téměř okamžitě vyrábět
plnohodnotné aplikace Windows i Web, služby Web
a další druhy specializovaných řešení, která splňují potřeby skutečného světa a jejichž prototypy se sestaví
velmi rychle.
Charakteristickými rysy Visual Basic.NET jsou především snadnost práce kombinovaná s neobyčejně mocnými a všestrannými schopnostmi, jeho univerzálnost
a využitelnost v mnohých, často velmi odlišných kontextech. Navíc je soběstačný, takže se nebudete muset nic
dalšího učit, ani dokupovat.
Zdravím všechny čtenáře a přeji mnoho úspěchů na
palubě .NET. Máte-li k obsahu brožury nebo k jejímu
vzhledu či uspořádání jakékoli připomínky či náměty,
buďte tak laskaví a pošlete mi zprávu na adresu
[email protected]
OBSAH
Než začnete
Plnohodnotné aplikace rychle
Evoluce Visual Basicu
Visual Studio.NET a Visual Basic.NET
Přechod z Visual Basicu 6.0 na .NET
Zahájení prací
Specifikace řešené úlohy
Spuštění Visual Basic.NET
Prototyp aplikace Windows
Přizpůsobení prostředí projektu
Základní úpravy formuláře
Otestování primitivního formuláře
Přidávání ovládacích prvků na formulář
Příkazová tlačítka
Odměna výherci v podobě obrázků
Vytvoření popisků pro losovaná čísla
Vylosování čísel
Otestování prototypu
Rozšíření prototypu (1) – statistiky, efekty
Přidání evidence počtu pokusů a počtu výher
2
3
4
5
6
9
9
10
14
14
15
21
22
23
25
26
30
40
42
42
Zjištění, zda uživatel vyhrál – skutečná kritéria
43
Strukturované zpracování chyb
Tradiční zpracování chyb
56
57
Různé obrázky pro různé výhry
46
Evidence vsazených částek a celkové výše výher48
Zobrazování zpráv (o stavu financí)
50
Tleskání a blikání
51
Zpracování chyb
55
Rozšíření prototypu (2) – další formulář
Přidání formuláře parametrů
Nastavení startovacího objektu
Přidání ovládacích prvků na formulář
Propojení formulářů
Rozšíření prototypu (3) – nabídky
Místní nabídka na formuláři parametrů
Pruh nabídek na hlavním formuláři
Využití společných dialogových oken Windows
Rejstřík
60
60
60
61
67
70
70
74
79
86
PCWorld Edition – Úvod do Visual Basic.NET
ISBN 80-86097-73-0
Informace v této knize jsou zveřejněny bez ohledu na jejich případnou patentovou ochranu. Jména produktů byla použita bez záruky jejich volného použití.
Vydavatel a autoři nepřebírají žádnou odpovědnost ani žádnou jinou záruku za
použití údajů uvedených v této knize a z toho vyplývajících následků. Veškerá
práva jsou vyhrazena na kopie celé, ale i částí knihy pořízené jakýmkoliv způsobem pro účely obchodu. Žádná část této knihy nesmí být použita v žádném
jiném informačním médiu a na žádném jiném nosiči dat za účelem obchodu bez
předchozího písemného souhlasu vydavatele.
© RNDr. Jan Pokorný
© 2001 UNIS Publishing, s.r.o.
Vyšlo v srpnu 2001
1
Úvod do Visual Basic.net
Než začnete
Vážená čtenářko, vážený čtenáři. V ruce držíte brožuru, která by vám měla pomoci hladce vplout do vod
Visual Basic.NET (plánují se i další, specializované brožury). Soustřeďuje se na seznámení s uživatelským
rozhraním nové verze, na základy programovacího jazyka a tvorby formulářů Windows. Je určena především
těm z vás, kdo máte první kroky s Visual Basicem za sebou nebo přicházíte odjinud a chcete se seznámit
s tímto převratným vývojovým prostředím a populárním programovacím jazykem.
U nás je jen velmi málo lidí, kteří by už někde "nepřičichli" k nějakému Visual Basicu (například napsali
nějaký skript nebo jednoduché procedury při práci v některé z aplikací Office). Tito potenciální čtenáři budou
v brožuře asi také hledat hlavní novinky a rozdíly, které je v nové verzi čekají. Pro ně jsem zařadil jako součást výkladu konkrétní ukázkové aplikace připomínky označené „VB6“ všude tam, kde přichází v úvahu uživatelský postup, programovací prvek či konstrukce, které se považují za zastaralé, z hlediska doporučovaných
programátorských zvyklostí nevhodné, v nové verzi se mají dělat jinak nebo se už nepodporují.
Z důvodu omezeného rozsahu brožury se některé témata probírají velmi stručně a rychle, proto to není
příručka pro úplné programátorské elévy, kteří nevědí vůbec nic o tom, co jsou programy, proměnné, běžné
příkazy, programové konstrukce (podmínky, cykly apod.) a neznají principy objektově orientovaného programování. Jste-li úplní začátečníci, měli byste si asi nejprve přečíst nějakou úvodní příručku. Typické publikace tohoto druhu vydává například Microsoft Press v edici Step By Step).
Co budete potřebovat
Abyste si mohli vyzkoušet vše, co je v brožuře uvedeno, musíte mít kopii aplikace Visual Basic.NET, která tvoří součást nové verze Visual Studio.NET. Než ji budete moci využívat, budete možná muset předběžně
něco stáhnout a nainstalovat z Internetových stránek Windows Update (Internet Explorer 5.5, Nástroje Internetu, aktualizace samotného systému Windows, balíčky aktualizací týkající se problému roku 2000 apod.).
Nasměruje vás na ně instalační disk sloužící pro aktualizaci komponent Windows (v průběhu instalace můžete přímo přejít na patřičné Internetové adresy). Teprve pak se nainstalují další potřebné komponenty a zahájí
vlastní instalace Visual Studia .NET.
Budete také možná muset modernizovat svůj počítač. Celé Visual Studio zabírá přes 3 GB (nemusíte ale
zdaleka instalovat všechno, například celou MSDN, čímž ušetříte spoustu místa). Hlavně ale budete potřebovat rychlý počítač. Například Pentium 120 s pamětí 32 je v podstatě za hranicí únosnosti, protože se budete
drtivou většinu času dívat na přesýpací hodiny a poslouchat cvrkání pevného disku.
Co se naučíte
Po přečtení brožury byste se měli vyznat v části vývojového prostředí Visual Basic.NET, která se týká
tvorby základních jednovrstevných aplikací Windows a zvládnout ty prvky programovacího jazyka a formulářů Windows, které k takovým aplikacím potřebujete. Čtenářům, kteří mají nějaké předběžné zkušenostmi
s tvorbou projektů typu standard EXE ve Visual Basicu 6.0, by brožura měla pomoci v tom, jak se nyní řeší
běžné akce na formulářích a v kódu, aby je nemuseli pracně vyhledávat v obrovité a ne vždy přehledné elektronické dokumentaci.
Svazek o rozsahu přibližně 80 stran nemůže pochopitelně ani vyjmenovat, tím méně pokrýt všechny
aspekty všech schopností vývojového prostředí Visual Basic.NET. Chcete-li si znalosti týkající se Visual Basicu.NET resp. samotného Visual Studia.NET prohloubit, poohlédněte se po nějaké objemnější publikaci věnované tomuto tématu.
Brožura také existuje v elektronické podobě-na CD. Disk obsahuje také ukázkový projekt Visual Basic.NET zde popisovaný.
2
Plnohodnotné aplikace rychle
Plnohodnotné aplikace rychle
Při budování aplikačních programů v současném, rychle se rozvíjejícím a měnícím se světě, vystupuje
stále více do popředí požadavek na rychlost vývoje těchto programů (včera bylo pozdě). Co největší vývojářská rychlost by však neměla nepříznivě ovlivňovat kvalitu aplikačních programů, které by i při "bleskovém"
vývoji měly být vyspělé, spolehlivé, plnohodnotné a měly by to být aplikace skutečného světa, které vyhovují
i potřebám obrovitých globálních korporací. Nejlepším nástrojem, který plně vyhovuje těmto požadavkům
(rozhodně je to cíl společnosti Microsoft), by mělo být nové Visual Studio.NET, jehož integrovanou součástí
je i nový Visual Basic.NET.
Nepodceňujte předběžnou analýzu
Hned na začátku bych ale chtěl připomenout, že sebelepší nástroje samy o sobě nic hodnotného nevytvoří.
Chcete-li úspěšně budovat aplikační programy, musíte především "umět řešit úlohy". Vlastnímu programování, vizuálnímu i ručnímu psaní kódu, by měla předcházet fundovaná analýza předložené úlohy. Pominu-li
obecné otázky související se systémem, sítí, zabezpečením, distribucí apod., měli byste provést alespoň rozbor toku dat (jaká vstupní data a v jaké struktuře bude aplikace potřebovat, jak se budou data zpracovávat a
jaké mají poskytovat výstupy) nebo toku úloh (jaké dílčí úlohy má aplikace řešit, v jakém pořadí, v jakých
návaznostech a jaká vstupní data jednotlivé úlohy potřebují) nebo obojího. Teprve na podkladě předběžných
analýz byste měli navrhnout (nebo vymyslet) algoritmy řešení, volbu komponent atd.
Při řešení mnoha obecných problémů i pro potřeby předběžných analýz ostatně také asistuje řada vhodných vizuálních nástrojů (namátkou: různí průvodci distribucí, instalací, FrontPage pro vytvoření struktury a
správu stránek Web nebo Microsoft Projekt pro přípravu řešení složitých projektů).
I když ale předběžné práce hodláte dělat převážně ve vyspělých vizuálních nástrojích, ale nemáte přitom
žádné nebo jen malé zkušenosti s věcnou či programovou analýzou předložených úloh, doporučuji vám, abyste si obstarali nějakou knihu věnovanou tomuto okruhu problémů. Protože ve většině aplikací skutečného světa budou vstupní data v podobně nějaké relační databáze, možná byste si také měli přečíst nějakou knihu
o tom, jaké zásady se mají dodržovat při navrhování a modifikacích struktury relačních databází a jaké prostředky jsou k dispozici pro údržbu a správu dat, které jsou v těchto databázích uloženy.
Vývojový cyklus řešení
Teprve na samém konci celkového procesu tvorby aplikačního programu se nachází vývojový cyklus
konkrétního řešení. Vytvoření prototypu, jeho odladění a ověření, modifikace prototypu na základě požadavků vyplývajících z testování prototypu a dodatečných nebo změněných požadavků zadavatelů, odladění a
ověření "překopaného" prototypu, další změny a stále kolem dokola, dokud aplikační program nefunguje po
všech stránkách uspokojivě.
Jak se učit nový produkt
Jak asi víte, je objem současných produktů, (ty, které tvoří součást Visual Studia.NET jsou toho typickým
příkladem), tak obrovský, že vyvolává v mnoha lidech pocit malomyslnosti, protože se prostě nedá v rozumné době ani všechno přečíst, natož tomu porozumět, tím méně umět vše aktivně využívat.
Proto se při seznamování s daným produktem nesnažte vstřebávat všechno do posledního detailu. Trvalo
by vám to možná tak dlouho, že aniž byste vytvořili něco, za co vám někdo zaplatí, přešly by v tichosti okolo
vás další verze a většinu svých, v potu tváře těžce nabytých znalostí, byste si mohli strčit za klobouk. Je třeba
zvolit jinou strategii. Vyjděte z toho, že v dnešní době v podstatě žádný produkt stoprocentně zvládnout nejde.
Informací je prostě příliš mnoho a příliš rychle zastarávají, takže je třeba se jejich přílivu spíše bránit, ne se je
snažit za každou cenu absorbovat.
3
Úvod do Visual Basic.net
Zvládněte nejprve nepostradatelné základy (k tomu by měla přispět tato brožura), a pak znalosti postupně
nabalujte o takové, které potřebujete při řešení svých konkrétních úloh nebo obecněji takových druhů úloh,
které jsou typické pro vaše pracoviště či organizaci. Spoustu věcí totiž nepoužijete nikdy a možná řada z nich
zatím zastará a učit se je už nebudete muset vůbec.
Typickým rysem moderního programování je také to, že se aplikace jistým způsobem skládají z předem
připravených dílů. Proto byste si měli před zahájením vlastního řešení zjistit, zda některé dílčí úlohy řešení
nejsou hotové v podobě komponent vývojového prostředí Visual Basicu nebo jiné části Visual Studia.NET,
abyste třeba znovu nevynalézali kolo. Stačí mít všeobecný přehled o tom, jaké komponenty jsou k dispozici
a co v zásadě dělají. Nemusíte znát hned všechny komponenty podrobně, danou komponentu důkladněji studujte až tehdy, usoudíte-li, že by se mohla při řešení vaší konkrétní aplikace hodit.
Zrádnost "snadno a rychle"
Cílem tvůrců Visual Basicu bylo od samého začátku, aby se daly velmi snadno a velmi rychle vytvořit
fungující prototypy různých druhů aplikací a aby to mohl dělat každý inteligentní uživatel, nikoli jen ostřílený
expert. Spokojí-li se ale vývojář jen s povrchními znalostmi, je nebezpečí, že na této úrovni ustrne a bude vyrábět aplikace, které ve skutečném světě z různých důvodů neobstojí. Například se budou hroutit, jakmile
nebude aplikace běžet v přesně stejném prostředí, v jakém se vyvíjela, když uživatel aplikace udělá něco
neočekávaného apod.
Někteří vývojáři mají také sklony k tomu, že, jakmile se naučí určité minimum technik, řeší už všechno
další jimi ("takhle mi to chodí"). Nutí je k tomu především neustálý stres vyplývající ze šibeničních termínů,
takže nemají čas na další sebevzdělávání , tím méně bádání v neprozkoumaných oblastech. Výsledkem bývají
aplikace řešené neobratně a celkově neefektivní, protože jejich tvůrce použil nevhodné či zastaralé nástroje
(jako kdybyste na zahrádce hloubili jamky pro sazenice kedluben elektrickou vrtačkou).
Evoluce Visual Basicu
Visual Basic, který volně navazoval na různé předchozí "Bejziky", přišel na svět v roce 1991 a hned sbíral
první ceny na mnoha soutěžích o nejlepší softwarové produkty. Od samého začátku byl koncepčně rámcem
pro aplikace. Myslí se tím, že obsahoval všechny základní bloky aplikace Windows. Byly k dispozici a stačilo po nich sáhnout. Nemuseli jste se proto zdržovat programováním základních schopností, což je nutné zabudovat prakticky do jakékoli aplikace a mohli jste se plně soustředit na to, co bylo pro vaši aplikaci
jedinečné.
Když jste chtěli do aplikace zařadit nějakou schopnost, měli jste nejprve zjistit, zda ji Visual Basic poskytuje (to ostatně platí pořád). Mnozí programátoři byli překvapeni, kolik toho byl schopen Visual Basic za ně
udělat, aniž by vůbec sáhli na programový kód. Stačilo z bohaté nabídky Visual Basicu vybrat ty komponenty, které konkrétní aplikaci nejlépe "pasovaly". Byla to první hlavní inovace, která přišla s Visual Basicem, vizuální programování objektů.
Většinou se však získal pouze prototyp, který dobře vypadal, ale nic nedělal, nebo jen velmi málo. "Dělání" neboli funkčnosti do aplikace zabudovával vývojář, pomocí programového kódu. Byla to druhá hlavní
inovace, která přišla s Visual Basicem, programování založené na událostech. Událostí se obvykle rozumí nějaká akce uživatele (nebo systému) při běhu programu a reakci naprogramujete jako událostní proceduru objektu (také to platí jistým způsobem i nadále).
Aby se o programovacím jazyku mohlo tvrdit, že je objektově orientovaným programovacím jazykem,
musí splňovat určité požadavky. Je třeba říci, že Visual Basic až do verze 6.0 včetně takovým jazykem nebyl.
Pouze mnohé úlohy řešil v podobném stylu jako objektově orientované jazyky (C++, Java apod.). Říkalo se,
že se ve Visual Basicu používá objektově orientovaný přístup k programování.
4
Plnohodnotné aplikace rychle
Rámec pro aplikace, který Visual Basic poskytoval, tvořily komponenty. Komponentou se rozumí
soběstačný (samostatný) kus softwaru, který řeší nějakou úlohu. Ve Visual Basicu byly doposud komponenty
trojího druhu. Předně soběstačné softwarové komponenty, které můžete vzít a zařadit do svého programu,
aniž byste museli cokoli psát, ladit či testovat, dále vlastní komponenty a "cizí" komponenty, kterým se říkalo
ovládací prvky ActiveX. Ty nebyly součástí Visual Basicu samotného, ale dodávala je společnost Microsoft
nebo jiní výrobci. Jakmile se cizí ovládací prvek ActiveX nainstaloval, mohli jste ho využívat stejným způsobem jako ty ovládací prvky, které jste dostali s Visual Basicem.
Visual Basic sice prodělal od svého vzniku velké množství drobnějších či závažnějších změn a inovací,
přesto zůstal ve své koncepci zastaralý. Původně se používal hlavně pro vytváření rychlých prototypů
a "malých" aplikací a mnozí profesionální programátoři se na něj dívali s despektem, někdy dokonce
s opovržením. Měl ale určitě mnohé nepopiratelné klady, což ostatně dokazuje jeho stále vzrůstající popularita. Přednosti Visual Basicu způsobily, že postupně rychle narůstala obec jeho uživatelů, ale hlavně se kvalitativně měnilo její složení.
Programátoři začali ve Visual Basicu tvořit komplikovaná řešení, často určená pro Web, velmi rychle odhalili jeho stinné stránky a stále více naléhali na společnost Microsoft, aby s tím něco udělala. Ta mohla zvolit, podobně jako u předchozích verzí, kvantitativní cestu a přibalit další požadované možnosti a schopnosti.
Společnost se však rozhodla pro radikální řez, změnila zcela filozofii Visual Basicu a plně jej integrovala do
nové platformy .NET. Důsledkem jsou rozsáhlé nové možnosti, ale také spousta všelijakých změn prakticky
ve všech oblastech vývojového prostředí stávajícího Visual Basicu, včetně poměrně dramatických změn
v programovacím jazyku. Krátce o tom pojednává další oddíl.
Visual Studio.NET a Visual Basic.NET
Visual Basic.NET tvoří integrovanou součást nového obrovitého softwarového balíku s názvem Visual
Studio.NET. Nové studio obsahuje řadu fascinujících schopností, především podstatně ulehčuje vývoj komplikovaných řešení na úrovni korporací určených pro Web. Obsahuje mj. jediné společné vývojové prostředí,
vývojové nástroje pro životní cyklus řešení, nový programovací jazyk C#, inovovanou verzi Visual FoxPro a
plně objektově orientované vývojové prostředí Visual Basic.NET.
Charakteristické rysy Visual Basic.NET
Visual Basic.NET je nová verze Visual Basicu, která byla od základů přebudována pro novou vývojovou
platformu .NET, tedy pro nový rámec aplikací. Visual Basic.NET umožňuje rychle vyvíjet plnohodnotné
aplikace Windows, aplikace Web i služby Web a budovat tak vícevrstevné distribuované systémy na úrovni
korporací. Seznam všech jeho nových rysů a schopností by byl velmi dlouhý, proto jen některé a stručně.
Visual Basic.NET pracuje s novými formuláři (Windows Forms a Web Forms), s novou verzí ADO, které
se říká ADO.NET (má například přístup k odpojeným zdrojům dat) a jeho programovací jazyk byl "vyčištěn"
a zdokonalen tak, že je nyní skutečně objektově orientovaný (obsahuje všechny rysy, které programátor čeká
od objektově orientovaného jazyka, jako jsou dědění, rozhraní, polymorfizmus, "přetěžování" procedur atd.).
Visual Basic.NET je také plně integrovaný s ostatními jazyky Visual Studia.NET. Komponenty aplikací
můžete vyvíjet v různých jazycích a díky schopnosti dědit přes platformy mohou dokonce vaše třídy dědit ze
tříd napsaných v jiných jazycích. Vezmete-li v úvahu navíc to, že rámec .NET poskytuje také bohatou paletu
API pro Windows i Internet, zbavíte se tak mnohých "náhradních" řešení, která jste dříve museli ve Visual
Basicu volit
5
Úvod do Visual Basic.net
Díky assemblies, což jsou nové distribuční jednotky rámce .NET (EXE nebo DLL), se podstatně zjednodušuje distribuce a instalace aplikací. Assemblies se používají podobně jako se používaly typové knihovny
v dřívějších verzích Visual Basicu, obsahují však kompletní informace o tom, co se v nich nachází a co je třeba k tomu, aby šlo aplikaci nebo komponentu používat. Jsou tedy samo dokumentační. Důsledkem je to, že
nezávisejí na registru, z čehož plyne, že distribuce a instalace se často smrskne na pouhé zkopírování souborů
na cílové místo. Někdy není nutné ani to. Mnohé aplikace se na cílová místa fyzicky instalovat nemusí a mohou se spouštět klepnutím na hypertextovém odkazu.
Assemblies mohou obsahovat více pojmenovaných prostorů (Namespace), což jsou hierarchie tříd, rozhraní a metod. Organizují objekty definované v assembly. Odkazy (references) umožňují využívat objekty definované v jiných assemblies (dříve knihovnách typů). Atributy umožňují poskytovat dodatečné informace o
prvcích programu a volné vrstvení (Free Threading) umožňuje psát aplikace, které provádějí současně několik
úloh běžících v oddělených vrstvách.
Nové formuláře poskytují spoustu nových možností a schopností. Například, díky schopnosti vizuálního
dědění ve formulářích Windows (používají se místo dřívějších běžných formulářů) se na novou úroveň dostává tvorba formulářů-lze dědit ze společných vzorů (šablon) používaných v rámci celé organizace.
V novém Visual Basicu existuje také druhý hlavní druh formulářů-formuláře Web, které podstatně přispívají k tomu, že se široká paleta aplikací určených pro Web může vyvíjet stejně snadno a rychle, jako běžné
aplikace Windows. Formulář Web se vyvíjí v podstatě obdobnými technikami jako formulář Windows. Formuláře Web běží na serveru a klientovi předávají pouze kód založený na HTML. Na rozdíl od stránky ASP se
kód kompiluje, nikoli interpretuje, což zvyšuje rychlost zpracování.
V novém Visual Basicu můžete také vytvářet (vizuálně, pomocí zvláštní šablony) speciální druh aplikací
Web, kterým se říká služby Web (Web Services), vyhledávat a přistupovat k existujícím službám (také vizuálně – k dispozici jsou nástroje jako Průzkumník serveru nebo dialogové okno Přidat odkaz Web). Služba Web
je speciální funkčnost vystavovaná přes Internetové protokoly. Umožňuje výměnu dat pomocí standardů
(HTTP, XML) přes "požární zdi" (firewall). Služby Web nejsou svázány s nějakou konkrétní technologií nebo
konvencí pro volání objektů.
Mnohými novinkami vývojového prostředí, programovacího jazyka, přístupem k databázím přes
ADO.NET, formuláři Web, službami Web ani jinými speciálními druhy aplikací, které lze v nové verzi Visual
Basicu řešit, se z kapacitních důvodů tato brožura nezabývá.
Jak je snad z předchozích řádků vidět, jsou schopnosti a možnosti nového Visual Studia a tím i Visual Basic.NET opravdu omračující. Proto bych chtěl poznamenat, že v takové tenké brožuře jsem mohl upozornit
jen na několik aspektů jen jednoho z mnoha druhů aplikací, které lze v novém VB.NET dělat-totiž aplikací
Windows. Obdobně jsem mohl v brožuře upozornit jen na některé z mnoha rozdílů, novinek a odchylek, které
budou muset při psaní kódu a navrhování formulářů Windows strávit uživatelé předchozích verzí Visual Basicu.
Přechod z Visual Basicu 6.0 na .NET
Visual Basic.NET vykazuje oproti předchozím verzím podstatné kvalitativní změny. Má novou filozofii,
způsob práce i spoustu změn ve vizuálním i „ručním“ programování. Teoreticky se samozřejmě jedná
o změny k lepšímu, což nepochybně ocení zejména vyspělí programátoři z jiných programovacích jazyků,
kteří budují komplikované aplikace na úrovni korporací a zatím ve Visual Basicu postrádali spoustu schopností, které pro úspěšné vyřešení takových aplikací potřebují. Teď už je v něm najdou.
6
Plnohodnotné aplikace rychle
Myslím, že nemá cenu pět oslavné ódy na nové produkty, od toho jsou tu jiní. Pokrok v softwaru, tím méně v Basicu, se očividně nedá zastavit, má ale také své stinné stránky. V zásadě lze říci, že pokud jste ještě ve
Visual Basicu nikdy nic nenaprogramovali, budete na tom ve Visual Basic.NET možná o něco lépe, než mnozí rutinéři předchozích verzí. Proč? Ve Visual Basicu.NET se téměř vše dělá úplně jinak než dřív (včetně takových úvodních záležitostí, jako je získání dnešního data nebo přiřazení textu do titulkového pruhu
formuláře), takže nemáte-li v hlavě zafixováno spoustu algoritmů a postupů, nebudete je muset z hlavy vymazávat, což je obtížnější než obdobná činnost prováděná na pevném disku, neboť člověk není stroj a zvyk je
železná košile.
To je jedna ze stinných stránek pokroku v tomto vývojovém prostředí. Když konečně u většiny úloh víte,
"jak na to", musíte to "zapomenout" a přicházet znovu na to, jak se stejné úlohy řeší v "novém hávu". Protože
ze starého Visual Basicu zbylo nedotčeného jen velmi málo, platí to, co jsem právě řekl, nejen pro vyspělé
experty řešící distribuované aplikace Web pro globální korporace, ale i pro všechny současné uživatele, kteří
píší ve Visual Basicu pouze jednovrstevné standardní aplikace. Chtěl bych, aby tato brožura pomohla také
těmto potenciálním čtenářům.
Druhá stinná stránka, o níž se zmíním, se týká kompatibility. Projekty Visual Basic.NET nemůžete otevírat ve verzi 6.0. To možná ani nikdo nečeká. Dříve však byla běžná praxe, že jste ladili nějaký kód ve Visual
Basicu, protože měl ze všech svých inkarnací nejlepší vývojové a ladicí prostředí a odladěný zdrojový kód
jste přenesli do jiného kontextu. Typické to bylo například u skriptů. Přenesete-li zdrojový kód, který napíšete
ve Visual Basic.NET, téměř určitě nepoběží. S tím souvisí otázka, jak to bude v budoucnu s důležitými kontexty Visual Basicu –Office například. Zatím to znamená, že mnozí lidé budou muset nějakou dobu držet
v hlavě několik „mutací“ stejného programovacího jazyka: VB 6.0, VBA pro Office, VBScript a VB.NET.
Třetí stinnou stránkou je to, že mnohé stávající projekty Visual Basicu (zejména specializované) bude jen
velmi obtížné převést na novou verzi. nejen kvůli přehršli nejrůznějších změn v programovacím jazyku, ale
protože se přestávají podporovat i mnohé stávající, ještě nedávno halasně propagované technologie společnosti Microsoft, která doporučuje, abyste takové aplikace raději nechali na pokoji. Plyne z toho alespoň jedna
dobrá zpráva. Jste-li stále stresováni vědomím, že byste se měli dále vzdělávat, nevíte s jakou technologií začít, musíte překonávat vrozenou lenost, takže se raději neučíte nic, leckteré z nich se už učit nebudete muset,
protože je společnost Microsoft opět hodila do starého železa. Ostatně posuďte sami (jestliže s Visual Basicem začínáte, nezatěžujte se následujícím oddílem a prostě ho přeskočte). Ve svém článku „Preparing Your
Visual Basic 6.0 Applications for the Upgrade to Visual Basic.NET“ uvádí společnost následující doporučení:
Všeobecná doporučení společnosti Microsoft
• V aplikacích navržených pro Internet a intranety se dosud ve Visual Basicu 6.0 (a Visual Studiu 6.0) používaly technologie tříd Web (Webclasses), projekty DHTML, dokumenty ActiveX a ASP. Nadále se máte
zabývat pouze ASP a připravovat se na zvládnutí rozšířené verze ASP.NET ve spolupráci s formuláři Web
Visual Basicu.NET, které nejsou nic jiného než stránky HTML s událostmi Visual Basicu. Aplikace
DHTML nelze automaticky převádět, mají se nechat na pokoji, dtto dokumenty ActiveX, které se už nepodporují. Webclasses neexistují, prý je půjde modernizovat na ASP.NET, ale pak prý budete muset udělat
„nějaké modifikace“ (upřímnou soustrast).
7
Úvod do Visual Basic.net
• V projektech typu klient/server se dosud pracovalo s formuláři, s objekty střední vrstvy MTS/COM+
a s vlastními ovládacími prvky. Modernizace formulářů a vlastních ovládacích prvků se prý bude provádět
automaticky (vsadím se, že zbude řada akcí, které budete muset udělat dodatečně „ručně“). Podpora
MTS/COM+ je zachována a rozšířena, i když je zde nová komponenta střední vrstvy, která se jmenuje
Web Services. Nepodporuje sice transakce MTS, ale společnost Microsoft radí, abyste v případě, že nepotřebujete distribuované transakce, převedli své komponenty MTS/COM+ na Web Services (prý je to triviální záležitost).
• Ve Visual Basicu 6.0 se doposud budovaly tyto základní druhy jednovrstevných aplikacích: databázové
aplikace, doplňky, pomocné programy a hry. Co se týče databázových aplikací, stačí, když se nadále soustředíte pouze na rozšířenou technologii ADO, které se říká ADO.NET. Máte zapomenout na „relikty“ jako jsou DAO, RDO apod. Sice je (prý s malými úpravami) můžete v kódu Visual Basic.NET využívat, ale
nepodporuje se například vázání dat na ovládací prvky DAO a RDO, ani uživatelská připojení RDO.
Změny v programovacím jazyku
Téma změn při navrhování formulářů, v programovacím jazyku a převodu syntaxe stávajících projektů do
Visual Basic.NET je rozsáhlé a pohodlně by samo o sobě vystačilo na samostatnou brožuru. Původně jsem
chtěl uvést alespoň jejich seznam, zjistil jsem ale, že je tak rozsáhlý, že by možná bylo kratší vypsat to, co zůstalo ve Visual Basicu beze změny. Proto jsem od toho upustil. Ty změny, které se týkají postupů popisovaných v brožuře, najdete v připomínkách označených „VB6“.
Součástí Visual Basic.NET bude převodní nástroj (Visual Basic Upgrade Wizard), který má modernizovat
existující projekty Visual Basic verze 6.0 na projekty nové verze, přičemž ponechá stávající projekty beze
změn. Převaděč se spustí automaticky, když se pokusíte ve Visual Basic.NET otevřít projekt pocházející
z Visual Basicu verze 6.0 a mj. převede formuláře Visual Basicu na formuláře Windows (Windows Forms).
Máte-li nějaké projekty pocházející ze starších verzí Visual Basicu, radí společnost Microsoft, abyste tyto
projekty nejprve převedli do verze 6.0, a teprve pak otevřeli ve Visual Basic.NET.
Po převodu vydá převaděč souhrnnou zprávu o potížích, modernizovaném kódu apod., hlavně také seznam úloh (TODO), tedy toho, co máte udělat. Jak asi tušíte a nebudu to zastírat (ostatně ani společnost
Microsoft to nepopírá), s některými projekty mohou být dost velké problémy. Protože tyto řádky píšu v době,
kdy jsem měl k dispozici pouze verzi Beta1, nemohl jsem bohužel tento nástroj ověřit, protože i při modernizaci projektu typu "nazdar lidi" se sice průvodce spustil, ale postupně oznamoval stále vyšší odhad času, který
zbývá k dokončení převodu a skončil zprávou "internal error". Informace o současném stavu vývoje najdete
na stránkách http://beta.visualstudio.net.
Výsledky docílené pomocí automatických převaděčů kódu automatickým generováním kódu nebývají
obvykle optimální. Také společnost Microsoft upozorňuje, že mnohé automatické převody prý budou znamenat zkomplikování a zpomalení převedeného kódu, proto doporučuje, abyste co nejvíce potřebných programovacích zásahů provedli preventivně předem a minimalizovali tak zásahy, které bude nutné provést ručně
po převodu. Tato rada asi nevzbudí u mnoha lidí valné nadšení, protože to v podstatě znamená, abyste dělali
zbytečnou práci, která navíc spočívá v tom, že rozvrtáte odladěné aplikace.
Chcete-li provést nějaké zásahy předem, potřebujete vědět, jaké programovací techniky a prvky se považují za zastaralé či nevyhovující, které se v nové verzi nepodporují a jakými technikami či prvky je máte nahradit. S mnohými z nich (ale zdaleka ne všemi) se seznámíte v této brožuře. Podrobné informace si
vyhledejte v elektronické nápovědě MSDN pro .NET Framework SDK či Visual Studio.NET a na stránkách
společnosti Microsoft na Internetu.
8
Zahájení prací
Zahájení prací
Dost řečí, je nejvyšší čas dělat něco konkrétního. S vývojovým prostředím Visual Basic.NET a s jeho
programovacím jazykem se seznámíte při řešení jednoduché úlohy, která vás bude provázet celou brožurou..
Protože každou dílčí úlohu lze řešit obvykle více způsoby a nedá se vždy jednoznačně říci, který je nejlepší,
ukážeme si několik variant jejich řešení. Zabijeme tím přinejmenším tři mouchy jednou ranou: seznámíte se
s více algoritmy, s více programovacími prvky a s postupy, které už používat nejde.
Specifikace řešené úlohy
Dostali jste za úkol sestrojit jednoduchý hrací automat v podobě formuláře, který má mít tyto schopnosti:
• Umožní uživateli zadat počáteční podmínky, jako jsou počáteční částka, kterou chce prohrát a výše sázky.
Až uživatel všechno prohraje, bude moci dát v plen další libovolnou částku (obecně stanovit nové počáteční podmínky). Při zadávání vstupních hodnot poskytnete uživateli nápovědu v podobě vysvětlivek.
• Uživatel si zahraje tak, že klepne na tlačítko Roztočit (nebo zvolí ekvivalentní příkaz z nabídky Akce formuláře). Automat vygeneruje trojčíslí od 000 do 999. Uživatel obdrží malou výhru, budou-li dvě číslice
stejné (například 225), podstatně větší výhru při postupce (například 234 nebo 765) a nejvyšší výhru při
všech třech stejných číslicích (například 555).
Ukážeme si několik variant, jak je možné losovaná čísla získat.
• Podle výše výhry se zobrazí odpovídající obrázek s balíkem prachů. Pro každý druh výhry se zobrazí jiný
obrázek. Jestliže uživatel vyhraje, bude dále odměněn "cingrlátky". Ozve se potlesk a formulář bude blikat. Tyto efekty bude moci uživatel zastavit v daném kole hry nebo je úplně vypnout jako součást počátečních podmínek.
Při řešení této části aplikace se seznámíte s tím, jak se volají funkce API a jak se na formulářích pracuje
s časovačem, který patří mezi tzv. neviditelné komponenty.
• Na formuláři se bude uživateli zobrazovat průběžný stav od poslední vložené částky (bude-li prohrávat,
bude částka červeně), případně další statistické údaje. Celkový stav se ale zobrazí uživateli jen na přání
(aby ho od dalších her stále neodrazovala celková výše částky, kterou doposud prohrál).
• Výše výher bude interní záležitost aplikace, včetně způsobu, jakým se generuje „náhodné“ trojčíslí.
• Uživatel bude moci aplikaci také ovládat pomocí nabídek. Na hlavním formuláři bude mít k dispozici pruh
nabídek s vysouvacími nabídkami. Na formuláři parametrů bude mít jako ekvivalent rozhodovacích ovládacích prvků k dispozici místní nabídku.
• Jako součást systému nabídek bude mít uživatel aplikace možnost, aby si ji mohl jistým způsobem přizpůsobit. Bude moci změnit pozadí formuláře a některé atributy písma, jímž se zobrazují vylosované číslice.
V této části úlohy se seznámíte s dalšími dvěma neviditelnými komponentami – pro zobrazení společných
dialogových oken Otevřít a Písmo.
Poznámka. Duchovním otcem tohoto druhu hracího automatu je patrně Michael Halvorson, který ho uvedl v knize „Microsoft Visual Basic 4 - Step By Step“. V brožuře jsem variace na toto téma zvolil proto, že je
tento typ aplikace u posluchačů na školeních Visual Basicu, která jsem měl tu čest lektorovat, zdaleka nejpopulárnější aplikací.
9
Úvod do Visual Basic.net
Takhle bude aplikace Automat vypadat, až bude zhruba hotová (uživatel v tomto tahu získal malou výhru
a vypsal si právě, jak si stojí):
Spuštění Visual Basic.NET
Za předpokladu, že máte nové "studio" nainstalované, spustíte ho příkazem Start > Programy > Microsoft
Visual Studio.Net 7.0 > Microsoft Visual Studio.Net 7.0. Nejprve se zobrazí úvodní obrazovka. Při její levé dol-
ní straně uvidíte ikony nainstalovaných vývojářských nástrojů z rodiny Visual Studia. Tato obrazovka po
chvíli sama zmizí a na pracovní ploše se objeví primární okno vývojového prostředí se svou domovskou
stránkou.
Hypertextové odkazy v levém panelu úvodní stránky poskytují informace o novinkách a různé další odkazy. V pravé části jsou uvedeny hypertextové odkazy, s jejichž pomocí můžete otevírat projekty, s nimiž jste
pracovali naposled (při úplně prvním spuštění zde nebude nic), otevřít nějaký existující projekt či založit nový projekt. Zrušíte-li zaškrtnutí políčka vpravo dole, při příštím spuštění se úvodní stránka už nezobrazí.
Úvodní operace můžete urychlit, vytvoříte-li si svůj profil.
1. Klepněte na hypertextový odkaz My Profile.
2. Na domovské stránce (VS Home Page) se zobrazí pět rozevíracích seznamů, v nichž určíte o jaký
profil se jedná, rozložení klávesnice, rozvržení okna, jak se má omezit rozsah nápovědy (tento seznam vidíte rozevřený na obrázku dále) a co se má zobrazovat při příštích spuštěních.
10
Zahájení prací
Přepínač nad posledním rozvíracím seznamem umožňuje určit, zda se má nápověda zobrazovat jako integrovaná součást primárního okna vývojového prostředí nebo mimo něj.
Před zahájením prací v jakémkoli produktu se často dané prostředí upravuje tak, aby vyhovovalo potřebám konkrétního uživatele. (Znáte to určitě z Office – příkazy Nástroje > Vlastní, resp. Nástroje > Možnosti).
Zde jsou pochopitelně k dispozici také, jen mají anglické názvy, tedy Tools > Customize, resp. Tools > Options.
1. Zvolte Tools > Options, rozviňte složku TextEditor a v v ní složku Basic.
2. Klepněte na položku General.
3. Až s nastaveními skončíte, klepněte na OK.
4. Vraťte se zpět na počáteční místo klepnutím na odkazu Get Started.
Dialogové okno možností, které vidíte na příští straně, je podstatně obsáhlejší než obdobná okna, na
něž jste byli možná doposud zvyklí. Všimněte si hlavně velmi dlouhého seznamu složek (kategorie
možností) v levé části dialogového okna. Vpravo se vždy zobrazí seznam odpovídajících možností.
Konkrétně se jedná o obecná nastavení pro textový editor kódu Visual Basicu. Rozhodně si prohlédněte další nastavení. Alespoň ta, která se nacházejí v rámci položek Tabs a VB Specific.
11
Úvod do Visual Basic.net
5. Klepněte na odkaz Create New Project.
Zobrazí se dialogové okno New Project, které hned na začátku názorně předvádí, jak neuvěřitelně bohatou paletu projektů máte k dispozici. V seznamu Project Types vidíte, jaké druhy projektů můžete
vytvářet.
6. Protože chcete budovat aplikaci Visual Basicu, vyberte složku Visual Basic Projects.
V pravém seznamu Templates se objeví šablony, které jsou dostupné pro daný druh projektu.
7. Protože chcete vybudovat jednoduchou aplikaci Windows, vyberte ikonu Windows Application.
8. Dvě ikony vpravo nahoře nad seznamem Templates umožňují přepínat zobrazení velkých a malých
ikon.
9. Pojmenujte svůj projekt v textovém poli Name.
10.V poli ze seznamem Location vyberte nebo napište umístění projektu. Složku můžete také vybrat
po klepnutí na tlačítko Browse.
11.Chcete-li pro nový projekt vytvořit tzv. Řešení (Solution), jehož bude nový projekt součástí, klepněte na tlačítko More, zaškrtněte políčko Create directory for Solution a napište název řešení do pole New Solution Name (nebo přijměte nabízený výchozí název, který odpovídá názvu projektu).
12
Zahájení prací
Pokud byste už pracovali v rámci nějakého otevřeného řešení, uviděli byste v dialogovém okně tlačítko Add to Solution. Umožňuje přidat nově vytvářený projekt přidat do právě otevřeného řešení.
12.Až budete hotovi, klepněte na OK. Uvidíte základní tvar vývojového rozhraní, v němž se vytvářejí
běžné aplikace Windows. Viz obrázek na další straně.
VB6. Řešení (Solution) nahrazuje a zobecňuje dříve používané skupiny projektů (.vbg).
13
Úvod do Visual Basic.net
Prototyp aplikace Windows
S prostředím Visual Basic.NET se seznámíte tak, že sestrojíte prototyp aplikace typu "formulář Windows", který postupně nabalíte o další schopnosti tak, aby vykonával činnosti zmíněné na začátku této části
brožury. Při tvorbě počátečního prototypu se nejprve naučíte:
• Nastavovat vlastnosti formuláře v návrhovém režimu
• Nastavit nápis v titulkovém pruhu formuláře až při běhu
• Sestrojit na formuláři příkazové tlačítko, jímž uživatel ukončí běh aplikace.
Přizpůsobení prostředí projektu
Jak vidíte na obrázku na příští straně, skládá se prostředí projektu VB především z mnoha oken (některá
z nich nejsou vidět). Patří mezi ně především návrhář formuláře, v němž se zobrazí prázdný výchozí formulář. Jeho vzhled si postupně upravíte a nakladete na něj ovládací prvky ze soupravy nástrojů. Vpravo nahoře
se nachází okno Průzkumníka řešení (Solution Explorer), v němž se zobrazuje stromová struktura řešení (co
vše je jeho součástí). Pod ním vidíte okno vlastností (Properties) objektu vybraného v průzkumníkovi řešení.
Pod ním se nachází okno dynamické nápovědy (Dynamic Help). Tato okna jsou připoutána v doku, který tvoří
pravý okraj primárního okna.
Nechcete-li pracovat s připoutanými okny, klepněte na titulkovém pruhu okna pravým tlačítkem myši a
v místní nabídce odstraňte zaškrtnutí položky Dockable. Místní nabídka je vidět na obrázku v pravém dolním
rohu. Další příkazy umožňují pracovat s okny plujícími volně po obrazovce (Floating) nebo zvolit dvojí způsob skrývání oken (Hide, Auto Hide). Nevidíte-li některé z oken, máte k němu vždy přístup z nabídky View.
Otevřete nabídku a vyhledejte příkaz s názvem okna nebo rozviňte kaskádovou nabídku příkazu ostatních
oken (Other Windows). Nevidíte-li okno dynamické nápovědy, zobrazíte je příkazem Help > Dynamic Help.
Možných variant zobrazení je velmi mnoho a možná vám zpočátku bude připadat, že se okna chovají poněkud divně. Vyplatí se věnovat manipulaci s okny trochu času, aby vám přešla do krve.
Místní nabídkou je vybaven téměř každý objekt, s nímž budete ve vývojovém prostředí pracovat. Například, na obrázku vidíte další dvě místní nabídky. První z nich se zobrazí, když klepnete pravým tlačítkem myši na ploše formuláře. Umožňuje rychle zobrazit okno kódu (View code), okno vlastností (Properties) a také
uzamknout ovládací prvky (Lock Controls). Když totiž umístíte nějaké objekty na formulář a zdá se vám, že je
to jejich finální pozice, můžete jejich pozici fixovat (zároveň fixujete i formulář, protože ten je také objektem). Budete-li to považovat za vhodné, můžete pak později stejným příkazem objekty (i jednotlivě) odemykat.
Důležitým oknem, bez něhož se při práci s formuláři neobejdete, je souprava nástrojů (Toolbox).
Obsahuje mnohem více ovládacích prvků než v předchozích verzích Visual Basicu a její výchozí pozice je na
levé straně (má svislou záložku), odkud se automaticky vysouvá a kam se automaticky zasouvá. Pokud si na
to nemůžete zvyknout (jako já), klepněte pravým tlačítkem myši na titulkovém pruhu okna soupravy nástrojů
a „odškrtněte“ položku Auto Hide v místní nabídce. Okno soupravy nástrojů můžete také přetáhnout jinam
a pracovat s ní jako s plovoucím oknem.
Místní nabídka, která se zobrazí, když klepnete pravým tlačítkem myši na některém nástroji soupravy,
umožňuje s nástroji v soupravě manipulovat, přizpůsobit vzhled soupravy, přidávat do ní další skupiny prvků
apod.
14
Prototyp aplikace Windows
Záložky jednotlivých oken jsou charakteristickým rysem nového vývojového prostředí a umožňují pohodlně přecházet z okna do okna pouhým klepnutím na patřičné záložce. Na obrázku vidíte tři záložky na horní
straně návrháře formulářů (přepínají mezi domovskou stránkou, zobrazením návrhu formuláře a zobrazením
kódu sdruženého s formulářem) a na spodní straně okna Průzkumníka řešení (přepínají zobrazení průzkumníka a pohled na třídu vybraného objektu).
Základní úpravy formuláře
Než se pustíte do kladení ovládacích prvků na formulář a psaní kódu, měli byste přejmenovat výchozí
formulář na více vypovídající název (budete-li ve svých projektech ponechávat výchozí názvy jako jsou Label37 neboForm5, velmi brzy ztratíte přehled o tom, co jednotlivé prvky znamenají a budete mít v projektu
pěkný zmatek. Ani vaši spolupracovníci příliš neocení, budou-li muset neustále pátrat po skutečném smyslu
jednotlivých názvů.
Pak se ještě podíváme na samotný formulář a řekneme si, jak se řeší základní úlohy s ním spojené (nápis
v titulkovém pruhu, jak se dají uživatelům formuláře omezit možnosti jeho ovládání (například odstranit tlačítko pro minimalizaci, nepovolit změnu velikosti formuláře) či jak se dá nastavit výchozí pozice formuláře či
obecně při běhu měnit pozici a (nebo) velikost formuláře. Jak se běžné vlastnosti formuláře nastavují z kódu
uvidíte na ukázkách po seznámení s výchozím kódem třídy, který pro vás vygeneruje vývojové prostředí.
15
Úvod do Visual Basic.net
Vlastní název projektu a formuláře
Všechny názvy, u nichž je to možné, můžete změnit tak, že klepnete pravým tlačítkem myši na názvu
v okně průzkumníka řešení a z místní nabídky zvolíte Rename. Název se vybere (bude modře) a okolo názvu
se objeví obdélník. Název tedy můžete přepsat přímo na místě.
Vlastní název řešení, který jste zadali výše v dialogovém okně New Project, je hodnota vlastnosti (Name)
tohoto řešení a můžete ho také upravit (podobně jako jiné názvy) v okně vlastností. Vyberte v průzkumníkovi
řešení kořenovou složku Solution ‘Automat 1’ (1 project). V okně Properties uvidíte vpravo od vlastnosti
(Name) tučně hodnotu Automat1. Můžete také připojit vlastní popis řešení vpravo od vlastnosti Description.
Vlastnost Path, určená pouze ke čtení, udává úplnou cestu k souboru řešení na disku (.sln). Vlastnost Startup
project určuje, který z projektů v řešení je spouštěcím projektem –má pochopitelně praktický význam jen tehdy, máte-li v řešení více projektů.
Název souboru projektu změníte tak, že vyberete v průzkumníkovi řešení složku projektu (Automat1) a
upravíte hodnotu vlastnosti Project File. Vlastnost Project Folder udává úplnou cestu k souboru projektu.
(.vbproj). Název formuláře změníte tak, že klepnete na souboru třídy formuláře Form1.vb v průzkumníkovi
řešení a v okně vlastností upravíte hodnotu vlastnosti FileName.
Všechny změny byste měli čas od času ukládat pomocí příkazů z nabídky File. Nejjednodušší je uložit
všechno (File > Save All), neboli stisknout kombinaci kláves Ctrl+Shift+S.
VB6. Ve VB6 se název projektu měnil v dialogovém okně Project > Properties v textovém poli Project Name, název formuláře byl dán hodnotou vlastnosti Name objektu Form.
Pozice a velikost formuláře při běhu
Vyberte formulář v návrháři formulářů Windows (Windows Forms Designer) a v okně Properties určete
hodnotu vlastnosti StartPosition, s jejíž pomocí specifikujete hranice zobrazovací oblasti. Pro aplikace Windows se doporučuje ponechat výchozí hodnotu WindowsDefaultLocation, která znamená, že, že operační systém spočte optimální počáteční umístění formuláře podle aktuálního hardwaru. Vhodná alternativa je také
hodnota Center, později pak můžete pozici formuláře změnit v kódu.
Vlastní umístění pak určíte vlastností Location, kterou se nastavují obě souřadnice levého rohu formuláře
(obecně souřadnice levého rohu ovládacího prvku vzhledem k jeho kontejneru) současně. Nebo můžete určit
souřadnice jednotlivě, pomocí vlastností Left (souřadnice x) resp. Top (souřadnice y). Pozici formuláře můžete pochopitelně nastavovat dynamicky i při běhu (ukázka viz dále) ve formě absolutních či relativních souřadnic.
Nastavíte-li vlastnost TopMost na True, určíte tím, že má být formulář „vždy nahoře“, tj. před všemi
ostatními formuláři, které tuto vlastnost nastavenu nemají, a to i tehdy, není-li formulář aktivní.
Rozměry formuláře lze nastavit jednoduše úpravou vlastností Height (výška) resp. Width (šířka) nebo najednou nastavením vlastnosti Size, v kódu je v tomto případě nejprve třeba definovat objekt Size.
VB6. Dříve se počáteční pozice formuláře určovala v okně rozvržení formuláře (Form
Layout) nebo jako hodnota vlastnosti StartUpPosition objektu Form.
Nápis v titulkovém pruhu formuláře
V okně vlastností formuláře klepněte na vlastnost Text a napište nový název. Jakmile řádek vlastnosti
opustíte, promítne se změna v titulkovém pruhu formuláře v návrháři formulářů.
VB6. Dříve se titulek formuláře nastavoval jako hodnota vlastnosti Caption.
16
Prototyp aplikace Windows
Změna ovládacích prvků formuláře
Potřebujete-li, aby měl formulář pevnou velikost, nastavte vlastnost BorderStyle formuláře na jinou hodnotu než jsou Sizable a SizableToolWindow (obvykle se používá hodnota Fixed Dialog).
Chcete-li uživateli znepřístupnit některá nebo všechna tlačítka nacházející se v titulkovém pruhu formuláře, využijte těchto vlastností:
• Nastavíte-li vlastnost ControlBox na False, odstraníte tzv. ovládací nabídku v levém horním rohu a zároveň tlačítka pro minimalizaci, maximalizaci a uzavření formuláře. Všechna tlačítka i titulkový pruh odstraníte nastavením vlastnosti BorderStyle na None.
• Jednotlivá tlačítka skryjete vlastnostmi MinimizeBox resp. MaximizeBox. Obě tato tlačítka skryjete také
nastavením BorderStyle na FixedToolWindow nebo SizableToolWindow.
VB6. Dříve se vlastnosti pro potlačení tlačítek jmenovaly MinButton a MaxButton.
Automaticky vygenerovaný kód
Volba ikony Windows Application v dialogovém okně New Project způsobila, že vám vývojové prostředí
vygenerovalo výchozí kód, který se skládá z odkazů na několik pojmenovaných prostorů a z jedné třídy
Form1. Kód formuláře lze zobrazit mnoha způsoby. Například: vydejte příkaz View > Code nebo zvolte View
Code z místní nabídky formuláře nebo klepněte na tlačítko View Code (zcela vlevo) v průzkumníkovi řešení.
Pokud vás podrobnosti nezajímají a chcete rovnou pokračovat v řešení aplikace, klidně zbytek tohoto oddílu
přeskočte. Výchozí kód má tuto podobu:
Imports System.ComponentModel
Imports System.Drawing
Imports System.WinForms
Public Class Form1
Inherits System.WinForms.Form
Public Sub New()
MyBase.New
Form1 = Me
' Toto volání požaduje návrhář formulářů Windows.
InitializeComponent
'TODO: Sem přidejte svůj inicializační kód
End Sub
' Formulář překryje metodu dispose, aby vyčistil seznam komponent.
Overrides Public Sub Dispose()
MyBase.Dispose
components.Dispose
End Sub
17
Úvod do Visual Basic.net
#Region "Kód vygenerovaný návrhářem formulářů Windows"
' požaduje návrhář formulářů Windows
Private components As System.ComponentModel.Container
Dim WithEvents Form1 As System.WinForms.Form
'NOTE: následující proceduru požaduje návrhář formulářů Windows
'Lze ji upravovat v prostředí návrháře formulářů Windows.
' Neupravujte ji v editoru kódu.
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
'@design Me.TrayHeight = 0
'@design Me.TrayLargeIcon = False
'@design Me.TrayAutoArrange = True
Me.Text = "Form1"
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(448, 309)
End Sub
#End Region
End Class
Všimněte si, že editor kód barevně odlišuje. Zeleně jsou komentáře (text za jednoduchým apostrofem),
modře klíčová slova a ostatní text černě.
Příkazy Imports zpřístupňují pro aplikaci různé výchozí pojmenované prostory z .NET Framework.
V brožuře se postupně seznámíte i s několika dalšími.
Na příkazu Inherits v kódu třídy Form1 vidíte, že váš formulář dědí ze základní třídy System.WinForms.Form. Seznamujete se tak s významnou novou schopností Visual Basic.NET, kterou je dědění. Vytvoříte-li v jedné aplikaci nějaké „obecně využitelné“, neboli „základní“ formuláře, můžete v jiných
aplikacích formuláře odvozovat děděním z těchto šablon a pak jejich vzhled a chování modifikovat.
Procedura Public Sub New() je konstruktor třídy. Její první řádek musí obsahovat volání konstruktoru
základní třídy (nebo jiného konstruktoru aktuální třídy), aby se zajistilo, že se inicializace zděděných objektů
provede dříve než ostatní inicializace.
Poznámka. Klíčové slovo MyBase není skutečný objekt, takže ho nelze přiřazovat do proměnných, předávat do procedur nebo používat s operátorem Is. Používá se k tomu, abyste mohli volat metody základní třídy
při jejich překrývání v odvozené třídě. I do základní třídy se obvykle zařazuje volání MyBase.New.
Klíčové slovo Me umožňuje odkazovat na tu instanci třídy, jejíž kód se právě provádí. Lze ho předat jako
parametr i do procedur nacházejících se v jiném modulu.
Pomocí procedury InitializeComponent se „udrží natrvalo“ hodnoty vlastností, které nastavujete
v návrhovém režimu (v návrháři formulářů Windows).
#region je direktiva, která se používá ve spolupráci se schopností editoru kódu Visual vytvářet osnovy.
Na levé straně okna kódu vidíte svislou čáru, která obsahuje čtverečky se symboly plus a mínus, s jejichž
pomocí rozbalujete či sbalujete části kódu. Dá se tím dosáhnout lepší přehlednosti a čitelnosti kódu. Příkazy
pro zacházení s osnovou najdete na kaskádové nabídce příkazu Edit > Outlining.
18
Prototyp aplikace Windows
Volitelné klíčové slovo Overrides říká, že procedura překrývá proceduru se stejným názvem ze základní
třídy. Datové typy parametrů a návratové hodnoty (u funkcí) musí být přesně stejné jako u procedury ze základní třídy.
Jestliže nějaká komponenta poskytuje metodu Dispose, měla by se volat při ukončení práce
s komponentou, protože v této metodě komponenta uvolní všechny alokované systémové prostředky, odkazy
na jiné objekty a nakonec sebe sama.
Poznámka. Část kódu, kterou generuje návrhář formulářů a která je ve sbalené podobě vyznačena takto:
se vám může později hodit, až se dostanete do fáze, že budete chtít nebo potřebovat programovat formuláře a ovládací prvky na nich přímým zápisem kódu. Z této sekce můžete dost odkoukat a opisovat.
Úprava titulku formuláře a jiné drobné úpravy při běhu
Dejme tomu, že vám nestačí statický titulek formuláře a chtěli byste ho dynamicky měnit při běhu, například do něj přidat aktuální datum. Zařídí se to poměrně jednoduše tak, že mírně upravíte výchozí automaticky
vygenerovaný kód. Nebojte se, i když jste předchozí oddíl přeskočili, nemusíte se k němu vracet.
13.Přejděte do okna kódu formuláře (View > Code) a najděte řádek komentáře začínající na TODO (=
co se má udělat).
Na toto místo se píše inicializační kód formuláře, případně i jeho ovládacích prvků (zatím žádné nemáme). V nejjednodušších případech se jedná o výchozí nastavení nějakých vlastností, jejichž hodnoty nemůžete nebo nechcete nastavit v návrhovém režimu, protože hodnotu vlastnosti v té době
neznáte, protože bude známa až při běhu.
14.Pod řádek s komentářem TODO (nachází se těsně pod voláním procedury InitializeComponent
napište
Me.Text = "Automat dne " & Today()
Jedná se vlastně o prvek struktury DateTime pojmenovaného prostoru System, takže předchozí řádek lze
psát také ve tvaru:
Me.Text = "Automat dne " & System.DateTime.Today()
Všimněte si, že když píšete kód, kontroluje vývojové prostředí „pravopis“ podobně, jako když píšete dopis ve Wordu a syntakticky nesprávnou část podtrhne modrou vlnovkou. Textové řetězce se píší
v uvozovkách, & je operátor řetězení, který spojuje řetězce uvedené vlevo a vpravo do jediného řetězce. Aby
nebyly řetězce „slité“, nezapomeňte na mezeru za slovem dne.
VB6. Dříve se titulek formuláře nastavoval jako hodnota vlastnosti Caption. Výchozí hodnoty
vlastností se při běhu obvykle nastavovaly v událostních procedurách Load či Initialize
formuláře. Už je v seznamu událostí objektu formuláře nehledejte, protože nejsou.
Pro datum a čas se nyní používá 8 bajtový formát (datový typ DateTime). Příkazy Date a
Time byly (asi proto) nahrazeny příkazy Today a TimeOfDay. Obdobně se místo funkcí Date
a Time používají nyní vlastnosti Today a TimeOfDay struktury DateTime pojmenovaného
prostoru System.
Vlastnosti, které jste výše nastavili v návrhovém režimu, můžete nastavovat také až při běhu a dynamicky
tak měnit rozměry, pozici a jiné vlastnosti formuláře (a také ovládacích prvků, které později nakladete na
formulář):
19
Úvod do Visual Basic.net
' Formulář vždy nahoře
Me.TopMost = True
' Změna absolutních souřadnic (šířka a výška formuláře)
Me.Width = 500
Me.Height = 400
' Změna absolutní pozice (souřadnice levého horního rohu formuláře)
Me.Left = 500
Me.Top = 1000
' Změna relativních souřadnic
Me.Width += 100
Me.Height += 100
Operátor += přičte hodnotu k původnímu obsahu proměnné (vlastnosti) a přiřadí výsledek do proměnné
(vlastnosti). Podobě lze „zkracovat“ zápis u operátorů odčítání (-), násobení (*), dělení (/), celočíselné dělení
(\), mocnění (^) a řetězení (&).
VB6. Tyto operátory jsou ve VB.NET nové.
Šířku a výšku můžete také nastavovat současně, využijete-li strukturu Size pojmenovaného prostoru
System.Drawing. Tato struktura reprezentuje uspořádanou dvojici šířka, výška obdélníkové oblasti:
Me.Size = New System.Drawing.Size(600, 600)
Úplný zápis se System.Drawing.Size není v našem případě nutný, protože pojmenovaný prostor
System.Drawing je dostupný díky automaticky vygenerovanému příkazu Imports. Kdybyste ale v kódu
příkaz Imports System.Drawing neměli, došlo by při pokusu spustit aplikaci obsahující příkaz typu:
Me.Size = New Size(600, 600)
k chybě při běhu (spouštět a testovat aplikaci se naučíte za chvilku).
Jakmile je objekt Size definovaný, lze upravovat rozměry formuláře také takto:
Me.Size = New Size(Me.Size.Width, 400)
Je to ale poněkud méně přehledné než prosté nastavení vlastností Width resp. Height.
Podobně se dá nastavovat pozice formuláře. Například relativní změna o 100 směrem doprava a dolů:
Me.Left += 100
Me.Top += 100
Nebo najednou přes vlastnost Location a strukturu Point pojmenovaného prostoru System.Drawing:
Me.Location = New Point(300, 300)
Styl okraje formuláře se dá nastavit i při běhu, pomocí výčtového typu FormBorderStyle (pracuje se
s ním ve třídě Form pojmenovaného prostoru System.WinForms):
Me.BorderStyle = FormBorderStyle.FixedDialog
20
Prototyp aplikace Windows
Otestování primitivního formuláře
I když je naše „aplikace“ velmi primitivní, přesto stojí za to, vyzkoušet ji. Čím jednodušší prototyp aplikace je, tím snáze zvládnete případná úskalí při jejím testování ve vývojovém prostředí a mimo ně. Postupujte
takto:
1. Nastavte některé výše zmiňované vlastnosti v návrhovém režimu v okně vlastností formuláře.
2. Do automaticky vygenerovaného kódu přidejte pod řádek TODO některé z řádků uvedených
v předchozích oddílech, abyste si vyzkoušeli nastavování vlastností formuláře při běhu.
3. Zkuste vybudovat řešení příkazem Build > Build a prohlédněte si, co se vypisuje ve výstupním okně
(později využívejte příkaz Build > Rebuild).
4. Klepněte na tlačítko Start na panelu Debug nebo stiskněte F5 nebo zvolte Debug > Start. Nechceteli vypisovat informace o ladění zvolte Debug > Start Without Debugging (Ctrl+F5).
Proběhne-li vše v pořádku, uvidíte v popředí vývojového prostředí běžící formulář:
Všimněte si dolního okna Output, v němž se zobrazují informace o průběhu ladění projektu či budování
řešení.
5. Zkontrolujte, zda se na formuláři promítly úpravy, které jste provedli v návrhovém režimu a při
běhu a klepněte na tlačítko x pravém rohu formuláře, abyste formulář zavřeli.
21
Úvod do Visual Basic.net
Než se pustíte do práce s ovládacími prvky na formuláři, zkuste spustit naši „prázdnou aplikaci“ přímo
z Windows. Postupujte takto:
1. Na hlavním panelu Windows klepněte na tlačítko Start a z nabídky zvolte Spustit.
2. V dialogovém okně Spustit klepněte na tlačítko Procházet a vyhledejte spustitelný soubor aplikace
(v našem případě by to měl být soubor Automat1.exe a konec jeho úplné cesty by měl být
\Visual Studio Projects\Automat1\bin\).
3. V dialogovém okně Procházet klepněte na Otevřít, pak v dialogovém okně Spustit, kam se vrátíte,
na OK.
4. Na pracovní ploše Windows by se měl objevit běžící formulář. Zavřete ho klepnutím na tlačítko x
v jeho pravém horním rohu.
Náměty na procvičení
• I u takto primitivního formuláře je možné se zabavit řešením různých „problémečků“. Zkuste například
docílit toho, aby se nápis v titulkovém pruhu zobrazoval vždy uprostřed (centrovaný), a to i tehdy, když
uživatel bude měnit velikost formuláře tažením jeho okrajů.
• Z hlediska budoucího vývoje je ale daleko důležitější to, že už zde můžete začít uvazovat o vlastní šabloně
formuláře. Doplníte-li prázdný formulář o nějaké logo organizace, může být při řešení aplikací ve vaší organizace výchozím formulářem takto upravený formulář. Stačí využít princip vizuálního dědění formulářů. Uvádím zhruba postup, jak to udělat. Připadá-li vám to v této chvíli obtížené nebo vás to zdržuje,
následující postup ignorujte, v brožuře ho potřebovat nebudete.
1. Upravte formulář tak, aby mohl sloužit jako obecná šablona a uložte ho.
2. Zvolte Project > Add Inherited Form.
3. V dialogovém okně Add New Item vyberte ikonu Inherited Form a do pole Name napište název
formuláře, který budete dále rozvíjet z vybraného vzoru a klepněte na Open.
4. V dialogovém okně Inheritance Picker vyberte v seznamu ComponentName vzor (šablonu), na níž
má být založen váš zděděný formulář, do pole Inherited Name napište název pro svůj zděděný
formulář a klepněte na OK.
5. Ovládací prvky klaďte na zděděný formulář.
Přidávání ovládacích prvků na formulář
V tomto oddílu výchozí prototyp dokončíte. Dejme tomu, že chcete uživatelům své aplikace usnadnit
ukončování běhu formuláře, protože mají potíže s tím, aby se „trefili“ při klikání na malinké tlačítko Zavřít
v pravém horním rohu formuláře (a nezavírali omylem něco jiného). Rozhodli jste se proto, že tlačítko x
z formuláře odstraníte a nahradíte ho vlastním velkým tlačítkem s nápisem Konec.
Abychom měli pokud možno všichni výchozí prototyp formuláře stejný, projděme si ještě jednou kroky,
které jste měli až doposud udělat.
1. Založte nový projekt typu aplikace Windows, přejmenujte vhodně výchozí názvy (například na
Automat).
2. Nastavte vlastnost ControlBox formuláře na False a vlastnost TopMost na True.
3. Vlastnost BorderStyle nastavte prozatím na Sizable, na pevnou velikost ji nastavte, až budete
s formulářem hotovi.
22
Prototyp aplikace Windows
4. Nastavte vlastní titulek formuláře nastavením vlastnosti Text formuláře. Buď v návrhovém režimu nebo ve vygenerovaném kódu příkazem umístěným pod řádek s komentářem TODO (viz oddíl
„Úprava titulku formuláře a jiné drobné úpravy při běhu“ výše).
5. Klepněte na (svislou) záložku Toolbox na levé straně vývojového prostředí, abyste vysunuli soupravu nástrojů.
6. Nechcete-li ji mít vysouvací, klepněte v jejím titulkovém pruhu pravým tlačítkem myši a v místní
nabídce odstraňte zaškrtnutí položky Auto Hide. Chcete-li mít soupravu plovoucí, klepněte v jejím
titulkovém pruhu pravým tlačítkem myši ještě jednou a v místní nabídce zvolte Floating. Nevidíteli běžné nástroje, klepněte v soupravě na tlačítko (pruh) s nápisem Win Forms.
Příkazová tlačítka
V tomto oddílu se seznámíte s ovládacím prvkem, který tvoří jeden ze základních kamenů uživatelského
rozhraní aplikací, protože umožňuje uživateli pouhým klepnutím rozhodnout o tom o tom, co se má dělat dál.
Zde se naučíte, jak se tlačítko vytvoří a jak se pro něj napíše událostní procedura. Na konci oddílu „Tabelátorové řazení prvků na formuláři“ se ještě dozvíte, jak se pro tlačítka (a jiné ovládací prvky) vytvářejí tzv. přístupové klávesy.
1. Klepněte v soupravě na nástroj Button (nevidíte-li ho, posouvejte se po soupravě nástrojů pomocí
trojúhelníkových šipek nacházejících se na pravé straně soupravy.) a klepněte na formuláři tam,
kde se má objevit tlačítko.
Obdobným způsobem se na formulář kladou i jiné ovládací prvky. Po klepnutí se vytvoří
ovládací prvek o standardní velikosti. Jeho umístění a rozměry můžete snadno kdykoli později upravit. Můžete samozřejmě vytvořit ovládací prvek na zvoleném místě a o zvolené velikosti, když tažením myší pro něj vymezíte na formuláři obdélníkovou oblast.
2. Přejmenujte výchozí název tlačítka na lépe vypovídající (například btnKonec).
3. Nastavte hodnotu vlastnosti Text tlačítka na Konec.
4. Hned můžete také vyzkoušet jednu z nových schopností ovládacích prvků – jejich ukotvení.
V okně vlastností tlačítka klepněte na rozvírací šipku vedle vlastnosti Anchor a určete směry,
v nichž chcete mít tlačítko ukotvené. Viz obrázek:
23
Úvod do Visual Basic.net
Tato schopnost usnadňuje vývojářům návrh těch formulářů, jejichž velikost smějí uživatelé při běhu měnit. Nastavíte-li vhodně ukotvení, bude se při změně velikosti formuláře patřičně upravovat pozice i rozměry
ovládacího prvku. Než dlouhé popisy je lepší, když si různé varianty vyzkoušíte.
Zmíním se ještě o dvou nových zajímavých charakteristikách, které se také prezentují převážně graficky.
První z nich je „přikurtování do doku“ (vlastnost Dock). Některé ovládací prvky můžete „připoutat“ ke zvolené straně formuláře nebo nechat ovládací prvek, aby vyplnil svůj kontejner. Druhou je možnost zarovnat
nápis, který se zobrazuje na ovládacím prvku pomocí vlastnosti TextAlign. (Jak uvidíte později, týká se tato
vlastnost i textových polí a můžete tedy pohodlně zařídit, aby se text psaný do textového pole neobjevoval
zleva, ale zprava nebo centrovaný.)
Místo teoretického povídání je opět lepší, když si člověk nové schopnosti vyzkouší v praxi. Prověřte si je
na nějakém jednoduchém návrhu (jak je ten náš). Možnosti obou vlastností pro příkazová tlačítka shrnuje následující obrázek:
VB6. Pracujete-li s formuláři, u nichž bude moci uživatel měnit velikost formuláře, snižují
vlastnosti Anchor a Dock podstatně případy, kdy byl dříve nutno psát událostní proceduru Resize formuláře, tj. programovat „ručně“ změny pozice a velikosti ovládacích prvků na formuláři, když uživatel mění velikost formuláře tažením jeho okraje.
Určení, že má tlačítko funkci „jako OK“, resp. „jako Storno“
Chcete-li některé z tlačítek na formuláři prohlásit za tzv. výchozí tlačítko, nastavte vlastnost AcceptButton
formuláře na dané tlačítko. Způsobíte tím, že když uživatel stiskne Enter, vyvolá se tím činnost jako při
klepnutí na tomto tlačítku, bez ohledu na to, který ovládací prvek je právě aktivní (kromě případu, že je právě
aktivní jiné tlačítko).
Chcete-li některé z tlačítek na formuláři prohlásit za tzv. stornovací tlačítko, nastavte vlastnost CancelButton formuláře na dané tlačítko. Stornovací tlačítko má stejnou funkci, jako když uživatel stiskne Esc.
Vytvoření událostní procedury tlačítka
Aby tlačítko reagovalo na událost „uživatel na něm klepl“ požadovaným způsobem, musíte napsat odpovídající událostní proceduru. Můžete ji napsat přímo při práci v kódu, aniž byste museli přecházet do okna
návrháře formulářů:
1. Rozviňte levý seznam objektů v editoru kódu a vyberte název ovládacího prvku (btnKonec).
2. Rozviňte pravý seznam dostupných událostí a vyberte událost Click.
3. V těle vygenerované kostry událostní procedury zavolejte metodu Exit třídy Application.
24
Prototyp aplikace Windows
Celá procedura vypadá takto:
Public Sub cmdKonec_Click _
(ByVal sender As Object, ByVal e As System.EventArgs) Handles cmdKonec.Click
Application.Exit()
End Sub
Název událostní procedury se skládá z názvu ovládacího prvku, znaku podtržení a názvu události. Záhlaví
procedury je ve skutečnosti jediný řádek kódu. Aby byl přehlednější, rozdělil jsem ho na dva pomocí pokračovacích symbolů. Ve Visual Basicu je to dvojice znaků mezera a podtržení.
K ukončování aplikace se používá metoda Exit třídy Application, která zastaví všechny běžící cykly
zpráv ve všech vrstvách a uzavře všechna okna dané aplikace.
VB6. Běh formulářů se dříve ukončoval příkazem Unload, který už není. Příkaz End se sice
podporuje, ale stejně jako dříve se nedoporučuje, protože ukončuje práci programu okamžitě,
vlastně by se dalo říci, že násilně. Kostra událostní procedury je také komplikovanější, ale
v běžných situacích se o ni nemusíte starat. Všimněte si ale, že se ve VB.NET parametry
všech procedur standardně předávají hodnotou (ByVal), nikoli odkazem (ByRef), jak tomu
bylo dříve.
Událostní procedura je vlastně metoda, která je svázaná s událostí. První parametr událostní procedury
(sender) poskytuje odkaz na objekt, který vyvolal událost. Druhý je odkaz na objekt, který je specifický pro
danou událost a poskytuje dodatečné informace (například kterou klávesu uživatel stiskl v procedurách zpracovávajících úhozy z klávesnice nebo pozici kurzoru v událostních procedurách zpracovávajících klepnutí
myší). Pomocí klíčového slova Handles se v metodách může vypsat seznam událostí – tedy danou událost
můžete jednotně zpracovat pro více ovládacích prvků.
Odměna výherci v podobě obrázků
V této fázi řešení zařadíme jediný obrázek, protože se zatím spokojíme s jediným druhem výhry. Později
výhry rozlišíme na malé, větší a ještě větší a pro každou z výher zobrazíme jiný obrázek. Budeme předpokládat, že obrázky máte uložené buď ve stejné složce, v níž se vytváří spustitelný soubor aplikace nebo v nějaké
její podsložce s vhodným názvem, například \Obrázky. V naší úloze budeme používat soubory obrázků ve
formátu WMF (metasoubory Windows), které mají tu výhodu, že když je zvětšujete či zmenšujete, neztrácejí
na kvalitě, jako je tomu například u bitově mapovaných obrázků.
Potřebujete-li na formuláři zobrazit nějaký grafický obrázek, slouží k tomu ovládací prvek PictureBox.
Postup:
1. Klepněte v soupravě nástrojů na ovládací prvek PictureBox a nakreslete poměrně velký obdélník
při levé a dolní straně formuláře.
2. Klepněte na objektu pravým tlačítkem myši a z místní nabídky zvolte Properties. V okně vlastností
objekt pojmenujte (například picVýhra) a nastavte vlastnost SizeMode na StretchImage.
3. Klepněte vpravo od vlastnosti Image, klepněte na tři tečky a vyhledejte soubor obrázku.
Existují situace, kdy nechcete obrázek přiřadit objektu „natrvalo“, ale dynamicky ho měnit při běhu aplikace podle okolností. V takovém případě přiřaďte hodnotu vlastnosti Image v kódu. Využívá se při tom metoda FromFile třídy Image. Například:
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Moneybag.wmf")
25
Úvod do Visual Basic.net
V tomto konkrétním příkazu se využívá toho, že je dohodnuto, kde se budou nacházet soubory s obrázky,
takže se do kódu nemusí psát cesty k obrázkům „natvrdo“. Vlastnost Application.StartupPath vrací cestu, ke složce, do níž se ukládá spustitelný soubor aplikace (bez koncového lomítka vpravo).
Pokud byste potřebovali obrázek vymazat, dělá se to často pouhým skrytím (nastavením vlastnosti Visible
na False). Chcete-li skutečně objekt vyprázdnit, nastavte vlastnost Image na Nothing:
picVýhra.Image = Nothing
VB6. Dříve se obrázky vkládaly prostřednictvím ovládacího prvku Image (a jeho vlastnost
Stretch se nastavovala na True). PictureBox se spíše využíval jako kontejner pro jiné ovládací
prvky. Jako běžné kontejnery nyní slouží ovládací prvky GroupBox a Panel (jeho využití viz
další část úlohy). Obrázky se při běhu načítaly funkcí LoadPicture a vyprázdnění obrázku
se docilovalo voláním LoadPicture bez parametru.
Vytvoření popisků pro losovaná čísla
Dalším krokem v budování automatu bude, že vytvoříte tři „chlívky“ pro losovaná čísla. Pro tento účel
plně postačí, když využijete ovládací prvek typu popisek (Label) ze soupravy nástrojů. Postupujte takto:
1. Klepněte v soupravě nástrojů na ovládací prvek Label a nakreslete obdélník pro první číslo.
2. Klepněte na právě sestrojeném objektu pravým tlačítkem myši a z místní nabídky zvolte Properties. V okně vlastností popisek pojmenujte (například lblCislo1).
3. Nastavte vlastnost BorderStyle na Fixed3D, abyste vytvořili iluzi trojrozměrného objektu.
4. Přejděte k vlastnosti Text a odstraňte z výchozí hodnoty část Label, takže zbude pouze 1. Bude se
vám lépe formátovat písmo pro losované číslice.
5. Klepněte vedle vlastnosti Font, klepněte na tlačítko „tři tečky“ a v dialogovém okně Písmo zvětšete výchozí velikost na 48 (nebo na jinou vhodnou velikost podle toho, jak velká chcete čísla mít).
6. U popisných objektů se někdy hodí vlastnost TextAlign, kterou můžete ovlivnit způsob zarovnání
textu ve vymezeném obdélníku. Standardně je nastavena na hodnotu MiddleCenter a zde se nastavuje graficky (podobně jako třeba vlastnost Anchor).
7. Odstraňte hodnotu 1 z vlastnosti Text.
Když jste si podle svých potřeb naformátovali chlívek pro jedno losované číslo, bylo by dobré, kdybyste to nemuseli opakovat pro druhý a třetí popisek. Jedna z možností, jak se opakování vyhnout, je
využít schránku.
8. Zkopírujte objekt, který jste právě naformátovali, do schránky (vyberte ho a stiskněte Ctrl+C), pak
ho vložte (Ctrl+V) a vložte ještě druhou kopii (Ctrl+V).
9. Kopie objektu se položí na původní objekt. Přetáhněte je směrem doprava. Se zarovnáváním se
nezdržujte. Techniky, jak dát více objektů „do latě“, najdete v příštím oddílu „Formátování více
ovládacích prvků současně“.
VB6. Titulky popisků se dříve psaly do vlastnosti Caption, místo níž je nyní Text. Visual Basic dříve vkládal kopie objektů do levého horního rohu návrhu. To, že se kopie kladou na
zdrojový objekt, by mohlo mást, proto to připomínám.
26
Prototyp aplikace Windows
Daleko důležitější rozdíl je ale v tom, že se dříve Visual Basic vývojáře při prvním vložení
kopie ovládacího prvku přes schránku ptal na to, zda chce vytvořit tzv. pole ovládacích prvků
(control array). Jak vidíte, už se neptá, protože pole ovládacích prvků už nejsou. Další informace najdete dále v oddílu Procházení podmnožiny ovládacích prvků na formuláři.
Obrázek formuláře vidíte na příští straně. Obdélník vlevo dole je prázdný objekt PictureBox. Protože byl
vybrán jako první, jsou jeho úchyty (čtverečky v rámu) bílé. Úchyty ostatních vybraných objektů jsou černé.
Na obrázku je už několik tlačítek a navíc je zde objekt Panel, do něhož byly umístěny tři naše popisné objekty. K panelu se dostaneme později.
VB6. Dříve byly barvy úchytů vybraných objektů opačné. Černá byla barva úchytů toho objektu, který byl vybrán jako poslední (a podle něho se také řídilo formátování vybrané skupiny objektů – viz příští oddíl.
Formulář by teď měl zhruba vypadat takto:
Formátování více ovládacích prvků současně
Když umístíte na formulář několik ovládacích prvků, je často třeba provést úpravy typu „štábní kultura“.
Například zarovnat horní strany, vyrovnat rozestupy mezi ovládacími prvky apod. Rozhodně tyto činnosti nedělejte taháním jednotlivých objektů či taháním úchytů, tedy zarovnáváním „od oka“. K dispozici máte daleko lepší prostředek – příkazy v nabídce Format. Postupujte takto:
1. Potřebujete-li nějak naformátovat skupinu nějakých ovládacích prvků, všechny je nejprve vyberte.
Stiskněte klávesu Shift a klepejte na jednotlivých objektech. Přitom je velmi důležité to, který objekt vyberete jako první, protože podle něho se bude formátovat.
2. Vydávejte vhodné příkazy z nabídky Format.
3. Až budete s formátováním hotovi, klepněte někde mimo výběr, čímž vícenásobný výběr zrušíte.
27
Úvod do Visual Basic.net
Přehled hlavních formátovacích možností pro množinu vybraných ovládacích prvků:
• Zarovnávání. Format > Align, v kaskádové nabídce jsou příkazy pro zarovnání levých stran, středů, pravých stran, horních stran, středů, dolních stran a na mřížku.
• Změna velikosti. Format > Make Same Size, v kaskádové nabídce můžete udělat objekty stejně velké, stejně vysoké, stejně široké nebo upravit velikost na mřížku.
• Rozestupy. Format > Horizontal Spacing, resp. Format > Vertical Spacing. V kaskádové nabídce můžete volit stejné rozestupy nebo rozestupy zvětšit, zmenšit nebo zcela odstranit.
• Centrování na formuláři. Format > Center in Form, v kaskádové nabídce můžete centrovat svisle nebo vodorovně.
• Pořadí podle osy z. Ovládací prvky se mohou na formuláři také překrývat, jako když kladete listy papíru
na stůl. Toto pořadí můžete změnit v kaskádové nabídce příkazu Format > Order. Přenést dopředu (Bring to
Front) nebo přenést dozadu (Send to Back). V součinnosti s nastavením barev se tím dají vytvářet i různé
grafické efekty.
Mřížka (Grid) je neviditelný rastr, který usnadňuje přesná zarovnávání a jiné formátovací operace. Velikost rastru se dá nastavit, mřížka se dá také vypnout.
VB6. Pozor na to, že dříve určoval formátování ovládacích prvků ten, který jste vybrali jako
poslední. Ve VB.NET to určuje ovládací prvek, který vyberete jako první.
Tabelátorové řazení prvků na formuláři
Když tvoříte komplikovanější formuláře (zejména je to důležité u formulářů, na nichž budou uživatelé pořizovat a upravovat nějaká data), často je uživatelé ovládají z klávesnice a přecházejí z jednoho ovládacího
prvku na jiný stiskem klávesy Tab (zleva doprava, shora dolů) nebo opačným směrem (Shift+Tab). ˇPozice
jednotlivých prvků v tabelátorovém řazení je ale dána historickým pořadím, v jakém jste ovládací prvky kladli na formulář. Když pak ovládací prvky různě přeházíte (aby byl formulář hezčí nebo přehlednější), důsledkem je, že uživatel skáče po formuláři tam a zpět, což není příjemné.
Proto byste měli v určitých fázích návrhu formuláře toto řazení zkontrolovat a případně ho upravit. Dělá
se to tak, že při práci v návrhu formuláře vydáte příkaz View > Tab Order. V levém rohu každého ovládacího
prvku se objeví malý obdélník s číslem, které vyjadřuje pořadí daného prvku v tabelátorovém řazení. Viz obrázek na příští straně.
Klepáním na čísla můžete tabelátorové řazení měnit, hodnoty ostatních ovládacích prvků se po klepnutí
změní automaticky tak, aby čísla tvořila souvislou řadu od jedné. Na obrázku výše vývojář právě upravil pořadí tlačítek. Všimněte si, že řazení prvků umístěných v kontejneru (panel okolo tří popisných objektů) je dáno desetinným číslem.
Pořadí prvku v tabelátorovém řazení odpovídá vlastnost TabIndex ovládacího prvku. Nastavením vlastnosti TabStop na False můžete daný ovládací prvek z tabelátorového řazení vyloučit.
VB6. Dříve se tabelátorové řazení vizuálně nastavovat nedalo a museli jste to dělat ručně,
prostřednictvím vlastnosti TabIndex.
28
Prototyp aplikace Windows
Přístupové klávesy pro ovládací prvky
Uživatelé, kteří nemají myši nebo myši nemají rádi, ocení, když jim pro ovládací prvky, které jsou součástí tabelátorového řazení, připravíte přístupové klávesy. Přístupová klávesa se pozná podle toho, že v nápisu
na ovládacím prvku je znak (obvykle písmeno) přístupové klávesy podtržený. Když uživatel stiskne Alt+ přístupovou klávesu, aktivuje daný ovládací prvek a nemusí na něj „doskákat“ opakovaný stiskem klávesy Tab.
(Něco poněkud jiného je klávesová zkratka, která se běžně definuje v nabídkách. Je to kombinace kláves, která umožňuje vydat příkaz z nabídky, aniž by uživatel musel nabídku otevřít. Často se kombinuje s klávesou
Ctrl, viz například klávesové zkratky pro práci se schránkou (Ctrl+C aj.)
Přístupová klávesa se definuje tak, že se před písmeno v nápisu (hodnota vlastnosti Text) napíše znak &.
Doporučuje se, aby to byl první znak v nápisu, nutná podmínka to ale není.
Jak to ale zařídit, když ovládací prvek žádný nápis nemá (například textové pole)? Udělá se to fintou, která využívá tabelátorového řazení (ostatně proto jsem vytváření přístupových kláves zařadil sem):
1. Poblíž textového pole (nebo jiného ovládacího prvku, pro který chcete vytvořit přístupovou klávesu) vytvoříte popisek (Label).
2. Přiřaďte vhodný nápis do jeho vlastnosti Text a označte některý znak jako přístupovou klávesu tím,
že před něj napíšete &.
Popisky sice nejsou součástí tabelátorového řazení (nemohou být aktivní), stačí však aby popisek a
„přidružený“ ovládací prvek následovaly v tabelátorovém řazení těsně za sebou.
3. Můžete to zařídit vizuálně po vydání příkazu View > Tab Order nebo přímo nastavením vlastnosti
TabIndex popisu na číslo o jedničku menší, než je hodnota vlastnosti TabIndex přidruženého ovládacího prvku.
29
Úvod do Visual Basic.net
Takto budou mít přístupové klávesy definované obě textová pole na formuláři parametrů. Chcete-li nějaký ovládací prvek z tabelátorového řazení vyloučit, nastavte jeho vlastnost TabStop na False.
Poznámka. Chcete-li jako součást textu mít znak &, napište ho dvakrát za sebou. Výjimečně by se mohlo
stát, že byste potřebovali v popisku zobrazovat znaky &, protože jejich prostřednictvím prezentujete nějaké
údaje z databáze, které obsahují znaky &. V takovém případě nastavte vlastnost UseMnemonic popisku na
True.
Vylosování čísel
Dalším krokem v řešení naší úlohy bude vylosovat tři náhodné číslice, každá se objeví v jednom popisném objektu. Později některé kombinace vylosovaných čísel prohlásíme za výherní čísla. Náhodná čísla se
doposud ve Visual Basicu generovala převážně pomocí spolupráce příkazu Randomize a funkce Rnd, která
vrací náhodné číslo z intervalu 0, 1. Tento způsob použijeme i zde. Nový způsob, který si můžete vyzkoušet,
viz Námět na procvičování na konci oddílu „Alternativní způsob losování čísel“.
Tato etapa řešení se tedy skládá ze dvou kroků:
1. Na místo, kam umisťujeme inicializační kód formuláře (pod řádek TODO ve vygenerovaném kódu
formuláře) přidáme příkaz Randomize.
2. Do událostní procedury Click tlačítka s nápisem Roztočit přidáme kód, jímž přiřadíme do vlastnosti Text jednotlivých popisných prvků náhodně získanou číslici z intervalu 0 až 9. Hodnotu vrácenou funkcí Rnd vynásobíme deseti a funkcí Int odřízneme desetinná místa.
VB6. Napíšete-li do kódu příkaz Randomize, zjistíte, že ho vývojové prostředí označí modrou vlnovkou, což znamená, že je něco v nepořádku. Je to proto, že tento příkaz i funkce Rnd
jsou nyní nahrazeny metodami pojmenovaného prostoru Microsoft.VisualBasic. Compatibility.VB6, takže příkaz musíte zapsat ve tvaru:
Microsoft.VisualBasic.Compatibility.VB6.Randomize()
To není příliš příjemné, naštěstí se dá kód zkrátit.
3. Přidejte na začátek kódu příkaz Imports pro tento pojmenovaný prostor:
Imports Microsoft.VisualBasic.Compatibility.VB6
Pak budete moci příkaz zkrátit na Randomize()
A také funkci Rnd nebudete muset volat s tak dlouhatánskou kvalifikací.
VB6. K přiřazení hodnoty do popisku dříve stačil například takovýto příkaz:
lblCislo1 = Int(Rnd * 10)
Ve VB.NET to takto napsat nejde, a to dokonce z několika důvodů. Na levé straně tohoto přiřazovacího příkazu byla vypuštěna tzv. výchozí vlastnost ovládacího prvku, kterou byla dříve
Caption. Výchozí vlastnosti se už ve Visual Basicu nepodporují (kromě těch, které jsou parametrizované – jimi se v této brožuře zabývat nebudeme), takže je už nemůžete vynechávat.
Mimo jiné se tím přispívá k lepší srozumitelnosti kódu.
Tato věc má další závažný důsledek. Protože nejsou výchozí vlastnosti, není nutné rozlišovat,
zda přiřazujete do vlastnosti (Caption, příkaz Let) nebo zda přiřazujete odkaz na objekt
(příkaz Set). Z toho důvodu se už příkazy Let a Set nepodporují!
Zdá se tedy, že se problém vyřeší jednoduše tím, že se prostě uvede vlastnost explicitně (za předpokladu,
že máte na začátku kódu příkaz Imports pro kompatibilní knihovnu):
lblCislo1.Text = Int(Rnd * 10)
30
Prototyp aplikace Windows
Kupodivu vlnovka nezmizí. Když na ni umístíte kurzor myši, zobrazí se okénko s touto informací:
Toto okénko patří mezi mnohé pomůcky, které poskytuje editor kódu. (Možnosti jsou soustředěny ve
složce Basic v rámci složky Text Editor dialogového okna Tools > Options.) Okénko nápovědy při psaní kódu,
kterým voláte funkci, je zobrazeno pod příštím výpisem, další ukázky jsou uvedeny v oddílu „Zjištění, zda
uživatel vyhrál“.
Visual Basic byl neblaze proslulý mj. tím, že podporoval nedeklarované proměnné, daly se „zamlčovat“
výchozí objekty a vlastnosti a také byl velmi liberální ohledně provádění implicitních konverzí. Mezi nové
schopnosti programovacího jazyka VB.NET patří velmi důležitý příkaz Option Strict. Je-li v činnosti
(On), povoluje implicitní konverze pouze tehdy, když se jedná o rozšíření datového typu na obecnější (například Byte na Integer). Tím se automaticky vyloučí možnost, že by se při konverzi - zejména při převodu
číselných typů na řetězce - ztrácela přesnost nebo data jako taková. Option Strict zasáhne také při výskytu nedeklarované proměnné (protože implikuje Option Explicit) a při příkazech tzv. pozdního vázání objektů.
Dá se tedy říci, že kvůli tomuto příkazu stoupá důležitost explicitního využívání dříve někdy dost přehlížených konverzních funkcí. Náš konkrétní příkaz spravíte například takto:
lblCislo1.Text = CStr(Int(Rnd * 10))
Když píšete tento příkaz a dostanete se k levé závorce funkce Int, uvidíte jinou zajímavou pomůcku, která upozorňuje na novou mocnou schopnost Visual Basic.Net, totiž přetěžování (overloading). Přetěžování
procedur umožňuje pod jediným názvem volat několik procedur, které se liší typem předávaných parametrů.
Konkrétně, funkce Int má sedm variant:
Zobrazuje se vždy jen jediný řádek, varianty prohlížíte klepáním na šipkách. Můžete samozřejmě psát
vlastní přetěžované procedury (jedná-li se o funkce, musí být typ návratové hodnoty stejný). Ukážeme si to
později na dvou variantách funkce, která bude zjišťovat, zda uživatel automatu vyhrál.
Losování čísel se pokusíme řešit obecněji. Předně se může stát, že budeme chtít losovat čísla z jiného intervalu – proto bude žádoucí, když si sestrojíme k tomuto účelu vlastní uživatelsky definovanou funkci. Kromě toho, abychom naplnili tři popisné objekty, musíme napsat tři téměř stejné příkazy. Dokud jsou tři, je to
celkem jedno. Pokud by bylo čísel třeba 20, už by tento způsob byl poněkud neohrabaný. Proto se pokusíme
přiřazení hodnot (ale i následné operace) řešit pomocí cyklu. První dílčí úlohu vyřešíme hned teď, rozbor
možností cyklování přes nějaké ovládací prvky najdete později v oddílu „Procházení podmnožiny ovládacích
prvků na formuláři“.
31
Úvod do Visual Basic.net
Vytvoření vlastní metody pro vylosování čísla
Chcete-li napsat proceduru, která vylosuje náhodné celé číslo ze zvoleného intervalu, najdete patřičný výraz v nápovědě k funkci Rnd. Vyjdete-li z něho a z informací uvedených v předchozím oddílu, můžete přidat
do kódu formuláře tuto funkční proceduru:
Public Function VygenerovatPrirozeneCislo _
(ByVal DolniMez As Integer, ByVal HorniMez As Integer) As String
VygenerovatPrirozeneCislo = _
CStr(Int((HorniMez - DolniMez + 1) * Rnd + DolniMez))
End Function
Funkční procedury jsou druhým základním typem procedur ve Visual Basicu. Od procedur typu Sub se liší klíčovým slovem v úvodním a uzavírajícím definičním příkazu, hlavně ale tím, že vracejí hodnotu. Datový
typ návratové hodnoty se udává za seznamem parametrů, návratová hodnota se získá tím, že se v těle funkce
uvede přiřazovací příkaz, kde na levé straně funkce je její název, vpravo výraz určující návratovou hodnotu.
VB6. Připomínám, že nyní se parametry standardně předávají hodnotou (ByVal), nikoli odkazem (ByRef) a že se standardně také vyžadují definice typů parametrů a návratové hodnoty
(klíčová slova As).
Příkaz pro přiřazení vylosovaného čísla bychom proto mohli napsat takto:
lblCislo1.Text = VygenerovatPrirozeneCislo(0, 9)
Modifikace algoritmu losování
Generování v podobě procedury může mít i jiné výhody. Když tuto proceduru „vhodně“ doplníte, můžete
si automat vylepšit ve svůj prospěch, například snížíte trochu pravděpodobnost, že se vylosují taková čísla,
která jsou výherní (uživatelům o tom samozřejmě neřeknete).
Například, je-li výherní kritérium stanoveno jako „alespoň jedna jednička“ a vy nechcete, aby uživatelé
příliš vyhrávali, můžete například proceduru modifikovat tak, že pokud se vylosuje něco jiného než jednička,
tak to necháte, když se vylosuje jednička, tak v polovině případů budete losovat ještě jednou. Upravená procedura by mohl mít například tento tvar:
Public Function VygenerovatPrirozeneCislo _
(ByVal DolniMez As Integer, ByVal HorniMez As Integer) As String
Dim strCislo As String
strCislo = CStr(Int((HorniMez - DolniMez + 1) * Rnd + DolniMez))
If (strCislo = "1") And (Int(2 * Rnd) Mod 2 = 0) Then
VygenerovatPrirozeneCislo = _
CStr(Int((HorniMez - DolniMez + 1) * Rnd + DolniMez))
Else
VygenerovatPrirozeneCislo = strCislo
End If
End Function
Základní rozhodovací konstrukcí je ve Visual Basicu If podmínka Then něco udělej End If.
Vyhodnotí-li se podmínka na True, provedou se příkazy těla konstrukce, jinak se neprovede nic
(v železničářské terminologii „výhybka“). Zde je uvedena varianta s frází Else. Jestliže podmínka platí, udělej to, jinak udělej něco jiného (v železničářské terminologii „rozdvojení na dvě koleje“).
32
Prototyp aplikace Windows
Konstrukce lze vnořovat a pomocí klíčových slov ElseIf docílit více kolejí. Jedná-li se o více než dvě
větve a podmínka je u všech větví stejná, používejte konstrukci Select Case (viz testování, zda uživatel
vyhrál pomocí vlastní přetížené funkce Vyhral, kterou budeme probírat později). Mod vrací zbytek po dělení
levého operandu pravým.
VB6. Logických hodnot True a False se dotýká „nepatrná“ drobnost, z jejíhož přehlédnutí
by mohla některé programátory VB6 pěkně bolet hlava. Jestliže jste ve svých programech
místo hodnoty True používali číselné vyjádření, vezměte prosím na vědomí, že hodnotě True
nyní odpovídá číselná hodnota 1, nikoli –1!
Konstanty a datové typy ve Visual Basicu
V proceduře uvedené výše jsme použili číselnou konstantu jedna (1). Vzhledem k množství potřebných
konverzí se někdy hodí, vynutit přímo při zápisu konstanty její datový typ. Dělá se to tak, že se za literál zapíše počáteční písmeno, které identifikuje datový typ. Například 1R znamená, že literál 1 bude datového typu
Double. Písmena pro jednotlivé číselné typy jsou: C=Char, D=Decimal, F=Single, I = Integer, L = Long,
R=Double, S = Short. Dají se také používat tzv. sufixy typů Visual Basicu (%, &, @, !, # a $).
V naší proceduře jsme se dotkli pojmu datový typ. Datový typ určuje, jaký druh dat může daná konstanta,
proměnná, pole, vlastnost, parametr procedury či návratová hodnota funkce obsahovat. Neuvedete-li explicitně datový typ, použije se výchozí datový typ Object. V této brožuře se budete převážně setkávat s tzv. přirozenými datovými typy Visual Basicu: Boolean, Byte, Char, Date, Decimal, Double, Integer, Long,
Object, Short a String.
Ve Visual Basic.NET odpovídají tyto typy strukturám či třídám pojmenovaného prostoru System. Datové
typy mají proto členy, k nimž se dá přistupovat podobně, jako přistupujete k vlastnostem a metodám objektů.
Například, datový typ Date je reprezentován strukturou System.DateTime a její vlastnost DaysInMonth
určuje, kolik dní je v zadaném měsíci zadaného roku.
VB6. Několik velmi závažných změn se ve VB.NET týká právě datových typů. Především už
neexistuje datový typ Variant (místo něho je Object) a funkce VarType, nepodporují se řetězce pevné délky a nepodporují se také uživatelské datové typy (konstrukce Type…End Type, místo ní se používá zobecněná konstrukce Structure…End Structure).
Nepodporují se také příkazy Deftyp. Datum se nyní ukládá na 8 bajtů (dříve 4) a změnám se
nevyhnuly ani číselné datové typy. Místo Integer je nyní Short, místo Long je Integer,
kromě toho se dá používat i datový typ System.SByte (8 bitů se znaménkem)
Volitelné parametry procedury
Protože dejme tomu předpokládáte, že většinou budete v daném projektu losovat číslice, (tj. hodnoty 0
až 9), můžete si metodu zobecnit tak, že z původních povinných parametrů uděláte volitelné. Dělá se to tak,
že před parametry (musí to být poslední parametry vpravo) přidáte klíčové slovo Optional a uvedete výchozí hodnoty. Funkce pak bude vypadat takto:
Public Function VygenerovatPrirozeneCislo _
(Optional ByVal DolniMez As Integer = 0, _
Optional ByVal HorniMez As Integer = 9) As String
VygenerovatPrirozeneCislo = _
CStr(Int((HorniMez - DolniMez + 1) * Rnd + DolniMez))
End Function
33
Úvod do Visual Basic.net
Volání se v našem případě zjednoduší na tvar:
lblCislo1.Text = VygenerovatPrirozeneCislo()
VB6. Dříve bylo uvádění výchozích hodnot nepovinné. Nepředání některého z volitelných parametrů se testovalo funkcí IsMissing. Protože jsou nyní výchozí hodnoty povinné, je tato
funkce přebytečná a nepodporuje se.
Alternativní způsob losování čísel
Jako téměř všechny úlohy, i losování můžete řešit mnoha způsoby. Například, místo losování jednotlivých
číslic můžete rovnou vylosovat jediné číslo od 0 do 999, a pak ho rozdělit na jednotlivé číslice. Můžete
k tomu využít vestavěnou funkci Format, která umožňuje převést pomocí bohaté palety masek hodnotu uvedenou jako první parametr na řetězec pomocí formátovacího řetězce uvedeného jako druhý parametr:
Dim Trojice As String
Trojice = Format(VygenerovatPrirozeneCislo(0, 999), "000")
Poznámka. Pro účely formátování se ve Visual Basic.NET připravují speciální ovládací prvky jako jsou
FormatNumber či FormatDateTime, jejichž popis jsem při psaní brožury neměl k dispozici, takže je v aplikaci
nepoužívám a držím se klasického způsobu formátování.
Chcete-li mít jednotlivé číslice (znaky jako prvky pole), dá se to udělat také najednou, součinností funkcí
Format a Split:
Dim Trojice() As String
Trojice = Split(Format(VygenerovatPrirozeneCislo(0, 999), "0 0 0"))
Nabízí se samozřejmě další varianta, uložit vygenerované číslice do celočíselného pole. Tuto variantu
uvádím především proto, abych upozornil na rozdíly, které čekají uživatele předchozích verzí Basicu při práci
s poli a dále proto, že si na různém způsobu uložení generovaných výherních čísel (řetězec a celočíselné pole)
ukážeme tvorbu přetížené procedury Vyhral. Trojici číslic lze vygenerovat a uložit samozřejmě také takto:
Dim i, Trojice(3) As Integer
For i = 0 To 2
Trojice(i) = CInt(VygenerovatPrirozeneCislo())
Next
VB6. Také při práci s poli (arrays), ostatně jako skoro všude jinde, došlo k několika velmi
podstatným změnám. Pole se číslují zásadně od nuly, z čehož mj. plyne, že je nadbytečný příkaz Option Base, proto se nepodporuje.
Horní mez v deklaraci pole určuje výchozí počet prvků pole (v našem výpisu konkrétně 3), nikoli počet prvků plus jedna, jako tomu bylo dříve! Horní mez je tedy počet prvků mínus 1
a tuto hodnotu vrátí vestavěná funkce UBound.
Deklarace pole pevné délky s explicitní dolní a horní mezí, jako například
Dim Trojice(0 To 3) As Integer
se už nepodporuje. Připomínám, že dolní mez všech polí musí být ve VB.NET nula. Prvky
pole však můžete inicializovat výchozími hodnotami. Například:
Dim Trojice() As Integer = {9, 8, 7}
Vícerozměrné pole můžete deklarovat pomocí pozičních závorek. Například trojrozměrné pole celých čísel příkazem:
Dim Kvádr(,,) As Integer
34
Prototyp aplikace Windows
Několik „drobných“ rozdílů je také spojeno s příkazem ReDim, který se používá
k předimenzování dynamického pole. Lze už měnit velikost kteréhokoli rozměru, počet rozměrů však musí zůstat stejný.
Tedy, zatímco ve VB6 všechno následující projde:
Dim K() As Integer
' V deklarační sekci
' V proceduře pak:
ReDim K(5)
MsgBox (UBound(K))
'6
ReDim K(-1 To 7)
MsgBox (UBound(K) - LBound(K) + 1)
'9
ReDim K(4, 5)
MsgBox (UBound(K))
'4
ve VB.NET tomu tak není. Chování ve VB.NET ilustrují následující ukázky:
Dim Kvádr(,,) As Integer
' V deklarační sekci
' V proceduře pak:
ReDim kvádr(5, 7, 9)
ReDim kvádr(10, 10) ' změna počtu rozměrů nejde
Dim krychle() As Integer ' V deklarační sekci
' V proceduře pak:
ReDim krychle(5)
ReDim krychle(5, 5)
Poslední příkaz neprojde, protože počet rozměrů nejde měnit. VB.NET vám oznámí, že
„Cannot change the Rank in a ReDim“).
Poslední připomínka. Ve VB6 jste mohli i úvodní deklaraci pole zařídit příkazem ReDim. Ve
VB.NET se to už nepovoluje.
Námět na procvičování. Výše uvedené způsoby losování číslic jsem použil hlavně proto, že se na poměrně jednoduché úloze dalo upozornit na množství rozdílů mezi VB6 a VB.NET. Vyzkoušejte si nějaký modernější způsob. Například, pojnenovaný prostor System poskytuje generátor pseudo náhodných čísel
prostřednictvím třídy Random. Definujete-li si proměnnou Dim náhčíslo As New Random(), můžete pak
snadno generovat pseudonáhodná čísla metodou Next. (Jedna z jejích variant umožňuje specifikovat interval,
z něhož chcete čísla získávat). Třída zahrnuje i jiné zajímavé metody, například možnost naplnit pole bajtů
náhodnými čísly (metoda NextBytes).
Pomocné výpisy mezivýsledků
Když ve Visual Basicu testujete nějaké algoritmy, postupy, funkce apod., běžně potřebujete někam si vypisovat mezivýsledky. Jednou ze základních možností je dialogové okno zpráv, s nimiž se seznámíte později,
v procedurách uvedených v oddílu „Formulář parametrů“.
35
Úvod do Visual Basic.net
Druhým běžným způsobem je, že si mezivýsledky a další pomocné výstupy zapíšete do výstupního okna
(Output). K tomuto účelu se používá několik metod třídy Debug z pojmenovaného prostoru System.Diagnostics. Například, chcete-li si pro kontrolu vypsat horní mez pole Trojice a jeho aktuální
hodnoty, dá se to udělat takto:
Dim i as Integer
System.Diagnostics.Debug.WriteLine(CStr(Ubound(Trojice)))
System.Diagnostics.Debug.Write("Vylosované hodnoty: ")
For i = 0 To Ubound(Trojice)
System.Diagnostics.Debug.Write(CStr(Trojice(i)) & Space(1))
Next
Výpis bude vypadat takto:
2
Vylosované hodnoty: 0 8 5
Další dvě podobné metody se jmenují WriteLineIf a WriteIf a umožňují podmínit výpisy informací
nějakými kritérii.
VB6. Tyto metody pojmenovaného prostoru System.Diagnoastics nahrazují dříve
používanou metodu Print globálního objektu Debug (a metodu Assert nahrazují metody
Assert a Fail).
Zda uživatel vyhrál – provizorní kritéria
Kritéria, která určí, zda uživatel vyhrál, stanovíme pochopitelně my. Přirozeně bychom měli ohlídat, abychom nezkrachovali. Otázkou stanovení finanční výše výher vzhledem k vsazené částce se budeme zabývat
později. Teď si zvolíme nějaké velmi jednoduché kritérium, abychom mohli prototyp aplikace rychle otestovat. Jakmile máme vygenerovaná čísla, můžete do událostní procedury Click tlačítka s nápisem Roztočit přidat kód, který zjistí, zda uživatel vyhrál (například první číslo je 1 nebo je druhé 2 nebo je třetí 3). Jestliže
vyhrál, zobrazíme obrázek a pípneme. Náš test může proto vypadat takto:
If lblCislo1.Text = "1" Or _
lblCislo2.Text = "2" Or _
lblCislo3.Text = "3" Then
picVýhra.Visible = True
End If
Také pro tuto úlohu se nabízí zpracování v nějakém cyklu. Rozbor některých postupů pro zpracování
množiny ovládacích prvků v cyklu viz oddíl „Procházení podmnožiny ovládacích prvků na formuláři“.
Jak už jsem se zmínil, když začnete ve Visual Basicu pást nějaký kód, editor kódu při tom asistuje
a nabízí různé pomůcky (jednu z nich jste viděli už výše v souvislosti s příkazem Option Strict v oddílu
„Vylosování čísel“.
Další šikovnou pomůckou – zvláště když chcete nahradit jednu variantu kódu jinou, ale nejste si jisti, zda
se nebudete později chtít vrátit k té původní – jsou tlačítka Comment Block a Uncomment Block na panelu nástrojů Edit. Umožňují pohodlně převádět vybrané řádky kódu na komentář, resp. komentáře zase zpětně převádět na kód (při jednom klepnutí se přidá, resp. odstraní ve vybraných řádcích jeden uvozující apostrof).
Jakmile napíšete název objektu a tečku, rozvine editor kódu (za předpokladu, že jste pomůcky nevypnuli)
seznam vlastností a metod tohoto objektu (viz okénko nad kódem na levé straně obrázku na příští straně).
Vpravo dole připomínám na obrázku opět situaci, kdy si už nemůžete dovolit implicitní konverzi (číslici musíte zapsat jako řetězec, abyste sjednotili datové typy levé a pravé strany).
36
Prototyp aplikace Windows
O konstrukci If ve spojení s logickými operátory se zde rozepisuji podrobněji proto, že opět (jako skoro
všude jinde) došlo ve Visual Basic.NET k významné změně. Při logických operátorech se totiž používá tzv.
zkrácené vyhodnocování. V podstatě jde o to, že jakmile je jasné, že návratová hodnota podmínky bude True,
další výrazy se už nevyhodnocují. Snad bude srozumitelnější jednoduchý příklad.
Ve Visual Basicu 6.0 skončí kód:
Dim a, b As Integer
a = 4
b = 0
If a = 4 Or a / b = 1 Then
MsgBox "prošlo"
End If
chybou při běhu 11 (dělení nulou), kdežto ve Visual Basic.NET kód projde (musíte ovšem řádek výpisu
zapsat v jiném tvaru, například takto:
messagebox.Show("prošlo")
Informace o vypisování zpráv uživateli v dialogovém okně viz oddíl „Přidání formuláře parametrů“.
Procházení podmnožiny ovládacích prvků na formuláři
Když máte na formuláři všelijaké ovládací prvky, potřebujete často projít v cyklu nějakou jejich podmnožinu (například nastavit nějaké vlastnosti všech ovládacích prvků typu popisek (Label), nastavit písmo všech
přístupných ovládacích prvků na kurzívu apod.). V naší konkrétní úloze by se nám cyklus hodil pro naplnění
popisků vylosovanými čísly i pro otestování, zda uživatel vyhrál. (Nebereme přitom v úvahu výkonnost – tj.
neřešíme problém, zda je některý postup rychlejší než jiný).
VB6. Dříve poskytoval Visual Basic k tomuto účelu řadu technik a každý programátor měl
v oblibě nějakou jinou. V následujícím výčtu uvedu alespoň některé, protože jsou možná někteří z vás na nějakou z nich zvyklí a budete si muset odvyknout.
37
Úvod do Visual Basic.net
• Především se takové úlohy daly řešit přes tzv. pole ovládacích prvků (control array), o němž jsem
už výše v jedné připomínce uvedl, že se už nepoužívá. Místo toho, abyste měli jednotlivé popisky
jako samostatné objekty, umístili jste na formulář jeden popisek, pak ho zkopírovali do schránky a
vkládali další, přičemž jste na dotaz Visual Basicu při vkládání první kopie prohlásili, že má vytvořit pole ovládacích prvků (klepnutím na tlačítko Ano v okně zprávy). Na jednotlivé prvky jste se
pak mohli odkazovat pomocí indexů (prvky pole ovládacích prvků se číslovaly od nuly). Například,
pokud jste pole popisků nazvali třeba lblCislo, mohli jste všechny popisky zařazené do pole (bez
ohledu na to, kolik jich je), zpracovat takto:
Dim i As Integer
For i = 0 To lblCislo.Count - 1
lblCislo(i) = VygenerovatPrirozeneCislo(0, 9) ' vygeneruje náhodná čísla
Next
• Jestliže jste měli za úkol zpracovat v cyklu různé druhy ovládacích prvků, využívala se někdy
k tomuto účelu vlastnost Tag ovládacích prvků v součinnosti s kolekcí Controls. Vlastnost Tag
neměla ve Visual Basicu 6.0 žádný specifický význam a sloužila jako pomocná „paměť“ pro uložení uživatelsky definovaných informací o daném ovládacím prvku. Proto jste cyklus přes takové
prvky mohli sestrojit tak, že jste (v režimu návrhu nebo při běhu) přiřadili do této vlastnosti nějakou identifikaci:
OvládacíPrvek.Tag = "NějakáIdentifikace"
a pak napsali tento druh cyklu:
Dim ctl As Control
'
For Each ctl In Controls
'
If ctl.Tag = " NějakáIdentifikace" Then
'
' Něco udělej
'
End If
Next
Ovládací prvky bohužel už vlastnost Tag nepodporují.
• Někteří programátoři úlohu řešili tak, že si „šikovně“ovládací prvky pojmenovali –využívali prostě
při běhu hodnotu vlastnosti Name ovládacích prvků:
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.Name = "NějakýNázev" Or _
ctl.Name = "JinýNázev" Or _
ctl.Name = "JeštěJinýNázev" Then
'
' Něco udělej
End If
Next
Bohužel, ani vlastnost Name není při běhu dostupná.
38
Prototyp aplikace Windows
Jak se to tedy vlastně má dělat? Třeba tak, že využijete klíčové slovo TypeOf v součinnosti s kolekcí
Controls. Takže prvotní prototyp událostní procedury Click tlačítka s nápisem Roztočit (předpokládáme, že
uživatel vyhrál, pokud se vylosovala alespoň jedna jednička) může mít tento tvar:
Public Sub btnRoztočit_Click _
(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRoztočit.Click
Dim ctl As Control
picVýhra.Visible = False
' skryje obrázek z případné předchozí výhry
' vygeneruje náhodná čísla
For Each ctl In Controls
If TypeOf ctl Is Label Then
ctl.Text = VygenerovatPrirozeneCislo()
End If
Next
' Je-li alespoň jedna jednička, uživatel vyhrál
For Each ctl In controls
If TypeOf ctl Is Label Then
If ctl.Text = "1" Then
picVýhra.Visible = True ' zobrazí obrázek výhry
Beep()
' pípne
End If
End If
Next
End Sub
V několika posledních ukázkách kódu vidíte dvě ze tří konstrukcí cyklu, které jsou ve Visual Basicu
k dispozici (tím třetím jsou varianty příkazu Do). První z nich (For – Next) opakuje příkazy těla od dolní
meze po horní mez. Protože v těchto ukázkách není uveden přírůstek, předpokládá se 1. Další ukázky tohoto
druhu cyklu najdete v oddílu „Přidání evidence počtu pokusů a počtu výher“ ve výpisu funkce Vyhral.
Druhý typ cyklu For Each – Next se dá vyjádřit slovy „pro každý prvek v dané kolekci proveď příkazy těla cyklu“. Controls je kolekce Visual Basicu všech ovládacích prvků na formuláři (v terminologii NET
Framework je to ale vlastnost třídy Control pojmenovaného prostoru System.WinForms a představuje odkaz na všechny dceřiné ovládací prvky).
Klíčové slovo TypeOf se používá v rozhodovacích konstrukcích ve tvaru TypeOf NázevObjektu Is
TypObjektu a umožňuje cyklovat přes ovládací prvky daného typu.
Potíže ovšem nastanou, budete-li později mít (což se dá čekat) na formuláři také jiné ovládací prvky typu
popisek (Label), protože do nich nechcete ani nic přiřazovat, ani je testovat. Jednou z možností, jak takovou
situaci řešit, je, že vložíte ovládací prvky, které chcete zpracovávat do kontejneru a uděláte z nich skupinu.
Visual Basic NET k tomuto účelu poskytuje dva základní ovládací prvky: GroupBox a Panel.
39
Úvod do Visual Basic.net
Seskupení ovládacích prvků do skupiny
Ovládací prvky se shromažďují do skupin především proto, že se pak s jednotlivými prvky pohodlněji
pracuje. Například je možné přesouvat všechny ovládací prvky skupiny najednou tak, že se přemístí jejich
kontejner. Usnadníte si také procházení všech prvků takto definované podmnožiny ovládacích prvků.
Chcete-li nějaké ovládací prvky seskupit, umístěte je do ovládacího prvku GroupBox nebo Panel. Oba
ovládací prvky jsou velmi podobné. Základní rozdíl spočívá v tom, že GroupBox má výchozí viditelné ohraničení a můžete u něj zadat titulek, kdežto Panel má výchozí vzhled "neviditelný" a titulek v něm uvádět nemůžete.
V naší brožuře si ukážeme využití ovládacího prvku Panel. Postupujte takto:
1. Klepněte v soupravě nástrojů na ovládací prvek Panel a vymezte pro něj obdélník na formuláři.
2. Nakreslete do jeho vnitřku ovládací prvky, které v něm chcete mít.
3. Chcete-li mít panel viditelný, nastavte barvu pozadí (BackColor), případně obrázek na pozadí
(BackgroundImage) a styl okraje (BorderStyle).
4. Máte-li už na formuláři sestrojené ty ovládací prvky, které chcete zařadit do panelu, nejprve je
všechny vyberte (klepejte na nich při stisknuté klávese Shift) a vyjměte do schránky (Ctrl+X). Pak
vytvořte panel, vyberte ho (aby okolo něj byly úchyty v podobě malých čtverečků) a při vybraném
panelu prvky ze schránky vložte (Ctrl+V).
Pak můžete výše uvedené cykly upravit podle tohoto vzoru (předpokládá se, že jste ponechali výchozí název panelu – Panel1):
For Each ctl In Panel1.controls
If TypeOf ctl Is Label Then
If ctl.Text = "1" Then
picVýhra.Visible = True
Beep()
End If
End If
Next
VB6: Ve VB6 se odpovídal ovládacímu prvku GroupBox zhruba ovládací prvek Frame nebo
se skupina vytvořila jako pole ovládacích prvků (control array), které se už také nepoužívá.
Viz oddíl „Procházení podmnožiny ovládacích prvků na formuláři“ výše.
Otestování prototypu
Do formuláře se dostalo poměrně dost kódu a je nejvyšší čas, zase prototyp otestovat (v podstatě jste to
už měli několikrát zkusit). Přitom se může stát, že přehlédnete některá upozornění, která poskytuje editor kódu v podobě modrých vlnovek nebo nevíte, jak chybný zápis odstranit, a přesto se pokusíte aplikaci vybudovat. V takovém případě se seznámíte s další novinkou, je to okno seznamu úloh (Task List).
Určité informace o chybách najdete také ve výstupním okně (Output), které vidíte v dolní části obrázku
na příští straně. Z obsahu okna seznamu úloh je zřejmé, že musíte vyřešit dvě úlohy. Jednak jste uvedli omylem vlastnost Caption (nyní je to vlastnost Text), druhou chybou je zřejmě překlep v názvu objektu.
40
Prototyp aplikace Windows
Každý řádek v seznamu úloh obsahuje jistý druh vysvětlení, v čem je příčina chyby. Klepnete-li na ikonu
vlevo od vysvětlujícího textu, skočíte v kódu na místo, kde se tato chyba vyskytla a chybná část příkazu se
vybere (vidíte to těsně nad horní stranou okna seznamu úloh).
Seznam úloh toho umí o mnoho víc, výklad však sahá mimo rámec této brožury. Další informace si vyhledejte například pod heslem „Task List Window“ v nápovědě MSDN Visual Studia NET.
Až se vám podaří aplikaci spustit, měla by vypadat zhruba takto:
Navíc jsou na obrázku určité statistické údaje a popisky připravené pro skutečné vyčíslení sázek a výše
výher. Tím se budeme zabývat v příštích oddílech.
41
Úvod do Visual Basic.net
Rozšíření prototypu (1) – statistiky, efekty
Přidáním statistických informací začneme první rozšíření prototypu aplikace. Postupujte takto:
1. Přidejte na formulář popisné objekty typu Label. Nastavte jejich vlastnosti Text na nápisy (Kredit:,
Sázka:, Výher:, Pokusů: a V procentech:). Nastavte jejich vlastnosti Font na tučné písmo velikosti
10.
2. Vpravo od všech těchto popisků se nacházejí další, stejně naformátované popisky. Pojmenujte je
lblKredit, lblSázka, LblPočetVýher, lblPočetPokusů a lblPočetPokusůVProcentech.
3. Jejich písmo nastavte jako u popisků obsahujících nápisy. Hodnotu vlastnosti Text odstraňte nebo
uveďte nulu. Počáteční hodnoty můžete také nastavit při běhu na místě, kde přiřazujete výchozí
hodnoty ovládacím prvkům ( pod řádek TODO ve vygenerovaném kódu formuláře).
4. Vyberte vždy popisek nápisu a popisek obsahující statistiku vpravo od něj a naformátujte je pomocí příkazů v nabídce Format. Na předchozím obrázku byly například u sdružených dvojic odstraněny vodorovné rozestupy. Přehled příkazů z nabídky Format viz oddíl „Formátování více
ovládacích prvků současně“ výše.
Přidání evidence počtu pokusů a počtu výher
Pro účel evidence počtu pokusů a počtu výher si můžete definovat dvě pomocné proměnné na úrovni třídy. Zařaďte do kódu třídy formuláře Form1 (Do konstrukce Public Class Form1 těsně nad první proceduru) příkaz:
Dim PočetVýher, PočetPokusů As Integer
VB6. Na rozdíl od dřívějších deklaračních pravidel se obě proměnné deklarují jako Integer.
Dříve se první deklarovala jako Variant a jen druhá jako Integer. Mimochodem, datový
typ Variant už není, místo něho se používá obecný typ Object. A ani Integer není to, co
dříve. Odpovídá dřívější deklaraci Long a dřívějšímu typu Integer odpovídá nový datový
typ Short.
Na začátek událostní procedury tlačítka s nápisem Roztočit přidáme potřebné deklarace, připočteme jedničku k počitadlu počtu pokusů a přiřadíme počet pokusů a procentové vyjádření úspěšnosti do vlastností
Text odpovídajících popisků.
Dim i As Integer
Dim strCislo As String
PočetPokusů += 1
lblPočetPokusů.Text = CStr(PočetPokusů)
lblPočetPokusůVProcentech.Text = FormatPercent(PočetVýher / PočetPokusů, 2)
V třetím řádku shora se využívá nový operátor, který kombinuje přičtení hodnoty a uložení do proměnné
na levé straně. Obdobné operátory jsou k dispozici i pro další základní operace: -=, *=, /=, \=, ^= a &=.
VB6. FormatPercent je jedna z vestavěných formátovacích funkcí Visual Basicu (nyní se
nacházejí v pojmenovaném prostoru Microsoft.VisualBasic). Umožňuje pohodlně formátovat ve tvaru procent. Druhý parametr udává počet desetinných míst. Další obdobné funkce jsou Format, FormatNumber, FormatCurrency a FormatDateTime.
42
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
Tyto formátovací funkce najdete také v kompatibilní knihovně Microsoft.VisualBasic.
Compatibility.VB6 .Strings, kam přešly také dva už nepodporované příkazy LSet a
RSet, které se dříve používaly k vyplnění řetězců na danou délku vpravo resp. vlevo. Místo
nich nyní volejte metody PadRight resp. PadLeft ze třídy String pojmenovaného prostoru
System.
Protože budeme měnit algoritmus, který určuje, zda uživatel vyhrál, zapamatujeme si vylosovaná čísla
dejme tomu jako trojčíslí ve tvaru řetězce:
For Each ctl In Panel1.controls
If TypeOf ctl Is Label Then
ctl.Text = VygenerovatPrirozeneCislo()
strCislo &= ctl.Text
End If
Next
VB6. Proměnné typu String mohou být jen dynamické délky. Řetězce pevné délky (tj. deklarace typu String * 3) se už nepodporují.
Třetí příkaz shora v předposledním výpisu byste dříve museli napsat jako
PočetPokusů = PočetPokusů + 1.
Podobně třetí řádek zdola v posledním výpisu byste museli zapsat jako
strCislo = strCislo & ctl.Text.
Operátory tohoto druhu jsou ve Visual Basic.NET nové.
Zjištění, zda uživatel vyhrál – skutečná kritéria
Skutečné podmínky našeho automatu, které budou určovat, zda uživatel vyhrál, soustředíme do další
funkce, kterou si napíšeme. Pojmenujeme ji třeba Vyhral. Její návratová hodnota bude dejme tomu řetězec,
který informuje o tom, zda a co vyhrál. Jestliže nevyhrál, vrátí funkce řetězec "NE". Rozhodnutí o výhře bude
proto v událostní proceduře tlačítka s nápisem Roztočit velmi jednoduché:
If Vyhral(strCislo) <> "NE" Then
PočetVýher += 1
picVýhra.Visible = True
lblPočetVýher.Text = CStr(PočetVýher)
Beep()
End If
Pokud vyhrál (porovnávací operátor <> znamená není rovno), zvýšíme počet výher o 1, zviditelníme obrázek výhry a zobrazíme aktuální počet výher na formuláři tím, že počet převedený na řetězec zobrazíme
v odpovídajícím popisku. Nakonec pípneme.
43
Úvod do Visual Basic.net
Řešení při předání řetězce číslic
Zbývá napsat proceduru, která určí, zda uživatel vyhrál. Vyhraje malou výhru, budou-li dvě číslice stejné,
daleko větší výhru budou-li všechny číslice za sebou (vzestupně nebo sestupně) a nejvíc vyhraje, budou-li
všechny tři číslice stejné. Funkce může vypadat například takto:
Public Function Vyhral(ByVal strCislo As String) As String
Dim i, j, intCislo As Integer
'
Inicializace
Vyhral = "NE"
intCislo = CInt(strCislo)
'
Všechny tři číslice stejné – hlavní výhra
For i = 0 To 999 Step 111
If intCislo = i Then
Vyhral = "HLAVNI"
Exit Function
End If
Next
'
Postupka nahoru, velká výhra
For i = 12 To 789 Step 111
If intCislo = i Then
Vyhral = "POSTUPKA"
Exit Function
End If
Next
'
Postupka dolů, také velká výhra
For i = 987 To 21 Step -111
If intCislo = i Then
Vyhral = "POSTUPKA"
Exit Function
End If
Next
'
Dvě stejné, malá výhra
For i = 1 To Len(strCislo)
For j = i + 1 To Len(strCislo)
If Mid(strCislo, i, 1) = Mid(strCislo, j, 1) Then
Vyhral = "DVESTEJNE"
Exit Function
End If
Next j
Next i
End Function
44
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
Kód této funkce upozorňuje na některé další varianty cyklu For – Next. Přírůstek cyklu (daný klíčovým
slovem Step nemusí být kladný (viz třetí cyklus shora) a nemusí být ani celočíselný. Příkaz Exit umožňuje
vyskočit okamžitě z cyklu (nebo z procedury). Poslední část kódu ukazuje cyklus přes i, do něhož je vnořen
cyklus přes j. V příkazech Next jsou i resp. j volitelné, ale přispívají k srozumitelnosti kódu (vidíte okamžitě, k jakému For daný Next patří).
Mid je jedna z funkcí Visual Basicu, které pracují s řetězci. Vybírá z řetězce uvedeného jako první parametr od pozice dané druhým parametrem (pozice prvního znaku má pořadové číslo 1) počet znaků daných
třetím (volitelným) parametrem. Funkce Len vrací délku řetězce ve znacích.
VB6. Ve Visual Basic.NET je možno deklarovat proměnné s oborem úrovně bloku, což dříve
nešlo. Například, kdybychom poslední cyklus napsali takto:
For i = 1 To Len(strCislo)
Dim j As Integer
For j = i + 1 To Len(strCislo)
If Mid(strCislo, i, 1) = Mid(strCislo, j, 1) Then
Vyhral = "DVESTEJNE"
Exit Function
End If
Next j
Next i
' Zde se předpokládá nějaký příkaz pracující s proměnnou j
tak ve Visual Basicu 6.0 kód projde, protože proměnná j je známá (obor je vždy alespoň
úrovně procedury). Ve Visual Basic.NET se zobrazí seznam úloh (Task List) s řádkem, který
sdělí, že „název j není deklarovaný“.
Proměnná j má obor úrovně bloku, takže mimo blok cyklu přes i není známá. Doba života
proměnné j je však procedura, takže vstoupíte-li do daného bloku vícekrát po dobu života
procedury, musíte dávat pozor na to, aby byla taková proměnná vždy správně inicializovaná.
Řešení při předání pole číslic - jako přetíženou funkci
Patrně vás napadlo, že by se funkce dala zjednodušit, kdyby se jednotlivé číslice uložily do celočíselného
pole. V tomto případě možná. Může se ale stát, že budete řešit více úloh, v nichž budou kritéria pro losování
čísel velmi odlišná. Pak byste si možná chtěli programování jednotlivých algoritmů usnadnit (či urychlit) tím,
že vstupní hodnoty předáte uložené tak, jak to bude pro řešený algoritmus nejvýhodnější.
Ve Visual Basic.NET už nemusíte psát procedury s různými názvy, pokud se liší pouze datovými typy
předávaných parametrů. Napíšete potřebný počet variant funkce se stejným názvem, ale do záhlaví funkce
přidáte klíčové slovo overloads. Přetížené mohou být i konstruktory instance nebo vlastnosti ve třídě. Modifikovaný zápis funkce Vyhral vypadá takto:
Public Overloads Function Vyhral(ByVal strCislo As String) As String
' Původní varianta funkce
End Function
Public Overloads Function Vyhral(ByVal Cisla() As Integer) As String
Dim i, j, intCislo As Integer
Vyhral = "NE"
45
Úvod do Visual Basic.net
' První cyklus se upraví
For i = 0 To UBound(Cisla)
For j = i + 1 To UBound(Cisla)
If Cisla(i) = Cisla(j) Then
Vyhral = "DVESTEJNE"
Exit Function
End If
Next j
Next i
' Spočte se trojciferný ekvivalent číslic
intCislo = Cisla(0) * 100 + Cisla(1) * 10 + cisla(2)
' Zbytek funkce je stejný jako v původní variantě
End Function
Za předpokladu, že jsou deklarované potřebné proměnné:
Dim strCislo, strVyhrál As String
Dim Trojice(3) As Integer
můžete naši funkci volat takto
strVyhrál = Vyhral(strCislo)
i takto:
strVyhrál = Vyhral(Trojice)
Při zápisu kódu, jímž voláte své přetížené procedury, uvidíte podobnou pomůcku, jakou jste viděli pro vestavěnou funkci Int na obrázku v oddílu „Vylosování čísel“ výše.
VB6. Přetěžování dříve takto provádět nešlo. Kódu z předchozích verzí se ale tato schopnost
týká v jiných důležitých situacích, například když ve svých programech voláte funkce API
s parametry typu As Any. Tato fráze se už nepodporuje a definice procedur budete muset
změnit. Řešení nabízejí právě přetěžované funkce. Místo jedné deklarace napíšete několik,
každou pro jeden z datových typů.
Dříve jste se také v kódu setkávali se dvěma alternativami některých funkcí pracujících
s řetězci. Jedna alternativa funkce měla „normální“ název a vracela Variant, název druhé
končil na znak $ (dolar) a vracela String. Nyní se jedná o jedinou přetíženou funkci, proto
se podporuje jen jediný název(bez dolaru).
Různé obrázky pro různé výhry
Zatím jste hráče „odměňovali“ bez ohledu na výši výhry-tím, že jste zobrazovali stále stejný obrázek. Teď
automat rozvineme tak, že se pro každý druh výhry zobrazí jiný obrázek. Úloha zároveň poslouží k ukázce
druhé základní rozhodovací konstrukce Visual Basicu, totiž Select Case.
Původně jsme úlohu řešili tak, že jsme obrázek „natáhli“ metodou FromFile třídy Image pojmenovaného prostoru System.WinForms a jeho zobrazování či skrývání jsme vyřešili nastavováním vlastnosti Visible na True resp. False. Protože teď máme v jediném ovládacím prvku PictureBox zobrazovat tři obrázky,
musíme kód poněkud modifikovat. Postup následuje.
46
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
1. Z konstruktoru třídy formuláře převeďte na komentář (nebo odstraňte) prvotní přiřazení obrázku
(příkaz pod řádkem ‘TODO ve vygenerovaném kódu formuláře).
2. V událostní proceduře tlačítka s nápisem Roztočit nahraďte konstrukci, která zjišťuje, zda uživatel
vyhrál, touto:
If strVyhrál = "NE" Then
' Nevyhrál, zmizí obrázek
picVýhra.Image = Nothing
Else
' Vyhrál
PočetVýher += 1
lblPočetVýher.Text = CStr(PočetVýher)
Beep()
' Podle druhu výhry se přiřadí patřičný obrázek
Select Case strVyhrál
Case "DVESTEJNE"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Money.wmf")
Case "POSTUPKA"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\dollars.wmf")
Case "HLAVNI"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Moneybag.wmf")
Case Else
' Sem se to nemá nikdy dostat
End Select
picVýhra.Visible = True
End If
Konstrukce se používá v případech, kdy potřebujete program rozčlenit na více než dvě větve. Kritérium,
uvedené za Select Case se pak rozškatulkovává na jednotlivé případy (Case). Vykonají se příkazy toho
případu (větve), který odpovídá zadanému kritériu. Příkazy ve větvi Case Else se vykonají tehdy, když „nezabere“ ani jedna z ostatních větví. Měla by se uvádět vždy, když ostatní větve nevyčerpají všechny situace,
které mohou nastat.. Alespoň po dobu ladění byste si do ní měli dál nějaké pomocné výpisy, kdyby se přes
všechna očekávání program do ní dostal. Pomohlo by vám to asi odhalit příčinu (přinejmenším byste věděli,
že v tomto místě už program běží špatně).
Náměty na procvičování. Rozlište velikost obrázků výher podle výše výher (pro malou výhru obrázek
malý, pro větší výhru obrázek větší). Zkuste alespoň dvě varianty: měnit při běhu rozměry ovládacího prvku
PictureBox podle výše výhry nebo umístit do návrhu pro každý typ výhry samostatný ovládací prvek PictureBox a podle druhu výhry vždy „zviditelnit“ patřičný objekt.
47
Úvod do Visual Basic.net
Evidence vsazených částek a celkové výše výher
Další modifikace budou spočívat v tom, že nebudeme jen počítat, kolikrát uživatel vyhrál, ale přiblížíme
se trochu realitě tím, že budeme předpokládat, že hráč dá na začátku „do banku“ nějaký obnos, budeme mu
říkat třeba kredit a stanoví, jak velkou jeho část vsadí při každém roztočení kola štěstí. V tomto oddílu nastavíme počáteční kredit a velikost sázky „natvrdo“, později tyto hodnoty bude moci hráč zadávat na samostatném formuláři parametrů. Kromě toho si hlavní formulář připravíme pro další modifikace. Postup:
1. Do deklarační sekce třídy formuláře přidejte deklarace pomocných proměnných:
Private PočátečníKredit, StavCelkem As Integer
2. Do konstruktoru třídy formuláře (pod ‘TODO) přidejte příkazy, jimiž „natvrdo“ nastavíte počáteční
hodnoty kreditu a sázky:
PočátečníKredit = 1000
lblKredit.Text = CStr(PočátečníKredit)
lblSázka.Text = "10"
3. Doplňte konstrukci zjišťující, zda uživatel vyhrál (viz předchozí oddíl) o příkazy, jimiž se bude
evidovat, jak si hráč stojí:
If strVyhrál = "NE" Then
' Nevyhrál, zmizí obrázek, sníží se kredit, aktualizuje se průběžný stav
picVýhra.Image = Nothing
lblKredit.Text = CStr(CInt(lblKredit.Text) - CInt(lblSázka.text))
StavCelkem -= CInt(lblSázka.Text)
Else
PočetVýher += 1
lblPočetVýher.Text = CStr(PočetVýher)
Beep()
' Vyhrál, podle druhu výhry se zobrazí patřičný obrázek
Select Case strVyhrál
Case "DVESTEJNE"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Money.wmf")
VýšeVýhry = CInt(CDbl(lblSázka.Text) / 10)
Case "POSTUPKA"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\dollars.wmf")
VýšeVýhry = CInt(CDbl(lblSázka.Text) * 10)
Case "HLAVNI"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Moneybag.wmf")
VýšeVýhry = CInt(CDbl(lblSázka.Text) * 20)
Case Else
' Sem se to nemá nikdy dostat
End Select
48
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
lblKredit.Text = CStr(CInt(lblKredit.Text) + VýšeVýhry)
StavCelkem += VýšeVýhry
picVýhra.Visible = True
End If
Spočetli jsme si pravděpodobnosti výher a rozhodli jsme se, dejme tomu, že vylosuje-li hráč dvojici stejných číslic, vyhraje desetinu vsazené částky; při postupce vyhraje desetinásobek a při trojici stejných čísel
dvacetinásobek.
Proměnnou StavCelkem využijeme později k celkové evidenci, protože hráči umožníme strkat do automatu další prachy, kdykoli to uzná za vhodné. Umožníme mu také, aby mohl pokračovat ve hře, až se mu
kredit vyčerpá (tuto skutečnost mu oznámíme automaticky a zobrazíme formulář, v němž bude moci vložit
další kredit, změnit výši sázky a jiné vstupní parametry). Viz oddíl „Formulář parametrů“ později.
Námět na procvičování. Zkuste snížit počet volání konverzních funkcí v kódu vypisovaném zde i jinde
v brožuře (například pomocí vhodných pomocných proměnných).
Nastavení barvy textu v ovládacím prvku
Další drobné zobecnění bude spočívat v tom, že pokud bude kredit vyšší, než počáteční (hráč vyhrává),
zůstane hodnota kreditu v původní barvě, bude-li prohrávat, decentně ho na to upozorníme tím, že hodnotu
zobrazíme jinou barvou (odstín růžové barvy).
1. Do deklarační sekce třídy formuláře přidejte deklaraci:
Private PočátečníBarvaKreditu As System.Drawing.Color
2. Na konec událostní procedury tlačítka Roztočit přidejte tuto rozhodovací konstrukci:
If CInt(lblKredit.Text) < PočátečníKredit Then
lblKredit.Forecolor = System.Drawing.Color.RosyBrown
Else
lblKredit.Forecolor = PočátečníBarvaKreditu
End If
Barva popředí (inkoust) se tedy nastavuje prostřednictvím vlastnosti ForeColor, obdobně barva pozadí
prostřednictvím vlastnosti BackColor. Většinou se barvy nastavují vizuálně v okně vlastností.
VB6. Barvy se nyní nastavují prostřednictvím struktury Color pojmenovaného prostoru System.Drawing. Jestliže se vám stýská po funkcích RGB nebo QBColor, najdete je
v pojmenovaném kompatibilním prostoru Microsoft.VisualBasic.Compatibility.
VB6.Information.
Námět na procvičování. Chcete-li uživateli dopřát, aby si mohl sám určovat barvy některých ovládacích
prvků, zobrazte mu společné dialogové okno Barva. Jak se volají společná dialogová okna Windows se dozvíte na konci této brožury, v oddílu „Využití společných dialogových oken Windows“.
49
Úvod do Visual Basic.net
Zobrazování zpráv (o stavu financí)
Protože už teď hráč do automatu něco dává a máme jakous takous evidenci o tom, jak si v daném okamžiku stojí, můžeme mu poskytnout možnost, aby si kdykoli zobrazil, kolik vyhrává, resp. kolik prohrává.
Naprogramujeme proto událostní proceduru Click tlačítka s nápisem Vypsat stav:
Public Sub btnStav_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnStav.Click
If StavCelkem > 0 Then
MessageBox.Show("Vyhráváte: " & FormatCurrency(StavCelkem), _
"Informace o stavu financí", _
Messagebox.IconExclamation + Messagebox.OK)
Else
MessageBox.Show("Zatím Vás to stálo: " & FormatCurrency(-StavCelkem), _
"Informace o stavu financí", _
Messagebox.IconInformation)
End If
End Sub
Pro výpis jednoduchých zpráv uživateli v dialogovém okně se využívá třída MessageBox pojmenovaného prostoru System.WinForms. Zpráva se zobrazuje její metodou Show, v níž první parametr udává nápis
v okně, druhý nápis v titulkovém pruhu a třetí různé informace o tom, jaká tlačítka v dialogovém okně budou,
jaká tam bude ikona a jaké tlačítko bude výchozí. Tyto informace se specifikují pomocí polí třídy MessageBox.
V souvislosti se zobrazováním zpráv si můžete vyzkoušet další rys Visual Basicu, totiž podporu tzv. pojmenovaných parametrů. Má-li metoda hodně parametrů, a vy přitom ve volání chcete uvést jen několik (pro
ostatní chcete ponechat výchozí hodnoty), můžete parametry specifikovat tak, že uvedete název parametru,
speciální operátor := (dvojtečka a rovná se) a hodnotu parametru. Výhody jsou zřejmé. Parametry můžete
uvést v libovolném pořadí a jen ty, které opravdu potřebujete. Například, obrázek o stavu financí byste mohli
zobrazit také tímto příkazem:
MessageBox.Show(caption:="Informace o stavu financí", _
text:="Vyhráváte: " & FormatCurrency(StavCelkem))
Názvy parametrů se dozvíte přímo při zápisu volání metody z pomocného okénka, v němž se zobrazuje
kompletní syntax metody.
Až budete později řešit formulář parametrů, ukážeme si, jak pracovat v situacích, kdy je v dialogovém
okně více než jedno tlačítko a je třeba zjistit, na kterém z nich uživatel klepl (a podle toho rozvětvit další běh
programu). Obě okna se zprávou z procedury btnStav_Click vidíte na obrázku:
50
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
VB6. 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.
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.
51
Úvod do Visual Basic.net
'
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)
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.
52
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
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
VB6. 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.
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í.
53
Úvod do Visual Basic.net
Č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
54
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
Konstanta 2800 v konstrukci If určuje horní mez, kdy časovač sám sebe vypne a blikání tedy skončí.
VB6. 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).
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.
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).
55
Úvod do Visual Basic.net
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.
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:
Try
' 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()
56
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
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řípa-
dě 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).
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
57
Úvod do Visual Basic.net
'
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
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.
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ů.")
58
R o z š íře n í p r o t o t y p u ( 1 ) – statistiky, efekty
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.
59
Úvod do Visual Basic.net
Rozšíření prototypu (2) – další formulář
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.
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í.
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.
60
Rozšíření prototypu (2) – další formulář
Dialogové okno stránek vlastností projektu se zobrazenou stránkou obecných vlastností (General) ukazuje
následující obrázek. Jak vidíte v levé části dialogového okna, je vlastností projektu poměrně hodně:
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.
61
Úvod do Visual Basic.net
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):
,
62
Rozšíření prototypu (2) – další formulář
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.
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í.
63
Úvod do Visual Basic.net
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).
Ověření platnosti pořízených hodnot
Aby uživatel nemohl zadat do textových polí nesmysly, což by komplikovalo další běh aplikace, přidáte
do formulář nějaký kód, který zadané hodnoty ověří. Nechcete-li se s tím příliš párat, v podstatě stačí, když
veškeré kontroly provedete jen tehdy a až tehdy, když uživatel klepne na tlačítko Pokračovat (tlačítkem Konec
má možnost uživatel aplikaci okamžitě ukončit, pro případ, že by si hraní v posledním okamžiku rozmyslel).
Protože hodnoty zadané do textového pole jsou svou povahou řetězce, mělo by se otestovat, zda uživatel
zapsal číslo a zda je kredit větší než částka (nemůžete hrát o víc peněz než máte v peněžence). Událostní procedura Click tlačítka s názvem btnPokračovat by proto mohla vypadat takto:
Public Sub btnPokračovat_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnPokračovat.Click
If Not IsNumeric(txtKredit.Text) Or Not IsNumeric(txtSázka.Text) Then
'
Následující dva řádky tvoří jediný příkaz
MessageBox.Show("Kredit a sázka musejí být čísla. Automat Vám nabídne výchozí hodnoty.", "Chyba v zadání", MessageBox.IconExclamation)
txtKredit.Text = "1000"
txtSázka.Text = "10"
TxtKredit.Focus()
ElseIf Val(txtKredit.Text) < Val(txtSázka.Text) Or Val(txtSázka.Text) <= 0 Then
'
Následující tři řádky tvoří jediný příkaz
MessageBox.Show("Sázka musí být číslo větší než nula a menší než Kredit.
Automat Vám nabídne výchozí hodnoty.", "Chyba v zadání", MessageBox.IconExclamation)
txtKredit.Text = "1000"
txtSázka.Text = "10"
TxtKredit.Focus()
Else
txtKredit.Text = CStr(System.Math.Abs(CInt(txtKredit.Text)))
txtSázka.Text = CStr(System.Math.Abs(CInt(txtSázka.Text)))
Me.Close()
End If
End Sub
64
Rozšíření prototypu (2) – další formulář
Ve Visual Basicu se určité informace získávají pomocí vestavěných funkcí, jejichž názvy začínají na
„Is“. Konkrétně IsNumeric umožňuje zjistit, zda je hodnota, předaná jako parametr, číselného typu. Jestliže
je tedy v některém z textových polí něco jiného než číslo, vypíše se uživateli aplikace okno ze zprávou:
Obdobná zpráva se zobrazí, pokud je velikost sázky větší než kredit nebo když uživatel zadá nekladnou
velikost.
V obou případech se vstup uživatele zlikviduje a do textových polí se mu nabídnou výchozí hodnoty..
Kód dále připomíná ještě jednu akci, která se v praxi často potřebuje-totiž jak aktivovat daný ovládací prvek
(umístit do něho kurzor, udělit mu fokus). Udělá se to velmi jednoduše. Zavolejte metodu Focus daného
ovládacího prvku.
Pro případ, že by uživatel zadal nějaké haléře nebo ještě menší zlomky, převedou se ve větvi Else zadaná
čísla na celá.
Volání metody Me.Close() má stejný efekt, jako kdyby uživatel klepl na tlačítko Zavřít (x) v pravém
horním rohu formuláře.
VB6. Místo matematických funkcí se nyní používají metody třídy Math pojmenovaného prostoru System. Místo metody Focus se dříve volala metoda SetFocus.
Všechny funkce začínající na „Is“ se už nepodporují. Jak už jsem uvedl výše, nepodporuje se
IsMissing, protože je zbytečná (volitelné parametry musejí mít výchozí hodnoty). Dále se
nepodporuje IsEmpty. Místo IsNull a IsObject se používají IsDBNull resp. IsReference ze třídy Microsoft.VisualBasic.Information. Klíčová slova Empty a Null se
už totiž také nepodporují a místo nich se používá Nothing. I když slovo Null nemá ve
VB.NET žádné použití, přesto ještě patří mezi rezervovaná slova.
Skutečnost, že se už nepodporuje klíčové slovo Null, možná nepříjemně zasáhne ty programátory Visual Basicu, kteří se zabývají databázemi. Nemohou totiž využívat tzv. „propagace
Null“, které znamená, že se ve výrazech může používat „neplatná hodnota“ Null a že výsledek takového výrazu bude Null. Hodnotu Null mají totiž ta pole záznamů databázových tabulek, do nichž ještě nebyla pořízena hodnota. Výrazy tohoto druhu se už tedy nemohou
používat (ani vestavěné řetězcové funkce končící dolarem, které mohly vracet Null). Jestliže
jste takové výrazy používali, budete muset kód přeprogramovat a vždy předem testovat databázová pole na to, zda neobsahují Null.
Náměty na procvičování. Zdokonalte kontroly platnosti. Je to typ úloh, v nichž se dá vyřádit téměř do
nekonečna. Například, zamezte vůbec uživateli, aby mohl do textových polí zapsat něco jiného než číslice
(například pomocí událostní procedury reagující na jednotlivé úhozy z klávesnice). Pak budou testy na to, zda
uživatel zadal číslo a na jiné neplatné zápisy, zbytečné a budete je moci z formuláře vyhodit. Nebo, za předpokladu, že je zadaná hodnota kreditu přijatelná a sázka je uvedena špatně, nabídněte hráči sázku jako nějaký
zlomek kreditu (například desetinu), a to hned, jakmile se pokusí opustit textové pole txtSázka (nikoli až při
klepnutí na tlačítko Pokračovat).
65
Úvod do Visual Basic.net
Vlastní ovládací prvek jako výchozí šablona pro obě textová pole
Protože obě textová pole na formuláři jsou si podobná v tom ohledu, že mají stejné některé důležité charakteristiky (přijímají jen čísla, text se objevuje zprava), nabízí se otázka, zda by nebylo možné vytvořit pro
ně jakousi šablonu, z níž by byly obě textová pole na našem formuláři parametrů odvozena. Jedním ze způsobů, jak to lze udělat, a to dokonce vizuálně, je vytvořit v projektu vlastní ovládací prvek. Postupuje se zhruba
takto:
1. V průzkumníkovi řešení vyberte položku s názvem projektu.
2. Vydejte příkaz Project > Add User Control.
3. V dialogovém okně Add New Item vyberte vpravo ikonu UserControl, do pole Name napište název
svého ovládacího prvku, například ČíselnýTextBox a klepněte na Open.
4. Dostanete se do prostředí návrháře vlastních ovládacích prvků (podkladová plocha jako u formuláře, ale bez jakýchkoli okrajů či titulkového pruhu).
5. Klepněte v soupravě nástrojů na ovládací prvek TextBox a klepněte na podkladové ploše návrhu
vlastního ovládacího prvku.
6. Nastavte tyto vlastnosti ovládacího prvku s výchozím názvem TextBox1: Text na 0, TextAlign na
Right a Location na 0,0 (tím ho dostanete k levému hornímu okraji podkladové plochy).
7. Nastavte jakékoli další vlastnosti textového pole podle svých potřeb a případně naprogramujte
událostní procedury, jimiž chcete dále ovlivnit chování vlastního ovládacího prvku.
8. Nastavte vlastnost Size vlastního ovládacího prvku na stejnou hodnotu, jakou má vlastnost Size
textového pole.
Průběh vizuálních prací zachycují dva obrázky:
66
Rozšíření prototypu (2) – další formulář
9. Sestrojte si druhou variantu formuláře parametrů – stejnou jako původní, ale bez textových polí
(nebo z původního formuláře parametrů textová pole odstraňte).
10.Zvolte Build > Rebuild.
11. Otevřete návrh formuláře parametrů, klepněte v soupravě nástrojů na svůj nástroj ČíselnýTextBox
a klepněte na formuláři. Opakujte pro druhé textové pole.
Poznámka. Chcete-li modifikovat vlastnosti ovládacích prvků odvozených z vlastního ovládacího prvku,
nastavte jeho vlastnost Modifiers na Public.
Náměty k procvičování. Logickým pokračováním při práci s vlastními ovládacími prvky je, že si vytvoříte vlastní knihovnu ovládacích prvků. Opět to jde vizuálně a v podstatě stačí dva kroky. Přidáte do řešení
nový projekt patřičného typu a nastavíte odkazy.
V řadě úloh se hodí, když se vlastní ovládací prvek skládá z více prvků. Například, v našem případě by
byl jednoduchým zobecněním vlastní ovládací prvek složený ze dvou textových polí, do nichž se zadává nějaký interval hodnot (od – do). Součástí ovládacího prvku by pak mohly být i veškeré potřebné kontroly platnosti a souvztažnosti hodnot.
Propojení formulářů
Formuláře Windows, které v této brožuře vytváříte, mohou být modální nebo nemodální. Co to znamená?
Když pracujete s modálním formulářem a chcete dělat něco jiného, musíte jej nejprve uzavřít (skrýt nebo
uvolnit z paměti), teprve pak můžete pracovat s jinou částí aplikace. Mnoho modálních formulářů znáte.
Chová se tak valná většina dialogových oken běžných aplikací Windows, s nimiž pracujete. Modální formuláře mají pro programátora jednu podstatnou výhodu, nemusí ošetřovat situace, že uživatel z čista jasna práce
s formulářem přeruší a začne dělat něco jiného.
Takové jsou právě nemodální formuláře. Typickým příkladem nemodálních formulářů jsou panely nástrojů. Chcete-li formulář zobrazit jako modální, zavolejte metodu ShowDialog, jinak zavolejte metodu Show.
Hlavní formulář a formulář parametrů, které jsme zatím testovali izolovaně, nyní propojíme tak, že spouštěcím formulářem bude opět hlavní formulář, při jehož startu (nebo později kdykoli uživatel klepne na tlačítko s nápisem Dodat další prachy) se zobrazí formulář parametrů jako dialogové okno. Postup:
1. Přejděte do okna kódu hlavního formuláře a do třídy Form1 přidejte nad všechny procedury deklaraci:
Private f As frmZadáníParametrů = New frmZadáníParametrů()
2. Na konec konstruktoru New() formuláře Form1 přidejte příkazy:
f.showdialog()
lblKredit.Text = f.txtKredit.Text
lblSázka.Text = f.txtSázka.Text
Jak předchozí výpis ukazuje, hodnoty, které uživatel zapsal do textových polí, jsou přístupné jako
hodnoty vlastností formuláře, jehož instanci jste vytvořili.
3. Do procedury Click tlačítka s nápisem Roztočit přidejte konstrukci If…End If, v níž otestujete,
zda hráč nevyčerpal kredit, který zadal na počátku aplikace. Jestliže ano, zobrazí se mu dotaz, zda
chce hrát dál. Výpis konstrukce je uveden na příští stránce.
67
Úvod do Visual Basic.net
If CInt(lblKredit.Text) <= 0 Or _
CInt(lblKredit.Text) < CInt(lblSázka.Text) Then
' Me.Hide()
If DialogResult.Yes = MessageBox.Show _
("Je mi líto, musíte dodat další prachy. Chcete hrát dál?", _
"Zpráva o stavu financí", _
MessageBox.IconQuestion + Messagebox.YesNo) Then
f.ShowDialog()
lblKredit.Text = f.txtKredit.text
lblSázka.Text = f.txtSázka.Text
' Me.Show()
Else
btnKonec_click(sender, e)
End If
End If
Považujete-li to za účelné, můžete pomocí metody Hide dočasně hlavní formulář skrýt, abyste zdůraznili, že je nutné dodat další peníze. Po dokončení prací na formuláři parametrů byste pak hlavní
formulář opět zobrazili metodou Show.
V příkazu, který zobrazuje zprávu, si všimněte, jak se v třetím parametru specifikuje více informací
současně (zde se konkrétně má zobrazit ikona otazníku a tlačítka s nápisy Ano a Ne. Jedná se o pole
třídy MessageBox.
Dále si všimněte, jak se testuje návratová hodnota metody MessageBox.Show (tj. na kterém tlačítku
uživatel klepl v okně zprávy). Jedná se o výčtový typ DialogResult (opět z pojmenovaného prostoru System.WinForms).
Jestliže uživatel nechce pokračovat, ukončení aplikace nemusíte programovat znovu, ale simulujete
situaci, že uživatel klepl na tlačítko Konec. Zavoláte prostě tuto událostní proceduru.
4. Napište událostní proceduru Click tlačítka s nápisem Dodat další prachy:
Public Sub btnPrachy_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnPrachy.Click
' Me.Hide()
f.ShowDialog()
lblKredit.Text = f.txtKredit.text
lblSázka.Text = f.txtSázka.Text
' Me.show()
End Sub
68
Rozšíření prototypu (2) – další formulář
Událostní procedura tohoto tlačítka na hlavním formuláři tedy hráči umožňuje, aby kdykoli zvýšil stávající kredit (i když zatím předchozí nevyčerpal) a (nebo) změnil výši sázky a (nebo) zapnul či vypnul multimediální efekty.
Využití zaškrtávacího políčka formuláře parametrů
Zapojení zaškrtávacího políčka formuláře parametrů je velmi jednoduché. Prostě otestujete jeho vlastnost
Checked. Efekty (nebo jiné činnosti) se budou vykonávat jen tehdy, je-li políčko zaškrtnuté, neboli, je-li jeho
vlastnost Checked nastavena na True.
Public Sub Form1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Form1.Click
If f.chkCingrlátka.Checked Then
' Vypnutí efektů
End If
End Sub
Poznámka. Nezkrácený zápis podmínky v konstrukci If má tvar:
If f.chkCingrlátka.Checked = True Then
VB6. S tím souvisí ještě jedna drobná změna, která by mohla dělat programátorům
z dřívějších verzí potíže. Jsou tací, kdo místo logických hodnot psali čísla a spoléhali se na
implicitní konverze. Patříte-li mezi ně, určitě ve VB.NET narazíte, protože se reprezentace
hodnoty True změnila z –1 na 1.
Obdobný problém se týká data. I když se v této brožuře zabýváme datem jen okrajově
(v titulkovém pruhu aplikace), může být tato změna nepříjemná, proto se o ní alespoň zmiňuji. Pokud jste byli zvyklí ukládat datum ne jako Date, ale jako čísla Double, budete mít
smůlu, protože se datum už ukládá jinak a kód budete muset upravit. Buď pomocí speciálních
převodních funkcí ToOADate resp. FromOADate, ale raději kód přepište tak, abyste důsledně
pro hodnoty obsahující datum důsledně používali příslušný datový typ.
69
Úvod do Visual Basic.net
Rozšíření prototypu (3) – nabídky
Naše aplikace v podstatě žádné nabídky nepotřebuje, protože pro její řízení stačí uživateli příkazová tlačítka na formulářích. Nabídky však patří mezi základní a často vyžadované prvky uživatelského rozhraní.,
proto jsem považoval za vhodné, zařadit do této brožury také úvodní seznámení s tím, jak se ve Visual Basic.NET tvoří nabídky a místní nabídky. Panely nástrojů, stavové řádky a další uživatelský komfort už do
aplikace dávat nebudeme, už tak toho bude v podstatě příliš. Ukážeme si vizuální sestrojení nabídek
i vytvoření nabídek přímo v kódu.
Visual Basic.NET poskytuje v soupravě nástrojů pro tvorbu nabídek dva ovládací prvky: MainMenu
a ContextMenu. Pomocí prvního z nich se tvoří obvyklý systém nabídek složený z pruhu nabídek, pod nímž
se rozvinují podřízené nabídky. Druhý slouží k tvorbě místních nabídek.
VB6. Dříve se nabídky tvořily nástrojem Menu Editor. Místní nabídky se sestrojovaly jako
neviditelné součásti systému běžných nabídek. Místní nabídka se pak obvykle aktivovala
v událostní proceduře zachycující stisk tlačítka myši, kde se pomocí prvního parametru událostní procedury odlišil stisk pravého tlačítka myši a nabídka se zobrazila metodou Popup
formuláře.
Místní nabídka na formuláři parametrů
Seznámení s nabídkami začneme cvičnou místní nabídkou na formuláři parametrů, protože se jedná
o jednodušší úlohu. Držte se následující ho postupu.
1. Abyste mohli formulář parametrů pohodlně ladit, prohlásíte ho opět dočasně za startovací objekt
projektu. Nevidíte-li průzkumníka řešení, zvolte View > Solution Explorer, klepněte pravým tlačítkem myši na název projektu, z místní nabídky zvolte Properties, vyberte ze seznamu Startup object formulář frmZadáníParametrů a klepněte na OK.
2. V návrhovém zobrazení formuláře parametrů klepněte v soupravě nástrojů na tlačítko WinForms,
pak na nástroj ContextMenu a klepněte na formuláři.
Pod formulářem se objeví podnos a v něm ikona ovládacího prvku s výchozím názvem ContextMenu1. Zároveň se pod titulkovým pruhem formuláře budou objevovat chlívky s napovídajícím titulkem
„Type Here“ (Pište sem).
3. Do těchto chlívků napište texty, které se mají zobrazovat v nabídce. Jednotlivé příkazy budoucí
místní nabídky pište jako prvky pruhu nabídek, ne pod sebe. Chcete-li rovnou v textech určit přístupové klávesy, napište před zvolené písmeno znak & (na české klávesnici pravý Alt+C).
Nastavujete vlastně hodnoty vlastnosti Text jednotlivých prvků v nabídce. Kdybyste psali texty pod
sebe, vytvářeli byste systém místních nabídek, což je také možné, ale v této úloze chceme sestrojit
prostou místní nabídku tří příkazů. Viz obrázek na další straně.
4. Klepněte pravým tlačítkem myši na formuláři, klepněte na Properties a nastavte vlastnost ContextMenu formuláře na ContextMenu1.
70
Rozšíření prototypu (3) – nabídky
Jednotlivé prvky nabídky tvoří objekty MenuItem a dostávají výchozí názvy MenuItem1, MenuItem2 atd. Protože budete později programovat událostní procedury těchto prvků (abyste příkazu
v nabídce přiřadili nějakou konkrétní činnost), je žádoucí změnit tyto výchozí názvy (jako se to ostatně má dělat u všech ovládacích prvků, s nimiž hodláte nějak pracovat) na lépe vypovídající.
5. Klepněte na některém prvku v nabídce, klepněte pravým tlačítkem myši a z místní nabídky zvolte
Edit Names. (Obrázek této místní nabídky viz příští oddíl „Pruh nabídek na hlavním formuláři“.)
Na formuláři se objeví výchozí názvy v hranatých závorkách vlevo od textů prvků nabídek.
6. Přejmenujte názvy prvků nabídek podle vašich dohodnutých konvencí. Lze to udělat přímo na
formuláři nebo v okně vlastností, podobně jako u jiných ovládacích prvků. U prvku, který je nabídkou, se obvykle používá předpona mnu, cmnu apod., u ostatních prvků nabídky se přidává slovo
Item (prvek), pak vlastní název. Viz obrázek.
71
Úvod do Visual Basic.net
7. První příkaz v nabídce je vlastně dvouhodnotový přepínač, který má měnit stav zaškrtávacího políčka. Protože má být výchozí stav „zaškrtnuté“, nastavte vlastnost Checked prvku cmnuItemZvuky
na True.
8. Chcete-li některým prvkům v nabídce přiřadit klávesovou zkratku, nastavte jejich vlastnost ShortCut. Klepněte vpravo od vlastnosti v okně Properties a kombinaci kláves vyberte z dostupných
možností v rozvíracím seznamu. Zda bude klávesová zkratka zobrazena jako součást textu nabídky
určíte hodnotou vlastnosti ShowShortCut.
9. Než začnete prvkům nabídek přiřazovat činnosti, bývá vhodné vyzkoušet prázdný návrh. Spusťte
aplikaci a klepněte pravým tlačítkem myši na zobrazeném formuláři. Uvidíte místní nabídku podobnou té, která je zobrazena vlevo dole.
Klepnete-li pravým tlačítkem myši na některém textovém poli, zobrazí se ale výchozí místní nabídka
s příkazy pro práci se schránkou. Také textová pole mají totiž vlastnost ContextMenu a pokud ji explicitně
nenastavíte, mají výchozí hodnotu (none).
10.Napište událostní procedury Click jednotlivých prvků nabídek. Například pro zapnutí/vypnutí
efektů:
Public Sub cmnuItemZvuky_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles cmnuItemZvuky.Click
chkCingrlátka.checked = Not chkCingrlátka.checked
End Sub
nebo pro tlačítko Pokračovat:
Public Sub cmnuPokračovat_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles cmnuPokračovat.Click
btnPokračovat_Click(sender, e)
End Sub
72
Rozšíření prototypu (3) – nabídky
Místní nabídka sestrojená v kódu
Místní nabídku můžete také celou sestrojit z kódu, aniž na podnos formuláře umístíte instanci komponenty ContextMenu. Například:
Dim ContextMenu2 As New ContextMenu()
' Přiřazení místní nabídky formuláři:
Me.ContextMenu = ContextMenu2
' Vytvoření prvků nabídky:
Dim cmnu2ItemZvuky As New MenuItem()
Dim cmnu2ItemOddělovač1 As New MenuItem()
Dim cmnu2ItemPokračovat As New MenuItem()
Dim cmnu2ItemKonec As New MenuItem()
' Přiřazení hodnot vlastnostem prvku Blikání a zvuky:
' Text příkazu v nabídce:
cmnu2ItemZvuky.Text = "&Blikání a zvuky?"
' Bude mít zaškrtnutí:
cmnu2ItemZvuky.Checked = True
' Bude viditelný:
cmnu2ItemZvuky.Visible = True
' vytvoření oddělovací čáry:
cmnu2ItemOddělovač1.Text = "-"
cmnu2ItemOddělovač1.Visible = True
' Přiřazení hodnot vlastnostem prvků Pokračovat a Konec:
cmnu2ItemPokračovat.Text = "&Pokračovat"
cmnu2ItemPokračovat.Visible = True
cmnu2ItemKonec.Text = "&Konec"
cmnu2ItemKonec.Visible = True
' Přiřazení klávesové zkratky:
cmnu2ItemPokračovat.Shortcut = System.WinForms.Shortcut.CtrlP
cmnu2ItemKonec.Shortcut = System.WinForms.Shortcut.AltF4
' Přidání prvků do kolekce MenuItems:
ContextMenu2.MenuItems.Add(cmnu2ItemZvuky)
ContextMenu2.MenuItems.Add(cmnu2ItemOddělovač1)
ContextMenu2.MenuItems.Add(cmnu2ItemPokračovat)
ContextMenu2.MenuItems.Add(cmnu2ItemKonec)
73
Úvod do Visual Basic.net
Místní nabídku sdružíte s formulářem tím, že její název nastavíte jako hodnotu vlastnosti ContextMenu
formuláře. Prvky v nabídce mohou být též neviditelné (vlastnost Visible má hodnotu False) nebo nepřístupné
(vlastnost Enabled má hodnotu False). Jednotlivé prvky nabídky je třeba zařadit metodou Add do odpovídající kolekce MenuItems.
Výpis výše představuje mírnou modifikaci předchozí nabídky sestrojené vizuálně. Obsahuje navíc prvek
nabídky typu „oddělovač prvků“. Takový prvek přidáte do nabídky tím, že jeho vlastnost Text nastavíte na
pomlčku (-). Modifikovaná místní nabídka vypadá takto:
Náměty na procvičování. Místní nabídky mohou být dynamické, čímž se rozumí to, že se jejich obsah
dynamicky mění při běhu (přidáváte nové příkazy, měníte texty, přístupnost, viditelnost prvků atp.). Zkuste si
takovou nabídku sestrojit. Chcete-li mít například různé místní nabídky podle toho, na kterém ovládacím prvku uživatel právě klepl pravým tlačítkem myši, využijte k identifikaci tohoto ovládacího prvku vlastnost ActiveControl formuláře a rozhodovací konstrukce zařaďte do událostní procedury Popup objektu místní nabídky.
Pruh nabídek na hlavním formuláři
Seznámení s formuláři Windows ukončíme v této brožuře sestrojením systému nabídek pro hlavní formulář. V mnoha ohledech se nabídky sestrojují analogicky jako místní nabídky. Držte se následující ho postupu.
1. Vraťte zpět jako startovací objekt projektu hlavní formulář.
2. V návrhovém zobrazení hlavního formuláře klepněte v soupravě nástrojů na tlačítko WinForms,
pak na nástroj MainMenu a klepněte na formuláři.
Pod formulářem se objeví podnos a v něm ikona ovládacího prvku s výchozím názvem MainMenu1.
Zároveň se pod titulkovým pruhem formuláře budou objevovat chlívky s napovídajícím titulkem „Type Here“ (Piš sem).
3. Do těchto chlívků napište texty, které se mají zobrazovat v nabídce. Jednotlivé příkazy budoucích
rozvíracích nabídek pište do chlívků pod daný prvek v pruhu nabídek, tedy pod sebe. Chcete-li
rovnou v textech určit přístupové klávesy, napište před zvolené písmeno znak & (na české klávesnici pravý Alt+C).
První nabídku, která odpovídá tlačítkům na formuláři, vidíte na obrázku na příští straně.
74
Rozšíření prototypu (3) – nabídky
Druhá nabídka v pruhu nabídek, Přizpůsobit, bude obsahovat tři příkazy. Jeden (Pozadí formuláře) pro zaplnění podkladové plochy formuláře obrázkem, který si uživatel zvolí, druhý (Změnit písmo) pro změnu atributů písma, které se používá pro zobrazení vylosovaných číslic. Třetím příkazem vyzkoušíte jiný způsob
obarvení číslic - uživatel si barvu vybere ve společném dialogovém okně Barva.
Třetí nabídka, Nápověda, bude obsahovat dva příkazy budoucí nápovědy aplikace. Tvorba nápovědy ale
přesahuje rozsah i účel této aplikace, proto se jí zabývat nebudeme, pouze připravíme nabídku pro budoucí
zobecnění prototypu. (Připomínám, že jistou nápovědu poskytují například vysvětlivky, které jsme probírali
při tvorbě textový polí formuláře parametrů).
4. Až budete hotovi s texty nabídek, změňte výchozí názvy na vypovídající. Klepněte na prvku
v pruhu nabídek a klepněte pravým tlačítkem myši. Zobrazí se místní nabídka, kterou vidíte na obrázku na další straně.
5. Zkontrolujte, je-li formulář sdružen s daným objektem nabídky. Klepněte na formuláři pravým tlačítkem myši a z místní nabídky zvolte Properties. Nastavte vlastnost Menu formuláře na MainMenu1.
75
Úvod do Visual Basic.net
6. Zvolte Edit Names a upravte názvy přímo na formuláři nebo v okně vlastností.
76
Rozšíření prototypu (3) – nabídky
7. V místní nabídce si všimněte užitečného příkazu Insert New, který umožňuje vkládat nové prvky
do již existujícího systému nabídek a Insert Separator, který usnadňuje vkládání oddělovačů skupin prvků v nabídce.
8. Vyzkoušejte prázdný systém nabídek. Při běhu by horní část hlavního formuláře měla vypadat
zhruba takto:
9. Naprogramujte událostní procedury Click jednotlivých příkazů v nabídkách.
10.Prvky první nabídky stačí synchronizovat s odpovídajícími akcemi, které se vykonávají
v událostních procedurách jednotlivých tlačítek:
Public Sub mnuItemDodatPrachy_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuItemDodatPrachy.Click
btnPrachy_Click(sender, e)
End Sub
11.Prvky poslední nabídky jsou zařazené sice jen formálně, až ale budou uživatelé aplikaci testovat,
mohli byste je vyplašit, kdyby se po zvolení nějakého prvku z nabídky nic nedělo. Proto je vhodné
zařadit alespoň informativní zprávu.
Public Sub mnuItemOAplikaci_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuItemOAplikaci.Click
Messagebox.Show("Sorry, ještě to není hotovo")
End Sub
Nabídky sestrojené v kódu
V předchozím oddílu jste viděli dvě varianty řešení místní nabídky: vizuálně a její přímý zápis v kódu.
Podobně můžete volit vizuální nebo programové řešení i pro pruh běžných nabídek s podřízenými a kaskádovými nabídkami.
1. Na začátek třídy formuláře přidejte příkaz:
Private MainMenu2 As MainMenu
2. Pak definujte novou instanci objektu hlavní nabídky a přiřaďte objekt nabídky formuláři:
MainMenu2 = New MainMenu()
Me.Menu = MainMenu2
3. Definujte prvky nabídky v pruhu nabídek:
Dim mnu2Akce As New MenuItem()
Dim mnu2Přizpůsobit As New MenuItem()
Dim mnu2Nápověda As New MenuItem()
77
Úvod do Visual Basic.net
4. Přiřaďte zobrazované texty prvkům v pruhu nabídek včetně případných přístupových kláves:
mnu2Akce.Text = "&Akce"
mnu2Přizpůsobit.Text = "&Přizpůsobit"
mnu2Nápověda.Text = "&Nápověda"
5. Metodou Add přidejte tyto prvky pruhu nabídek do kolekce MenuItems objektu MainMenu2:
MainMenu2.MenuItems.Add(mnu2Akce)
MainMenu2.MenuItems.Add(mnu2Přizpůsobit)
MainMenu2.MenuItems.Add(mnu2Nápověda)
6. Definujte prvky nabídky pro první rozvírací nabídku, včetně oddělovače, jímž chcete od ostatních
prvků izolovat příkaz pro ukončení aplikace:
Dim mnu2ItemRoztočit As New MenuItem()
Dim mnu2ItemVypsatStav As New MenuItem()
Dim mnu2ItemDodatPrachy As New MenuItem()
Dim mnu2ItemOddělovač1 As New MenuItem()
Dim mnu2ItemKonec As New MenuItem()
7. Přiřaďte zobrazované texty včetně přístupových kláves, klávesových zkratek, případně nastavte
další potřebné vlastnosti prvků nabídky:
mnu2ItemRoztočit.Text = "&Roztočit"
mnu2ItemVypsatStav.Text = "Vyp&sat stav"
mnu2ItemDodatPrachy.Text = "&Dodat další prachy"
mnu2ItemOddělovač1.Text = "-"
mnu2ItemKonec.Text = "&Konec"
mnu2ItemKonec.Shortcut = System.WinForms.Shortcut.AltF4
8. Metodou Add přidejte prvky první rozvírací nabídky do kolekce MenuItems objektu menu2Akce:
mnu2Akce.MenuItems.Add(mnu2ItemRoztočit)
mnu2Akce.MenuItems.Add(mnu2ItemVypsatStav)
mnu2Akce.MenuItems.Add(mnu2ItemDodatPrachy)
mnu2Akce.MenuItems.Add(mnu2ItemOddělovač1)
mnu2Akce.MenuItems.Add(mnu2ItemKonec)
9. Obdobně zpracujte druhou a třetí nabídku v pruhu nabídek:
' Nabídka Přizpůsobit:
Dim mnu2ItemPozadíFormuláře As New MenuItem()
Dim mnu2ItemVelikostPísma As New MenuItem()
mnu2ItemPozadíFormuláře.Text = "Pozadí &formuláře"
mnu2ItemVelikostPísma.Text = "V&elikost písma"
mnu2Přizpůsobit.MenuItems.Add(mnu2ItemPozadíFormuláře)
mnu2Přizpůsobit.MenuItems.Add(mnu2ItemVelikostPísma)
78
Rozšíření prototypu (3) – nabídky
' Nabídka Nápověda:
Dim mnu2ItemObsah As New MenuItem()
Dim mnu2ItemOAplikaci As New MenuItem()
mnu2ItemObsah.Text = "&Obsah"
mnu2ItemOAplikaci.Text = "&Informace o aplikaci"
mnu2Nápověda.MenuItems.Add(mnu2ItemObsah)
mnu2Nápověda.MenuItems.Add(mnu2ItemOAplikaci)
Náměty na procvičování
• Ve skutečných aplikacích se často používá obecnější model, kdy se uživatel zobrazuje na formuláři několik variant pruhu nabídek podle aktuální situace (podle stavu, v jakém se aplikace právě nachází). Zkuste
vytvořit různé varianty buď pomocí více objektů MainMenu nebo změnami obsahu systému nabídek při
běhu, abyste mohli varianty dynamicky přepínat.
• Jak uvidíte, provádějí se manipulační činnosti s nabídkami docela jednoduše (protože prvky nabídek tvoří
kolekce). Proto můžete nabídky poměrně jednoduše přesouvat či odstraňovat (metodou Remove).
• Chcete-li nabídky kopírovat, vyzkoušejte metodu CloneMenu. Metodou MergeMenu můžete ze dvou nabídek udělat jedinou.
• Až budete programovat aplikaci s více dokumentovým rozhraním (MDI), určitě využijete to, že nabídky
podporují také vytvoření seznamu dceřiných oken pro formulář MDI. (Vlastnost IsMDIContainer mateřského formuláře se nastaví na True, objekt hlavní nabídky se připojí k mateřskému formuláři a vlastnost
MDIList jednoho prvku pruhu nabídky (její text by mohl být například &Okno) se nastaví na True).
Využití společných dialogových oken Windows
Tři příkazy, které jsme zařadili do prostřední nabídky, otvírají jednu z dalších oblastí práce s formuláři
Windows, které se trochu dotkneme, protože je to záležitost, jíž se v řadě aplikacích nevyhnete a bylo by dost
pracné a neefektivní, kdybyste se tyto typy úloh pokoušeli řešit sami.
Když uživatel pracuje s nějakou aplikací, není vždy vhodné nebo žádoucí (nebo to ani nejde), aby všechny akce probíhaly automaticky, bez aktivní účasti uživatele. Často je třeba uživateli umožnit, aby si mohl
v rámci práce s aplikací otevřít nějaký soubor, uložit nějaký soubor, něco přebarvit či upravit atributy písma.
Nebo z aplikace něco tiskne a chcete mu dám možnost, aby si mohl předem nastavit nějaké charakteristiky
týkající se tištěné stránky, tisku samotného nebo tiskárny.
Když pracujete se standardními aplikacemi Windows (například ve Wordu), zobrazují se vám v těchto situacích tzv. společná dialogová okna Windows (Otevřít, Uložit jako, Barva, Písmo, Tisk apod.), která vypadají ve všech aplikacích stejně nebo velmi podobně.
Výhody jsou zřejmé. Uživatelé jsou na ně zvyklí a všechny aplikace s v tomto ohledu tváří“ na uživatele
stejně. Proto by bylo dobré, kdyby uživatelé mohli s těmito okny pracovat i ve vašich vlastních aplikacích. Ve
VB.NET to jde zařídit poměrně pohodlně, všechny potřebné nástroje najdete v soupravě nástrojů. Brožuru
ukončíme ukázkou využití tří společných dialogových oken: Otevřít, Písmo a Barva.
79
Úvod do Visual Basic.net
Změna pozadí formuláře
První společné dialogové okno využijeme v součinnosti s prvním příkazem prostřední nabídky. Umožníme uživateli aplikace, aby si mohl místo nudné šedivé plochy formuláře zobrazit nějaký atraktivnější podklad. Zároveň bychom mu ale měli umožnit, až se při práci s aplikací obrázku nasytí, aby mohl formulář
vrátit do původního stavu.
Obrázek na pozadí formuláře se nastavuje pomocí vlastnosti BackgroundImage formuláře. Aby si uživatel
mohl vybrat obrázek podle svých představ (a podle toho, jaké obrázky má dostupné), zobrazíte mu dialogové
okno Otevřít, uživatel si vyhledá soubor s obrázkem, vy převezmete úplnou cestu k obrázku, kterou vám poskytne společné dialogové okno Otevřít a přiřadíte obrázek vlastnosti BackgroundImage. Postup následuje:
1. V návrhovém zobrazení hlavního formuláře klepněte v soupravě nástrojů na tlačítko WinForms,
pak na nástroj OpenFileDialog a klepněte na formuláři.
2. Na podnos neviditelných komponent se přidá ikona společného dialogového okna Otevřít
s výchozím názvem OpenDialog1. Protože jich víc potřebovat nebudeme, ponecháme výchozí
název beze změny.
3. Požadované akce chcete provést tehdy, když uživatel zvolí v nabídce Přizpůsobení příkaz s textem
Změnit pozadí formuláře. Napište proto událostní proceduru Click tohoto prvku nabídky:
Public Sub mnuItemPozadíFormuláře_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuItemPozadíFormuláře.Click
If mnuItemPozadíFormuláře.Text = "Pozadí &formuláře" Then
'
Nastavení charakteristik dialogového okna Otevřít
OpenFileDialog1.InitialDirectory = "C:\Windows"
OpenFileDialog1.CheckFileExists = True
OpenFileDialog1.CheckPathExists = True
OpenFileDialog1.Filter = "Obrázky (*.gif)|*.gif|Bitové mapy (*.Bmp)|*.bmp"
OpenFileDialog1.FilterIndex = 2
OpenFileDialog1.MultiSelect = False
OpenFileDialog1.Title = "Vyberte soubor s obrázkem"
'
Zobrazení dialogového okna Otevřít
OpenFileDialog1.ShowDialog()
'
Vlastnost FileName dialogového okna Otevřít obsahuje úplnou cestu
'
k souboru (včetně názvu souboru), který uživatel vybral
If OpenFileDialog1.FileName = "" Then
MessageBox.Show("Název souboru s obrázkem není v pořádku")
Else
Me.BackgroundImage = Image.FromFile(OpenFileDialog1.FileName)
mnuItemPozadíFormuláře.Text = "Odstranit obrázek na pozadí"
End If
80
Rozšíření prototypu (3) – nabídky
Else
'
Návrat prázdného pozadí
Me.BackgroundImage = Nothing
mnuItemPozadíFormuláře.Text = "Pozadí &formuláře"
End If
End Sub
Základní konstrukce If procedury je založena na hodnotě vlastnosti Text prvku nabídky. Je-li to původní
text, znamená to, že je pozadí prázdné a uživateli se zobrazí dialogové okno Otevřít. Je-li to jiný text, znamená to, že na pozadí obrázek už je, takže se zlikviduje přiřazením Nothing a vrátí se původní text nabídky.
Před zobrazením společných dialogových oken máte možnost předem nastavit některé vlastnosti a přizpůsobit tak vzhled daného společného dialogového okna svým konkrétním potřebám. Některé možnosti ukazuje
předchozí výpis:
• Vlastnost InitialDirectory umožňuje nastavit výchozí složku, nejlépe nějakou, kde jsou obrázky.
• Zapnutím vlastností CheckFileExists, resp. CheckPathExists se můžete vyhnout testování situací,
že uživatel místo toho, aby soubor pouze vybral, napíše do pole Název souboru nějaký nesmysl.
Viz obrázek dále v textu.
• Vlastnost Filter umožňuje omezit obsah seznamu složek a souborů v dialogovém okně Otevřít jen
na ty, které explicitně uvedete. V našem případě jsme zařadili „gify“ a bitové mapy. První část (do
svislice) vždy udává text, který se zobrazí v rozvíracím seznamu Soubory Typu.
• Vlastnost FilterIndex umožňuje volit výchozí filtr z těch, které byly zařazeny do vlastnosti Filter.
Výchozí index je 1, v naší ukázce jsme ji ale nastavili na 2, takže se po zobrazení dialogového okna
objeví soubory s příponou .BMP.
• Nastavením vlastnosti MultiSelect na False jsme potlačili možnost výběru více souborů současně,
protože to v úloze nepotřebujeme (naopak by to vadilo, protože by to mohlo uživatele zbytečně
rozptylovat).
• Nakonec, nastavením vlastnosti Title změníme nápis v titulkovém pruhu dialogového okna.
Společná dialogová okna se zobrazí tak, že se zavolá metoda ShowDialog patřičného objektu. Protože
uživatel z nějakého důvodu změnil název původně vybraného souboru na jiný (viz obrázek na předchozí stra-
81
Úvod do Visual Basic.net
ně), zobrazí se mu po klepnutí na tlačítko OK následující okno se zprávou (vlastnost CheckFileExists je nastavena na True):
Dopadne-li vše dobře a uživatel zadá platný název souboru, vrátí se spolu s úplnou cestou jako hodnota
vlastnosti FileName dialogového okna Otevřít. Metodou FromFile třídy Image (v brožuře jste se s ní už setkali, když jste řešili zobrazování různých obrázků pro různé výhry) přiřadíte vybraná obrázek jako hodnotu
vlastnosti BackgroudImage formuláře a změníte text prvku nabídky. Pomocná konstrukce If ještě testuje, zda
není návratová hodnota prázdná, protože by při volání metody FromFile došlo k chybě.
Náměty na procvičování
• Rozšiřte seznam povolených formátů souborů s obrázky.
• Jak jste viděli u textových polí formuláře parametrů, patří mezi nejtěžší úlohy ty, které mají zpracovávat
nějaký vstup od uživatele aplikace. Zdokonalte sejmutí souboru s obrázkem tak, aby pokud možno nemohlo dojít k chybě a zkuste se vyhnout dialogovém oknu se zprávou zobrazenému výše, které je sice
pohodlné, ale bohužel s anglickým textem, což se mnohým uživatelům vůbec nebude líbit.
• Předělejte kód událostní procedury tak, aby nebyl závislý na konkrétních textech prvku nabídky. (aby se
po změnách textů prvků nabídek v návrhovém režimu nemusely předělávat událostní procedury).
Změna názvu písma pro losované číslice
Druhá (a poslední) ukázka společných dialogových oken se týká písma. Když uživatel zvolí z nabídky
Přizpůsobit prvek s textem Název písma, zobrazí se mu společné dialogové okno Písmo, v němž bude moci
změnit název písma a barvu písma (změnu jiných atributů písma mu v této ukázce sice formálně povolíme,
ale v aplikaci ji do povolených změn nezahrneme). Podobně jako v předchozí ukázce bychom mu měli také
poskytnout možnost, aby se mohl vrátit k původnímu písmu.
Pouhá změna názvu písma zavádí do aplikace větší atrakce, než si možná myslíte. Nejde jen o to, budouli číslice s patkou, bez patky, tučné nebo tenké. Existují totiž také písma, která nemají písmena a číslice, ale
všelijaké obrázkové symboly. Například, zvolí-li uživatel v dialogovém okně Písmo název písma Wingdings,
může po vylosování číslic vypadat trojice popisků takto:
82
Rozšíření prototypu (3) – nabídky
Připomínám, že uživatel právě vyhrál, protože jsou dva symboly stejné. (Pro testování výher tedy vůbec
nepotřebujeme vědět, jaké konkrétní číslice hráč vylosoval.) Řešení úlohy je analogické jako v předchozí
ukázce. Postup:
1. V návrhovém zobrazení hlavního formuláře klepněte v soupravě nástrojů na tlačítko WinForms,
pak na nástroj FontDialog a klepněte na formuláři.
2. Na podnos neviditelných komponent se přidá ikona společného dialogového okna Písmo
s výchozím názvem FontDialog1.
3. Abyste mohli vrátit původní písmo a původní barvu, “zapamatujte si je“. Deklarujte si pomocné
proměnné:
Private PůvodníPísmo As String
Private PůvodníBarva As System.Drawing.Color
4. V konstruktoru třídy formuláře uložte do těchto proměnných původní hodnoty vlastností (název
písma, resp. barva popředí):
PůvodníPísmo = lblCislo1.Font.Name
PůvodníBarva = lblCislo1.ForeColor
Předpokládáme, že všechny tři popisky budou formátované jednotně, takže stačí uložit hodnoty
z jediného (kteréhokoli) popisku.
5. Požadované akce chcete provést tehdy, když uživatel zvolí v nabídce Přizpůsobení příkaz s textem
Změnit název písma. Napište událostní proceduru Click tohoto prvku nabídky:
Public Sub mnuItemNázevPísma_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuItemNázevPísma.Click
If mnuItemNázevPísma.Text = "&Změnit název písma" Then
FontDialog1.ShowColor = True
FontDialog1.ShowEffects = True
FontDialog1.ShowDialog()
lblCislo1.Font = New System.Drawing.Font(FontDialog1.Font.Name, 48!)
lblCislo1.ForeColor = FontDialog1.Color
' Obdobně pro popisky lblCislo2 a lblCislo3
mnuItemNázevPísma.Text = "&Zpět původní písmo"
Else
lblCislo1.Font = New System.Drawing.Font(PůvodníPísmo, 48!)
lblCislo1.ForeColor = PůvodníBarva
' Obdobně pro popisky lblCislo2 a lblCislo3
mnuItemNázevPísma.Text = "&Změnit název písma"
End If
End Sub
83
Úvod do Visual Basic.net
Základní konstrukce If procedury je opět založena na hodnotě vlastnosti Text prvku nabídky. Je-li to původní text, znamená to, že se popisky zobrazují původním písmem a uživateli se proto zobrazí dialogové okno Písmo. Je-li to jiný text, znamená to, že uživatel už název písma změnil, takže se vrátí původní písmo,
původní barva a původní text prvku nabídky.
Dialogové okno Písmo, které se hráči zobrazí, když z nabídky na hlavním formuláři zvolí Přizpůsobit >
Změnit název písma, bude vypadat takto (uživatel si už něco v okně vybral):
Také u dialogového okna Písmo můžete předem nastavit některé vlastnosti a přizpůsobit jeho vzhled konkrétním potřebám. Například:
• ShowColor umožňuje zobrazit seznam, v němž uživatel volí barvu písma.
• ShowEffects umožňuje uživateli volit efekty (jako je přeškrtnuté písmo)
Dialogové okno Písmo zobrazíte tak, že zavoláte metodu ShowDialog objektu FontDialog. Atributy
písma, které uživatel v dialogovém okně zvolil, máte k dispozici prostřednictvím generické vlastnosti Font
objektu FontDialog, barvu písma ve vlastnosti Color. Písmo popisků se nastaví pomocí konstruktoru třídy
Font pojmenovaného prostoru System.Drawing.
Náměty na procvičování
• Umožněte uživateli měnit nejen název písma, ale i jiné atributy písma. Povolíte-li změnu velikosti, mělo
by to být v nějakých rozumných hranicích a zároveň by se podle nové velikosti měla změnit velikost objektů Label, případně i panelu, v němž jsou objekty popisků umístěny.
• Zvolí-li uživatel „obrázkové písmo“ (jako Wingdings), překódujte vylosované číslice na takové „obrázky“
z daného písma, které jsou podle vašich představ nejatraktivnější.
• Předělejte kód událostní procedury tak, aby nebyl závislý na konkrétních textech prvku nabídky nebo aby
přiřazoval hodnotu vlastnosti v cyklu.
84
Rozšíření prototypu (3) – nabídky
Volba barvy číslic v dialogovém okně barva
Chcete-li uživateli povolit pouze změnu barvy číslic, nikoli atributy písma, bude lepší, když mu zpřístupníte dialogové okno Barva. Postup je opět analogický jako v předchozích případech, ale jedná se o ovládací
prvek ColorDialog a návratová hodnota (barva, kterou uživatel vybral) je dána vlastností Color.
Za předpokladu, že jste do prostřední nabídky přidali třetí příkaz a prvek nabídky pojmenovali mnuItemBarvaČíslic, může kód událostní procedury Click tohoto prvku vypadat takto (uvádím poněkud jinou variantu řešení než v předchozích ukázkách):
Public Sub mnuItemBarvaČíslic_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles mnuItemBarvaČíslic.Click
Dim ctl As Label
If mnuPřizpůsobit.Menuitems(2).Text = "Změnit &barvu číslic" Then
ColorDialog1.ShowHelp = True
ColorDialog1.ShowDialog()
For Each ctl In panel1.Controls
If TypeOf ctl Is Label Then
ctl.ForeColor = ColorDialog1.Color
End If
Next
mnuItemBarvaČíslic.Text = "&Vrátit původní barvu"
Else
For Each ctl In panel1.Controls
If TypeOf ctl Is Label Then
ctl.ForeColor = PůvodníBarva
End If
Next
mnuItemBarvaČíslic.Text = "Změnit &barvu číslic"
End If
End Sub
85
Úvod do Visual Basic.net
Rejstřík
#
#region, 18
&
&
Debug.Print (VB6), 36
Declare, 51
dědění
formulářů, 6, 18
operátor, 19
zobrazit v titulku, 30
A
AcceptButton, 24
ActiveControl, 74
Anchor, 23
aplikace, ukončení, 25
As Any (VB6), 46, 53
assembly, 6
Assert (VB6), 36
Atributy, 6
Auto Hide, 23
B
BackColor, 49
BackgroundImage, 80
barva popředí
ovládacího prvku, 49
BorderStyle, 17
Build, 21
Button, 23
ByVal vs ByRef, 32
C
Call (VB6), 51
CancelButton, 24
Caption (VB6), 16, 26
cesta k souboru
nastavit podle EXE, 26
Color, vlastnost FontDialog, 84
ContextMenu, 70
control array (VB6), 38, 40
ControlBox, 17
Controls, kolekce, 39
cykly, VB.NET vs. VB6, 37
Č
Časovač, 53
D
Date (VB6), 19
DateTime, 19
datový typ, 33
datum a čas
VB.NET vs. VB6, 19
86
deklarace proměnných
VB.NET vs. VB6, 42
DialogResult, 68
Dispose, metoda, 19
Dock, 24
E
Empty (VB6), 65
End, příkaz, 25
Eqv (VB6), 53
Exit, 25
F
FileName, 82
Filter, 81
FilterIndex, 81
Focus, 65
Font, 26
FontDialog, 83
For - Next, 45
For Each, 39
ForeColor, 49
Form Layout (VB6), 16
Format, funkce, 34
formátování
ovládací prvky pro, 34
více ovládacích prvků současně, 27
formulář
"vždy nahoře", 16
běžící, 21
modální a nemodální, 67
počáteční pozice při běhu, 16
přidat do projektu, 60
zděděný, postup, 22
Free Threading, 6
FromFile, 25
Function vs. Sub, 32
funkce
API, ukázky, 51
formátovací (VB6), 42
na "Is" (VB6), 65
název s $ (VB6), 46
funkce API
VB.NET vs. VB6, 53
G
GetActiveWindow, 52
GroupBox, 40
H
Handles, 25
Hide, 68
Ch
CheckFileExists, 81
chyby
filtrování, 57
logické, 55
při běhu, 55
simulace výskytu, 58
syntaktické, 55
I
If, konstrukce, 32
Image
ovládací prvek (VB6), 26
třída, 25
vlastnost, 25
Imp (VB6), 53
Imports, 18, 30
Inherits, 18
InitialDirectory, 81
Initialize (VB6), událost, 19
InitializeComponent, 18
Interval časovače, 54
IsMissing (VB6), 34
IsNumeric, 65
K
klávesová zkratka, 72
knihovny typů (VB6), 6
kód
převést na komentář, 36
zobrazit, 17
komentáře v kódu, 18
komponenty
neviditelné, 53
konstanty, 33
vnitřní - názvy, 51
konstruktor, 18
konverzní funkce, 31
L
Label, 26
ladění, 21
Let (VB6), 30
Rejstřík
LoadPicture (VB6), 26
Location, 16
LSet (VB6), 43
M
MainMenu, 74
MaximizeBox, 17
Me, 18
MenuItem, 71
MessageBox, 50
MinButton (VB6), 17
MinimizeBox, 17
Možnosti
dialogové okno, 11
Mřížka, 28
MsgBox (VB6), 51
MultiSelect, 81
MyBase, 18
N
nabídka
místní, 70
ovládací, 17
pruh na formuláři, 74
náhodné číslo, 30
Name (VB6)
vs Filename, 16
Name, vlastnost (VB6), 38
Namespace, 6
nápověda
dynamická, 14
návrhář formuláře, 14
název
ovládacího prvku, 23
Název formuláře
vlastní, 16
názvy
prvků v nabídkách, 71
řešení, projekt, formulář, 16
New Project
dialogové okno, 12
Null (VB6), 65
O
obor
úrovně bloku, 45
obrázek
na formuláři, 25
na pozadí formuláře, 81
přičřadit při běhu, 25
oddělovač prvků
v nabídce, 74
Odkazy, 6
okna
kódu, 14
plovoucí, 14
skrývání, 14
ukotvená v doku, 14
vlastností, 14
okno
Output, 21
seznamu úloh, 40
okraj formuláře, 17
OpenFileDialog, 80
operátor
+= a další, 20
není rovno, 43
řetězení, 19
Option
Explicit, 31
Strict, 31
Options
dialogové okno, 11
Otevřít
společné dialogové okno, 80
Output, 40
okno, 21
overloading, 31
overloads, 45
Overrides, 19
ovládací prvek
udělit fokus při běhu, 65
P
PadLeft, 43
PadRight, 43
Panel, 40
parametry
pojmenované, 50
volitelné, 33
PictureBox, 25
Písmo
společné dialogové okno, 83
PlaySound, 52
podnos komponent, 53
Point, struktura, 20
pojmenovaný prostor, 6
pole
ovládacích prvků (VB6), 40
VB.NET vs. VB6, 34
pomůcky
při psaní kódu, 31, 36
Popisek, 26
Popup, 74
Pořadí podle osy z, 28
pozice formuláře při běhu
výchozí, 16
procedura
funkční, vlastní, 32
procedury
volní - syntax, 51
profil
uživatele ve VS.NET, 10
Project Properties (VB6), 16
projekt
nový, paleta, 12
Průzkumník řešení, 14
prvek nabídky
zaškrtnutý, 72
překrývání
procedur, 19
přetěžování, 31
příklad, 45
přístupové klávesy, 29
Q
QBColor (VB6), 49
R
Randomize, 30
ReDim
VB.NET vs. VB6, 35
references, 6
Resize, událost, 24
RGB (VB6), 49
Rnd, 30
Rozestupy, 28
Ř
řazení
tabelátorové, 28
řešení
vybudovat, 21
Řešení, 12
řetězce
pevné délky (VB6), 43
S
Select Case, 46
sender, 25
Set (VB6), 30
Show, 68
87
Úvod do Visual Basic.net
ShowColor, 84
ShowDialog, 67, 84
ShowEffects, 84
Size, struktura, 20
SizeMode, 25
skupina
ovládacích prvků, 40
skupiny projektů (VB6), 13
služby Web, 6
Solution, 12
souprava nástrojů, 14
automatické vysouvání a skrývání,
23
souřadnice
okna formuláře, 16
souřadnice formuláře
změna při běhu, 19
společná dialogová okna, 79
Spustit
aplikaci z Windows, 22
startovací objekt
nastavit, 60
StartPosition, 16
StartupPath, 26
StartUpPosition (VB6)
vs StartPosition, 16
Structure, konstrukce, 33
styl
okraje formuláře, 17
Sub New(), 18
System.EventArgs, 25
Š
šablony
projektů, 12
T
Tab Order, 28
TabIndex, 29
TabStop, 30
Tag (VB6), 38
Task List, 40
88
Text
vlastnost, 16
TextAlign, 24, 26
textové pole, 63
jen pro čtení, 63
kontroly platnosti hodnot, 64
pro heslo, 63
přístupová klávesa, 29
výběr znaků, 63
Tick
událost, 54
Time (VB6), 19
TimeOfDay, 19
Timer (VB6), 55
titulek
formuláře bez tlačítek, 22
ovládacího prvku, 23
zarovnání, 24
tlačítka
"OK" a "Storno", 24
v titulkovém pruhu, 17
tlačítko
na formuláři, 23
Today, 19
TODO, 19
Toolbox, 14
ToolTip, 63
TopMost, 16
ToString, 57
tray, 53
True
změna číselné reprezentace, 33
Try – Catch – Finally, 56
Type (VB6), 33
TypeOf, 39
U
událost Click, 24
událostní procedury, 24
ukotvení
ovládacích prvků, 23
ukotvení do doku, 24
umístění
formuláře, 16
Unload (VB6), 25
UseMnemonic, 30
úvodní obrazovka
VS.NET, 10
uzamknout
ovládací prvky, 14
V
Variant (VB6), 33
VarType (VB6), 33
Visual Basic Upgrade Wizard, 8
vlastnosti formuláře
nastavení při běhu, 19
vlnovka, 31
volné vrstvení, 6
výjimky, zpracování, 57
výstupy
do ladicího okna, 36
vysvětlivky, 63
vždy nahoře
formulář, 16
W
WMF, 25
WriteLine
a obdobné metody, 36
Z
Zalamování tex, 63
Záložky
okne vývojového prostředí, 15
zaškrtávací políčko, 69
zkrácené vyhodnocování, 37, 53
zpráva
v dialogovém okně, 68
Zvukový soubor
přehrát, 52

Podobné dokumenty

Výprodej Binzel 2015 - merkle

Výprodej Binzel 2015 - merkle Plynová hubice cylindr. NW 18 Plynová hubice NW 15 Plynová hubice NW 12 Plynová hubice cylindr. NW 20 Plynová hubice cylindr. NW 18 Plynová hubice konická NW 14 (MB 360) Plynová hubice konická NW 1...

Více

PDF ke stažení

PDF ke stažení Argument, že živnostenský úřad žádnou závadu neshledal, na této skutečnosti nic nemění. Obdivuji toho „kolegu“, který ručí za kvalitu. Je „bez nadsázky“ odvážný. Na trhu je však ještě druhá, možná ...

Více

Jazyk C patří mezi tzv

Jazyk C patří mezi tzv Další program ukazuje způsob použití C++ k zobrazení prostého textu. Naučíme se používat funkci printf a formátování textového výstupu. Dalším prvkem k vysvětlení je použití knihovny. Příkazy, kter...

Více

Dokumentace - Dušan Jenčík

Dokumentace - Dušan Jenčík struktura. Pokud tedy náš projekt bude komunikovat hlavně s databází pro získání obsahu, je žádoucí celou tuto komunikaci situovat do tzv. třídy. Bude se jednat o jeden či více souborů, které jsou ...

Více

1 Úvod do Turbo Pascalu

1 Úvod do Turbo Pascalu - cyklus zapisuje takto: while podminka do telo_cyklu - while znamená dokud a do dělej - tělem cyklu rozumíme příkazy, které se mají vykonávat v cyklu 2. Repeat-until cyklus (cyklus s výstupní podm...

Více