Lekce 2 - Jednoduchá kalkulačka v VB.NET Windows Forms
V minulém dílu seriálu, Úvod do Windows Forms aplikací v VB.NET, jsme si uvedli technologii Windows Forms a vytvořili okno s textovým popiskem.
V dnešním dílu se podíváme na události a vytvoříme jednoduchou kalkulačku. Bude vypadat takto:

Příprava formuláře
Založte si nový Windows Forms projekt s názvem Kalkulacka. Formulář přejmenujeme na KalkulackaForm. U aplikací se většinou začíná právě návrhem formuláře. Z Toolboxu na něj natáhneme několik kontrolek. Budeme potřebovat:
- 2x Label
- 1x Button
- 2x NumericUpDown
- 1x ComboBox
Label
Label již známe, jedná se jednoduše o textový popisek.
Pokud kontrolky nepoužíváme z kódu, nemusíme je pojmenovávat. Pokud ano, měli bychom jim nastavit vlastnost Name (v oknu Properties je název vlastnosti v závorce (Name)) a přes toto jméno ke kontrolce poté z kódu přistoupíme. Doporučuji si přepnout zobrazení vlastností z kategorizovaného na abecední (první 2 ikonky v Properties oknu), vlastnosti najdete rychleji. Name je tedy jméno objektu, Text je to, co je na objektu napsáno. Z toho logicky vyplývá, že na formuláři můžeme mít více kontrolek se stejným textem, ale jen jednu s určitým jménem.
Jeden label bude sloužit jen jako popisek s textem "=", nastavte mu ho. Druhý Label bude sloužit pro výpis výsledku a jelikož do něj budeme programově vkládat hodnotu, nastavíme jeho vlastnost Name na vysledekLabel. Text nastavíme na hodnotu "0". Font výsledku můžeme zvětšit na velikost 10.
Button
Button je jednoduše tlačítko, které v případě stisku zavolá nějakou metodu (přesněji vyvolá událost). V našem případě se bude tlačítko jmenovat vypocitejButton a jeho Text bude nastaven na "Vypočítej". Událost tlačítku přiřadíme později.
NumericUpDown
NumericUpDown je první kontrolka k zadávání hodnoty, kterou si uvedeme. Ve výchozím nastavení do ní můžeme zadat jen celé číslo. Toto chování lze změnit nastavením vlastnosti DecimalPlaces, která udává počet desetinných míst. Tuto hodnotu nastavme na 2 oběma kontrolkám. Také nastavíme vlastnosti Minimum a Maximum, v našem případě minimum na nějakou nízkou hodnotu a maximum na nějakou vysokou, např. -1000000 a 1000000. Pokud bychom chtěli využít maximální hodnoty daného datového typu, musíme limity nastavit v kódu formuláře pomocí vlastnosti MaxValue a MinValue na daném datovém typu.
Výhodou zadávání čísel touto kontrolkou je, že uživatel nemůže zadat nesmyslnou hodnotu. Pokud bychom číslo parsovali z TextBoxu (který si ukážeme v dalších dílech), mohla by naše aplikace při nevalidním vstupu spadnout. Je vždy jednodušší vybrat správnou kontrolku než ošetřovat uživatelský vstup.
Kontrolky pojmenujeme jako cislo1NumericUpDown a cislo2NumericUpDown. Všimněte si, že jméno by mělo vždy obsahovat i typ kontrolky. Můžeme tak mít např. vekLabel a vekNumericUpDown, kdy label je popisek pole k zadání věku a numericUpDown je potom toto pole. Navíc se v kódu potom lépe orientuje. Někdy se používá i cisloNmr, vypocitejBtn a podobně.
ComboBox
Jsme skoro v cíli. ComboBox je vyjížděcí seznam s několika předdefinovanými prvky. Prvky můžeme buď naklikat v návrháři nebo vložit z kódu a to i za běhu programu. Toto platí pro všechny komponenty, všechny vlastnosti z návrháře můžeme nastavovat i z kódu. Některé pokročilé vlastnosti jdou však nastavit jen z kódu a v návrháři nejsou.
Kontrolku pojmenujeme operaceComboBox a u vlastnosti Items klikneme na tlačítko "...". Do nově otevřeného okna vypíšeme možnosti, které v comboBoxu půjdou vybrat. Každou možnost zapíšeme na samostatný řádek, v našem případě to budou hodnoty "+", "-", "*", "/".

Pozn.: Položkami nemusí být jen textové řetězce, ale i objekty. Ukážeme si to později.
Vybranou položku lze bohužel nastavit jen z kódu.
Nastavené kontrolky uspořádáme na formulář tak, jak bylo uvedeno na začátku článku.
Kód formuláře
Přesuneme se do zdrojového kódu formuláře. Již víme, že to uděláme zkratkou CTRL + ALT + 0 nebo pravým myšítkem na formulář a View Code.
Vytvořte si konstruktor, Visual Studio Vám do něj ihned vloží volání metody InitializeComponent(), v konstruktoru nastavíme vybranou položku pro operaceComboBox. Uděláme to nastavením vlastnosti SelectedIndex na 0, tedy první položku:
Public Sub New() InitializeComponent() operaceComboBox.SelectedIndex = 0 End Sub
Z formuláře máme samozřejmě přístup ke všem jeho kontrolkám.
Do konstruktoru vkládáme ten kód, který se má vykonat po vytvoření formuláře, ale to je snad jasné. Když aplikaci spustíte, bude vybrané sčítání:

Obsluha událostí
Zbývá nám tedy již jen reagovat na událost kliknutí tlačítka. Přesuneme se z kódu zpět na formulář a na tlačítko 2x klikneme. V kódu nám přibyla nová metoda:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click End Sub
Všimněte si klíčového slova Handles, to určuje co vše metoda obsluhuje. Pokud by měla metoda obsluhovat více kontrolek, oddělte je čárkou. Např:
Sub ZpracujData() Handles btnWork.Click, tmrAutoSave.Tick End Sub
Vraťme se ještě do designeru (klávesa Shift + F7) a označme tlačítko. V oknu properties můžeme přepínat mezi Vlastnostmi a Událostmi a to pomocí níže zvýrazněných tlačítek:

Vidíme zde naší událost Click, kterou odsud můžeme odstranit a případně znovu přidat. Některé kontrolky mají speciální události, pro které vygenerujeme metody právě odtud.
Nikdy neodstraňujte události tak, že vymažete obslužnou metodu z kódu, designer by přestal fungovat a museli byste jeho soubor opravit (konkrétně odstranit přiřazení neexistující metody do události). Správně je to jedině přes designer.
Výpočet
Přejděme k samotnému výpočtu. Kód nebude nijak složitý, jednoduše v obslužné metodě tlačítka naselectujeme vybrané položky operaceComboBoxu a podle toho vypočítáme výsledek. Ten poté nastavíme jako text vysledekLabel. Neměli bychom zapomenout ošetřit dělení nulou.
Kód obslužné metody by mohl vypadat takto:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim cislo1 = cislo1NumericUpDown.Value Dim cislo2 = cislo2NumericUpDown.Value Dim vysledek As Double Select Case operaceComboBox.SelectedIndex Case 0 vysledek = cislo1 + cislo2 Case 1 vysledek = cislo1 - cislo2 Case 2 vysledek = cislo1 * cislo2 Case 3 If cislo2 = 0 Then MsgBox("Dělit nulou nelze") vysledek = 0 Exit Select End If vysledek = cislo1 / cislo2 End Select vysledekLabel.Text = vysledek End Sub
Nejprve si uložíme hodnoty z kontrolek do proměnných, je to tak přehlednější. K vybrané položce comboBoxu se dostaneme přes SelectedIndex, který je typu integer a udává pořadí vybrané položky. Stejně tak bychom mohli pracovat i s pouhým textem položky přes SelectedItem.
V případě nulového dělitele zobrazujeme uživateli MsgBox pomocí stejnojmenné metody. Nakonec do vysledekLabel vypíšeme výsledek.
Formuláři ještě můžeme nastavit Ikonu přes vlastnost Icon (vybereme soubor s ikonkou), text nastavíme na "Kalkulačka" a StartPosition na CenterScreen. Formulář se tak vytvoří uprostřed obrazovky. Pokud nastavíme FormBorderStyle na hodnotu FixedSingle, nepůjde formulář roztahovat, což se pro naší aplikaci hodí. Stejně tak můžeme zakázat maximalizaci okna pomocí vlastnosti MaximizeBox.
Kód je jako vždy v příloze.
Příště, Upomínač narozenin v VB.NET - Návrh formulářů, si vytvoříme složitější aplikaci s více formuláři, bude se jednat o připomínač narozenin.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 293x (136.48 kB)
Aplikace je včetně zdrojových kódů v jazyce VB