Předně se chci omluvit za to, že jsem dlouho neměl čas a že jste na tento díl museli velice dlouho čekat. Teď snad času bude více a seriál může v klidu pokračovat dál.
V programování se často setkáváme se situací, že potřebujeme nějaký příkaz volat opakovaně, i když třeba s malinko odlišnými parametry. Téměř každý programovací jazyk (Visual Basic nevyjímaje) obsahuje cykly. Těch existuje více druhů, v tomto dílu článku se naučíme používat a vytvářet cyklus For. Ten se používá k opakování jednoho a více příkazů, přičemž předem známe počet opakování.
Základní struktura tohoto cyklu vypadá takto:
For [čítač] = [Start] To [Stop]
[Jeden nebo více příkazů]
Next
Čítač cyklu je proměnná (číselného typu, tzn. Integer, Double apod.), podle které zjistíme, po kolikáté se příkazy v cyklu právě provádějí. Start je počáteční hodnota čítače a Stop je hodnota koncová. Na začátku se do proměnné čítače nastaví počáteční hodnota a spustí se příkazy v cyklu. Jakmile dorazíme k příkazu Next, hodnota proměnné čítače se zvýší o jedničku a pokud je tato nováho hodnota menší nebo rovna koncové hodnotě, příkazy se provedou znovu a celý proces se opakuje, dokud není čítač větší než koncová hodnota. Pak se pokračuje dalším říkazem za tímto cyklem.
Představte si teď tento cyklus:
Dim i As Integer
For i = 1 To 10
MsgBox(i)
Next
Příkaz MsgBox(i) se postupně spustí pro každé celé číslo od 1 do 10 včetně těchto hranic. To tedy znamená, že nejprve se objeví zpráva, ve které bude jako text číslo 1, pak se hned vypíše zpráva s číslem 2, pak z číslem 3 atd., poslední zpráva ukáže číslo 10. Čítač cyklu je v tomto případě proměnná i a pro každé spuštění příkazů uvnitř cyklu (průchod) má jinou hodnotu. To, co je uvnitř cyklu, ať už je to cokoliv, se spustí nejdřív pro i = 1, pak pro i = 2, pak pro i = 3 až pro i = 10.
Aplikace Násobilka
Jako demonstraci cyklu si nejprve naprogramujeme jednoduchou aplikaci Násobilka, která ukáže prvních 10 násobků zadaného čísla. Naučíme se také používat komponentu ComboBox, což je rozbalovací seznam.
Spusťte si tedy Visual Basic a vytvořte nový projekt (Windows Application, jako vždy). Na formulář přidejte komponentu Label (její vlastnost Text nastavte na hodnotu "Zobrazit násobky") a hned vedle komponentu ComboBox. Nakonec přidejte komponentu ListBox. Formulář by měl vypadat přibližně takto:
Nyní vyberte komponentu ComboBox1 a oklepejte na jají vlastnost Items. Objeví se okno, ve kterém zadáme položky, které se mají v komponentě zobrazit. Mohli bychom je vyplnit ručně v tomto okně, ale já jsem řekl ne. Vyplníme je přeci pomocí cyklu, takže klikněte na tlačítko Cancel a dvakrát poklepejte do plochy formuláře (ne na komponentu!). Otevře se vám okno kódu (radši zkontrolujte, jestli se procedura jmenuje Form1_Load. Zapište do ní tento kód:
For i As Integer = 1 To 20
ComboBox1.Items.Add(i)
Next
Pokud program spustíte a rozbalíte toto rozbalovací pole, uvidíte v něm čísla od 1 do 20. Všimněte si, že jsem proměnnou i nadeklaroval až v cyklu, tady už nepoužíváme příkaz Dim. Rozdíl mezi deklarací příkazem Dim a mezi tímto zápisem je v tom, že promenná i platí pouze v rámci cyklu, v příkazu někde za cyklem neexistuje. Pokud použijeme příkaz Dim, platí proměnná v celé proceduře. V tomto případě je to naštěstí úplně jedno.
Aby uživatel nemohl do rozbalovacího seznamu zapisovat vlastní hodnoty, nastavte jeho vlastnost DropDownStyle na hodnotu DropDownList.
Po vybrání čísla z tohoto seznamu vypíšeme do velkého seznamu prvních deset násobků vybraného čísla. Poklepejte tedy na rozbalovací seznam a do procedury ComboBox1_SelectedIndexChanged (která se spustí při vybrání nějaké položky) napište tento kód:
ListBox1.Items.Clear()
For i As Integer = 1 To 10
ListBox1.Items.Add(CInt(ComboBox1.SelectedItem) * i)
Next
Tento kód je též velmi jednoduchý. První řádek vymaže celý seznam ListBox1, protože tam mohou být násobky, které jsme vypsali předchozím výběrem. Pak následuje cyklus od 1 do 10. Do seznamu vypisujeme hodnotu vybranou v rozbalovacím seznamu, kterou vynásobíme aktuální hodnotou proměnné i. Pokud tedy vyberem třeba 3, nejprve se do seznamu přidá 3 * 1, pak 3 * 2, pak 3 * 3 atd., až 3 * 10. Tyto výrazy se samozřejmě spočítají a do seznamu se vypíšou jejich výsledky. Hodnota ComboBox1.SelectedItem vrátí právě vybranou položku z tohoto seznamu, je lepší ji převést na Integer, protože nevíme, jestli to není text (ComboBox texty obsahovat může). Bez převodu by se sice nic nestalo, ale je to lepší raději převést.
To je vlastně vše. Nyní aplikace Násoblika funguje:
Všimněte si, že komponenty ListBox a ComboBox se ovládají velmi podobně - přidávání položek se dělá přes Items.Add, vymazání přes Items.Clear atd., vybranou položku najdeme v SelectedItem, pořadí vybrané položky je v SelectedIndex, zkrátka tyto komponenty jsou velice podobné. To je velká výhoda .NET Frameworku, v některých programovacích jazycích a prostředích to není samozřejmost, i podobné komponenty se používají jinak. V prostředí Visual Basic .NET, které je na .NET Frameworku postavené, je tu zkrátka pořádek - podobné věci se používají stejně.
Aplikace Dělitelé
Další věc, na které si procvičíme cykly, je aplikace Dělitelé. Vytvořte si nový projekt a na formulář si přidejte komponentu Label (vlastnost Text nastavte na hodnotu "Zadejte číslo:"), hned vedle TextBox, do kterého zapíšeme číslo, a vedle něj komponentu Button (vlastnost Text nastavte na hodnotu "Vypsat dělitele". Dolů přidejte opět velký ListBox. Mělo by to vypadat nějak takto:
Nyní poklepejte na tlačítko a otevře se vám procedura Button1_Click. Nejprve ověříme, jestli uživatel zadal nějaké číslo. Text na číslo jsme sic již v minulých dílech převáděli, ale pokud uživatel napsal do políčka třeba "abc", program ohlásil chybu a ukončil se (spadnul). Nyní se naučíme způsob, kterým převedem text na číslo a dozvíme se, jestli se to podařilo. Pokud ne, můžeme nějak zareagovat, třeba zobrazit chybovou hlášku.
Pro bezpečné převedení textu na číslo se používá funkce Integer.TryParse. Potřebuje dva parametry - první je hodnota, kterou chceme převést, a druhá je název proměnné, do které se hodnota uloží. Samotná funkce vrátí True, pokud se převod podařil, nebo False, pokud se převést nepovedlo. Stačí tedy pomocí jednoduché podmínky ověřit, jestli se převedení podařilo, a pokud ne, zobrazit chybu a předčasně ukončit proceduru příkazem Exit Sub.
V této konkrétní ukázce je Exit Sub nadbytečné, ale ve většině případů za touto podmínkou budete dále s proměnnou cislo pracovat, a v takovém případě je nutné proceduru ihned ukončit, pokud se zadaná hodnota nedá převést na číslo. Proto tam je Exit Sub.
Do procedury Button1_Click tedy zapište tento kód:
Dim cislo As Integer = 0
If Integer.TryParse(TextBox1.Text, cislo) = False Then
MsgBox("Musíte zadat číslo!")
Exit Sub
End If
Již jednou jsem podotýkal, že podobné věci se dělají podobně. Pokud budu chtít bezpečně převést na Boolean, použiji funkci Boolean.TryParse, to samé platí pro Double, Byte atd.
Nyní tedy máme proměnnou cislo, která obsahuje číslo, jehož dělitele chceme vypsat do seznamu. Dělitel je číslo, kterým můžeme vydělit beze zbytku. V některém z minulých dílů jsme si říkali o operátoru Mod, který spočítá zbytek po dělení. Pokud je zbytek po vydělení nula, znamená to, že je číslo dělitelné beze zbytku.
Jak tedy najdeme a vypíšeme všechny dělitele čísla? Uděláme si cyklus od 1 do cislo (hodnotu této proměnné sice v tuto chvíli neznáme, nevíme totiž, co uživatel do pole zadá, ale to nám nevadí, skutečná hodnota není podstatná, jde o to, aby se vyzkoušely všechna čísla, která mohou být děliteli, a to až do hodnoty této proměnné) a v každém kroku zkusíme proměnnou cislo vydělit aktuální hodnotou čítače. Pokud zbytek vyjde nula, aktuální hodnota čítače je dělitel čísla cislo, přidáme tedy hodnotu tohoto čítače do seznamu (protože hodnota čítače je to, čím zkoušíme vydělit, je to tedy případný dělitel).
Zkrátka a dobře zkusíme cislo vydělit každým číslem od 1 do cislo a pokud se to podaří, přidáme aktuálně zkoušené číslo do seznamu. Před samotným spuštěním cyklu ještě seznam vymažeme, aby tam nezůstaly výsledky z přechozího vyhledávání.
Přidejte tedy za předchozí kousek kódu ještě těchto pět řádků:
ListBox1.Items.Clear()
For i As Integer = 1 To cislo
If cislo Mod i = 0 Then ListBox1.Items.Add(i)
Next
To je celé. Můžete si aplikaci spustit a vyzkoušet.
Protentokrát je to již vše. V příštím díle si vysvětlíme, co to jsou pole a jak se s nimi pomocí cyklu pracuje.