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