Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv. copyright. To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby ètenáø vidìl, jakým zpùsobem je titul zpracován a mohl se také podle tohoto, jako jednoho z parametrù, rozhodnout, zda titul koupí èi ne). Z toho vyplývá, že není dovoleno tuto ukázku jakýmkoliv zpùsobem dále šíøit, veøejnì èi neveøejnì napø. umis ováním na datová média, na jiné internetové stránky (ani prostøednictvím odkazù) apod. redakce nakladatelství BEN technická literatura redakce@ben.cz
3 MOTÝLCI (motylci vbp) Témìø každá aplikace ve Windows má ve svých oknech rùzné obrázky Autoøi aplikací užívají obrázkù pro jejich vysokou vypovídací schopnost a také proto, že obrázky dodávají aplikaci lepší vzhled Když vidíte vedle èísla obrázek pøedstavující telefonní pøístroj, je vám okamžitì jasné, že jde o telefonní èíslo Je však tøeba øíci, že nevhodnou kombinací obrázkù lze vzhledu aplikace spíše uškodit, ale to záleží pouze na tvùrci aplikace, jak vhodnì obrázky použije Èasto se také v programech objevují rùzné grafické animace V této kapitole se nauèíte vkládat do svých aplikací obrázky a vytváøet jednoduché animace Také se seznámíte s ovládacím prvkem Timer (èasovaè) Souèástí výkladu v této kapitole je èást, zabývající se ladìním programu Pomocí tohoto nástroje se nauèíte hledat chyby ve vašem programu Popis programu Zadání bude jednoduché Naprogramujte aplikaci, ve které budou pøes okno formuláøe pøelétávat motýlci Ve chvíli, kdy se jeden ztratí (pøeletí okno), vyletí další z místa za dolním okrajem okna Obr 3 1 Aplikace Motýlci Prvky na formuláøi Vkládání obrázkù prvkem PictureBox Jedním z prvkù, do kterého je možné vkládat obrázky je prvek PictureBox Pøidejte tento prvek do formuláøe Form1 Obrázek vyberete v dialogovém oknì Load Picture, které se objeví po poklepání na vlastnost Picture 3 Motýlci 27
Visual Basic pracuje s obrázky v grafických formátech pro rastrové obrázky - BMP, pro vektorové obrázky - WMF a zobrazení ikon - ICO Vložte do formuláøe obrázky motýla se zavøenými a otevøenými køídly (oba pomocí prvku typu PictureBox), prvek typu Timer a ještì jeden prvek typu PictureBox (bez obrázku) Prvky OtevrenaKridla a ZavrenaKridla budou sloužit pouze jako zásobníky obrázkù a nebudou se zobrazovat 2WHYUHQD.ULGOD3LFWXUH%R[ =DYUHQD.ULGOD3LFWXUH%R[ 0RW\O3LFWXUH%R[ 7LPHU7LPHU Obr 3 2 Návrh rozmístìní prvkù Vlastnosti Název prvku Vlastnost Hodnota ZavrenaKridla PictureBox Picture obrázek motýla se zavøenými køídly Visible False OtevrenaKridla PictureBox Picture obrázek motýla s otevøenými køídly Visible False Motyl PictureBox BorderStyle 0 - None Timer1 Timer Interval 200 Pomocný výklad Prvek Timer Prvek Timer (èasovaè) se používá v pøípadì, kdy potøebujete provádìt nìkteré pøíkazy pravidelnì, po uplynutí urèitého èasového intervalu K nastavení intervalu slouží vlastnost Interval (1000 @ 1 s) Událost, která po uplynutí intervalu pravidelnì nastává, má název Timer Pøíklad: Naprogramujte, aby se pøibližnì každou vteøinu ozýval zvukový signál Postup: Vložte do aplikace prvek Timer1 a nastavte jeho vlastnost Interval na 1000 Do obslužné procedury Timer1_Timer napište pøíkaz Beep 28 Visual Basic - sbírka øešených pøíkladù
Private Sub Timer1_Timer() Beep Neoèekávejte, že se zvukový signál ozve opravdu pøesnì každou vteøinu Pokud je systém zaneprázdnìn mùže vyvolání takové události trvat déle než je nastavený èasový interval Promìnné Zatím jste pracovali pouze s nìkterými ovládacími prvky (Label, TextBox) a mìnili jejich vlastnosti Ve svých programech si jistì budete potøebovat zapamatovat i jiná data - napø kdybyste chtìli, aby se ve vaší aplikaci ozval zvukový signál pøesnì desetkrát, potøebujete k tomu nìjaké poèítadlo, atd K tomuto úèelu slouží v programovacích jazycích promìnné Promìnná je datový objekt, jehož hodnotu lze v prùbìhu programu mìnit (narozdíl od konstanty - viz kapitolu 6) Je urèena identifikátorem (jménem) a urèitým datovým typem (napø celé èíslo) Ve Visual Basicu se promìnné deklarují pomocí klíèového slova Dim Promìnné lze deklarovat také pomocí klíèových slov Public a Private O této deklaraci se zmíníme v dalších kapitolách Syntaxe: Dim jméno As typ Pøíklad: Deklarace promìnných Dim pocet As Integer Dim jmeno1 As String 'Deklarace promìnné pocet typu Integer (celé èíslo) 'Deklarace promìnné jmeno1 typu String (øetìzec znakù) Dim jmeno2 As String Dim BudePrset As Boolean 'Promìnné typu Boolean nabývají hodnot True a False Dim zmokneme As Boolean Deklarace jednoduchých datových typù (to jsou napø právì uvedené typy) není ve Visual Basicu povinná, ale doporuèujeme ji Podrobnìji o jednotlivých typech v dalších pøíkladech Pøíklad: Pøiøazování hodnot do promìnných: pocet = 10 'Promìnné poèet je pøiøazena hodnota 10 jmeno1 = "Pavel" jmeno2 = jmeno1 'Promìnné jmeno1 je pøiøazen øetìzec Pavel 'Promìnné jmeno2 je pøiøazena hodnota promìnné jmeno1 If Not BudePrset Then zmokneme = False ' Nebude-li pršet, nezmoknem Jméno promìnné musí zaèínat písmenem! 3 Motýlci 29
Tvorba programu Mávání køídel Pøíklad: Na ploše okna aplikace bude obrázek motýla s otevøenými køídly a po klepnutí do prostoru okna motýl køídla zavøe V proceduøe Form_Load (událost Load viz pø Seznámení s poèítaèem) pøiøaïte vlastnosti Picture prvku Motyl obrázek motýla s otevøenými køídly (vlastnost Picture prvku OtevrenaKridla) a v proceduøe Form_Click zmìòte obrázek v prvku Motyl na obrázek motýla se zavøenými køídly Private Sub Form_Load() Motyl Picture = OtevrenaKridla Picture Private Sub Form_Click() Motyl Picture = ZavrenaKridla Picture Pro pùvodní pøíklad potøebujete, aby motýlek mával køídly Toho docílíte tím, že necháte mìnit v urèitých èasových intervalech obrázky motýla se zavøenými a otevøenými køídly V programu to znamená, že prvku Motyl budete v proceduøe Timer1_Timer mìnit vlastnost Picture Problém, jak urèit, který z obrázkù se má právì pøiøadit, vyøešíte pomocí promìnné Nejvhodnìjší je promìnná typu Boolean, která nabývá hodnot True a False a dobøe se s ní pracuje v podmínìných pøíkazech Private Sub Timer1_Timer() Dim zavrena As Boolean 'Deklarace promìnné zavrena typu Boolean If zavrena Then 'Pokud jsou køídla zavøená Motyl Picture = OtevrenaKridla Picture 'Pøiøaï obrázek motýla s otevøenými køídly 'Jsou-li otevøená Motyl Picture = ZavrenaKridla Picture 'Pøiøaï obrázek motýla se zavøenými køídly zavrena = Not zavrena 'Negace hodnoty promìnné zavrena (True na False a False na True) Podmínka v podmínìném pøíkazu musí nabývat hodnot True nebo False (je splnìna nebo není) Protože je promìnná zavrena typu boolean (nabývá tedy pouze hodnot True nebo False), staèí napsat If zavrena Then, místo If zavrena =True Then Procedura Timer1_Timer se bude volat vždy po uplynutí urèitého èasového úseku (nastaveného vámi - pomocí vlastnosti Interval) Obrázky by se tím mìly pravidelnì støídat a vytváøet tak dojem, že motýlek mává køídly Spus te program Motýlek mìl mávat køídly Ale nemává 30 Visual Basic - sbírka øešených pøíkladù
V tuto chvíli bychom mohli napsat, proè tomu tak není, ale je dùležité, abyste se nauèili hledat chyby v programu, který dìlá nìco jiného než vy chcete Pomocný výklad Ladìní programu Pøi ladìní programu se snažíte odstranit jeho nedostatky nebo kontrolujete, zda pracuje podle vašich pøedstav Nalézt chybu lze napøíklad tím, že program krokujete tzn necháte program probíhat po jednotlivých pøíkazech a sledujete co se dìje, jak se mìní hodnoty promìnných, vlastnosti prvkù atd Správnì odladìný program by se nemìl nechat nièím zaskoèit a mìl by vracet vždy správný výsledek Po stisku klávesy F8 (nebo výbìrem z nabídky Run + Step Into) se objeví okno urèené k ladìní - Debug Window a pøi každém dalším stisknutí se vykoná daný pøíkaz Pøíkaz, který je na øadì je v rámeèku Všimnìte si, že pøi ladìní náš program probíhá stále stejnou èástí podmínìného pøíkazu Hodnoty promìnných je možné sledovat v horní èásti okna Debug Stisknìte tlaèítko Watch, vyberte nabídku Tools + Add Watch (nebo napø pomocí pravého tlaèítka v èásti Watch) a zadejte jméno promìnné Obr 3 3 Okno pro ladìní programu - Debug Window Hodnota promìnné zavrena se zmìní, ale pøi dalším volání procedury má opìt pùvodní hodnotu Z toho vyplývá, že pøíkazy uvnitø procedury jsou správné a chyba je jinde To, co jsme zatím zamlèeli a co je vlastnì i pøíèinou chyby, jsou rozdíly v typech deklarace promìnných Promìnná zavrena je tzv lokální promìnná Lokální promìnné se deklarují uvnitø procedury, lze se na nì odkazovat jen v dané proceduøe (tyto promìnné nelze používat v ostatních èástech programu) a po jejím skonèení zanikají Protože tuto promìnnou potøebujete pouze v jedné proceduøe, mìla by zùstat lokální, ale mìla by si zároveò 3 Motýlci 31
uchovávat svou hodnotu do pøíštího volání procedury To zajistíte deklarací s klíèovým slovem Static Opravený program: Private Sub Timer1_Timer() Static zavrena As Boolean If zavrena Then Motyl Picture = OtevrenaKridla Picture Motyl Picture = ZavrenaKridla Picture zavrena = Not zavrena A motýl køídly mává Dalším typem jsou promìnné globální - platí ve všech procedurách daného formuláøe (každá procedura je mùže používat) Deklarují se v deklaraèní èásti okna zdrojového kódu (General - declarations) Pokud chcete, aby program vyžadoval deklaraci promìnných, napište do deklaraèní èásti pøíkaz Option Explicit Jinak nedeklarovaným promìnným pøiøazuje Visual Basic automaticky standardní datový typ Variant (obecný datový typ) Pozor! Pøi deklaraci napø Dim cislo1, cislo2, cislo3 As Integer je promìnná cislo3 typu Integer, ale ostatní jsou typu Variant Objekty ve Visual Basicu Všechny ovládací prvky, nabídka, formuláø a další souèásti vašich projektù budeme ve Visual Basicu nazývat objekty Pokud chceme porozumìt, co to vlastnì objekt je mùžeme ho srovnat s objekty ve skuteèném svìtì Èlovìk, dùm, auto, mìsto atd, to všechno jsou objekty reálného svìta Každý objekt má své vlastnosti, a se jedná o objekt z reálného svìta nebo objekt Visual Basicu Pøíkladem vlastností je název objektu, výška objektu nebo šíøka objektu Ne každý objekt má stejné vlastnosti, zatímco u èlovìka nás bude zajímat jeho váha, u mìsta nás mùže zajímat napøíklad poèet obyvatel U objektù ve Visual Basicu je to stejné U prvku TextBox nastavujeme vlastnost Text, zatímco prvek PictureBox tuto vlastnost nemá Objekty ve Visual Basicu mají tu výhodu, že programátor sám urèuje, jakých hodnot budou vlastnosti nabývat a navíc je v prùbìhu programu mùže mìnit Kromì svých vlastností, které objekt charakterizují, mùže objekt také vykonávat nìjaké èinnosti Napøíklad objekt èlovìk umí jíst, chodit, spát, nakupovat Èinnosti, které objekty ve Visual Basicu umí, se nazývají metody Každý objekt má seznam svých metod Metody jsou již pøedprogramované akce, které lze s objektem provádìt Nìkteré metody vyžadují, 32 Visual Basic - sbírka øešených pøíkladù
aby programátor pøedal této metodì nìjaké hodnoty - parametry metody Opìt pøíklad z reálného svìta Èlovìk umí nakupovat, aby ale tuto èinnost mohl vykonávat, potøebuje seznam vìcí, které má koupit Prvek PictureBox má metodu Move Tato metoda zpùsobí pøemístìní prvku a potøebuje dva parametry - souøadnice na které se má objekt pøemístit Metody se volají pomocí teèkové syntaxe, jejich parametry se uvádìjí za jméno metody a jsou oddìleny èárkou Pøíklad: Pøemístìní prvku Motyl na souøadnice X, Y Motyl Move X,Y Blíže se s objekty a jejich metodami seznámíte v dalších kapitolách Pokraèování v tvorbì programu Aby motýlek létal, je nutné jej navíc pøi každém mávnutí køídel (tj pøi zmìnì obrázku) posunout Umístìní prvkù je obsažené ve vlastnostech Top (vzdálenost od horního okraje okna) a Left (vzdálenost od levého okraje) Pøíklad: Umístìní prvku Label1 do levého horního rohu Label1 Left = 0 Label1 Top = 0 Pøíklad: Posunutí prvku Motyl o 100 bodù vpravo Motyl Left = Motyl Left + 100 a o 150 bodù nahoru Motyl Top = Motyl Top - 150 Stejný efekt jako dva pøedcházející pøíkazy má metoda Move Motyl Move Motyl Left + 100, Motyl Top - 150 Metoda Move mùže obsahovat ještì další dva parametry - pro novou šíøku a výšku objektu Syntaxe: Objekt Move vlevo, nahoru, šíøka, výška Private Sub Timer1_Timer() Static zavrena As Boolean Motyl Move Motyl Left + 100, Motyl Top - 150 If zavrena Then Motyl Picture = OtevrenaKridla Picture Motyl Picture = ZavrenaKridla Picture zavrena = Not zavrena 3 Motýlci 33
Motýlek mizí za okrajem okna a už se neobjeví Upravte nyní program tak, aby vždy když motýlek zmizí, se objevil další - vylétl z dolního okraje K tomu budete potøebovat znát nìkteré další vlastnosti Test pøekroèení horního okraje vlastnì znamená, že dolní okraj motýla má vzdálenost menší než 0 od horního okraje okna Vzdálenost dolního okraje motýla zjistíte tím, že pøiètete k vlastnosti Top prvku Motyl jeho výšku vlastnost Height Vzdálenost horního okraje nového motýlka bude výška okna (vlastnost ScaleHeight), vzdálenost od levého okraje okna nastavte napø na nulu If Motyl Top + Motyl Height < 0 Then 'Motýl je za horním okrajem Motyl Top = Form1 ScaleHeight 'Motýl se posune pod dolní okraj okna Motyl Left = 0 'Vzdálenost od levého okraje bude 0 Šíøku prvku urèuje vlastnost Width, šíøku vnitøní èásti okna vlastnost ScaleWidth Celá procedura: Private Sub Timer1_Timer() Static zavrena As Boolean If Motyl Top + Motyl Height < 0 Then 'Motýl je za horním okrajem Motyl Top = Form1 ScaleHeight 'Motýl se posune pod dolní okraj okna Motyl Left = 0 'Vzdálenost od levého okraje bude 0 Motyl Move Motyl Left + 100, Motyl Top - 150 ' Normální posun If zavrena Then Motyl Picture = OtevrenaKridla Picture Motyl Picture = ZavrenaKridla Picture zavrena = Not zavrena 'Pokud jsou køídla zavøená 'Pøiøaï obrázek motýla s otevøenými køídly 'Jsou-li otevøená 'Pøiøaï obrázek motýla se zavøenými køídly 'Negace promìnné zavrena 34 Visual Basic - sbírka øešených pøíkladù