Doufám, že si z minulého dílu pamatujete, jak fungují podmínky. Pokud ne, rozhodně si je připomeňte. Dnes je totiž budeme používat ve trochu rozšířené podobě.
Klíčové slovo ElseIf
Minule jsme si ukázali dva typy podmínek (krátkou a dlouhou). Ukázali jsme si také, že v obou typech můžeme použít klíčové slovo Else, za které napíšeme příkazy, které se spustí, když podmínka neplatí. Ve skutečnosti existuje ještě klíčové slovo ElseIf (psáno dohromady), které funkce podmínky rozšiřuje.
If a > 50 Then
MsgBox("a je větší než 50")
ElseIf a > 30 Then
MsgBox("a je od 31 do 50")
ElseIf a > 10 Then
MsgBox("a je 11 do 30")
Else
MsgBox("a je menší nebo rovno 10")
End If
Pokud je a větší než 50, provede se první podmínka a pak se pokračuje až za klíčovým slovem End If. Pokud ale a je menší nebo rovno 50, zkusí se další podmínka. A tak to pokračuje dál a dál, jakmile se najde vyhovující podmínka, splní se její příkazy a pokračuje se až za podmínkou. To znamená, že když a je 55, zobrazí se jen první zpráva (a je větší než 50), ale další už ne. Druhá větev podmínky se vůbec nebude testovat, pokračuje se až dalším příkazem za celou podmínkou. V každém případě se tedy provede první vyhovující část a dál už se netestuje. Část Else je nepovinná, splní se jen v případě, že žádná z podmínek nevyhovuje. Ale být tam vůbec nemusí.
Tento typ podmínky nemá zkrácený zápis, v každé větvi může být samozřejmě více příkazů.
Program pro cizince
Spusťte si Visual Basic a vytvořte si nový projekt (Windows Application). Na formulář přidejte komponentu ListBox a pod ní komponentu Label. Komponentě Label můžete změnit písmo na nějaké trochu větší, ale ne moc velké. Vymažte jí také hodnotu vlastnosti Text, ale pozor, tato komponenta bez text u nebude vidět. Uvidíme ji, až se jí za běhu nastaví nějaký text.
Nyní si vyberte komponentu ListBox a v okně vlastností klikněte do pole pro hodnotu vlastnosti Items. Objeví se malé tlačítko se třemi tečkami, když na něj klikneme, ukáže se nám okno s velkým textovým polem. Sem vložíme řádky, které chceme v komponentě ListBox mít. Na každý řádek vložíme jednu položku seznamu.
Vložte tam tedy tyto řádky:
Good morning
Good afternoon
Good bye
Excuse me
Where is ...
hotel
restaurant
railway station
telephone
supermarket
toilet
Pokud vás napadnou nějaká další slovíčka, můžete si je přidat. Až tam budete mít vše, zavřete toto okno a dvakrát klikněte na komponentu ListBox. Otevře se nám procedura události ListBox1_SelectedIndexChanged, která se spustí, když uživatel vybere nějakou položku (resp. když se změní výběr položky).
Do této procedury napíšeme naši složenou podmínku:
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
If ListBox1.SelectedIndex = 0 Then
Label1.Text = "Dobrý den, Dobré ráno"
ElseIf ListBox1.SelectedIndex = 1 Then
Label1.Text = "Dobrý den, Dobré odpoledne"
ElseIf ListBox1.SelectedIndex = 2 Then
Label1.Text = "Nashledanou"
ElseIf ListBox1.SelectedIndex = 3 Then
Label1.Text = "Promiňte"
ElseIf ListBox1.SelectedIndex = 4 Then
Label1.Text = "Kde je ..."
ElseIf ListBox1.SelectedIndex = 5 Then
Label1.Text = "hotel"
ElseIf ListBox1.SelectedIndex = 6 Then
Label1.Text = "restaurace"
ElseIf ListBox1.SelectedIndex = 7 Then
Label1.Text = "nádraží"
ElseIf ListBox1.SelectedIndex = 8 Then
Label1.Text = "telefon"
ElseIf ListBox1.SelectedIndex = 9 Then
Label1.Text = "supermarket"
ElseIf ListBox1.SelectedIndex = 10 Then
Label1.Text = "záchod"
End If
End Sub
Je to standardní větvená podmínka. ListBox má vlastnost SelectedIndex, která obsahuje pořadí vybrané položky (číslované od nuly). Pokud není vybraná žádná položka, má tato vlastnost hodnotu -1.
V naší složené podmínce testujeme, kterému číslu se hodnota této vlastnosti rovná, a podle toho nastavíme text do komponenty Label1.
Rozhodovací struktury
Možná vás napadlo, že tento způsob je občas neefektivní, protože pořád opisujeme ListBox1.SelectedIndex. V některých případech se tomu nevyhneme, například pokud budeme v každém kroku porovnávat složitější výrazy. Ale pro tento jednoduchý příklad, kdy porovnáváme jednu hodnotu proti několika různým, použijeme rozhodovací strukturu Select Case.
Její schéma je následující (jedná se pouze o schéma, neopisujte jej do programu).
Select Case {hodnota}
Case 1
{příkazy}
Case 2
{příkazy}
Case Is > 2
{příkazy}
Case Else
{příkazy}
End Select
Hodnota se porovnává s výrazem za Case. Platí opět pravidlo, že se provede pouze první vyhovující podmínka. Můžeme testovat i nerovnosti, a to přes slovo Is, které je ve třetí větvi. I v tomto případě je část Case Else nepovinná, a spustí se, pokud žádná z výše uvedených podmínek neplatí.
Pokud tedy převedeme naši proceduru na rozhodovací strukturu, rozhodně se nám vše zjednoduší.
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
Select Case ListBox1.SelectedIndex
Case 0
Label1.Text = "Dobrý den, Dobré ráno"
Case 1
Label1.Text = "Dobrý den, Dobré odpoledne"
Case 2
Label1.Text = "Nashledanou"
Case 3
Label1.Text = "Promiňte"
Case 4
Label1.Text = "Kde je ..."
Case 5
Label1.Text = "hotel"
Case 6
Label1.Text = "restaurace"
Case 7
Label1.Text = "nádraží"
Case 8
Label1.Text = "telefon"
Case 9
Label1.Text = "supermarket"
Case 10
Label1.Text = "záchod"
End Select
End Sub
Vidíme, že toto schéma je rozhodně jednodušší a stručnější. Navíc pokud bychom se rozhodli, že budeme používat jinou komponentu, stačí zde změnit ListBox1 na cokoliv jiného jen na jednom místě, v předchozím případu bychom to museli měnit desetkrát. Visual Studio sice umí velmi pěkně nahrazovat výskyty jednoho textu nějakým textem jiným, nicméně i tak je to již komplikovanější než to pohodlně změnit na jednom místě.
Pozor na pořadí
Pokud máme nějaké číslo a potřebujeme něco spustit, pokud je číslo v rozsahu od 10 do 20, něco jiného, pokud je číslo v rozsahu od 20 do 30, něco jiného, pokud je od 30 do 40 atd., musíme dát pozor na správné pořadí podmínek.
Struktura
Select Case vek
Case Is < 10
MsgBox("Užívej si dětství.")
Case Is < 20
MsgBox("Užívej si mládí.")
Case Is < 30
MsgBox("Užívej si začátek produktivního věku.")
Case Is < 40
MsgBox("Užívej si produktivní věk.")
Case Is < 50
MsgBox("Užívej si nejlepší léta života.")
Case Is < 60
MsgBox("Užívej si poslední léta produktivního věku.")
Case Else
MsgBox("Užívej si důchod.")
End Select
je správně a bude fungovat. Stačí si představit, co se stane, pokud bude věk 34 let. První podmínka se nesplní. Druhá taky ne, třetí teky ne, až čtvrtá. A to je správně. Pokud napíšete podobnou strukturu a nebude fungovat, obvykle se vždy splní první podmínka. Musíte si představit nějakou hodnotu a sledovat, co se bude provádět.
To je protentokrát vše. V příštím díle budeme pokračovat a naučíme se cykly, které se používají k opakovanému provádění některých příkazů.