Po nastudování minulého dílu byste měli být schopni zodpovědět, co je to komponenta, co je to vlastnost, co je to událost a co je to procedura. Pokud to velmi stručně shrnu, komponenty jsou běžné ovládací prvky aplikace (tlačítko, textové pole, popisek, obrázek atd.), každá tato komponenta má vlastnosti (pomocí nich upravujeme a měníme vzhled a chování komponenty) a události (které nastanou při nějaké akci uživatele nebo počítače, např. stisknutí klávesy, kliknutí atd.), na které můžeme reagovat spuštěním nějaké procedury, což je sada nějakých příkazů.
V minulém dílu jsme se dostali k příkazu, nebo lépe řečeno funkci, MsgBox, která zobrazila hlášku s textem a tlačítkem OK. Nyní si něco řekneme o proměnných a datových typech.
Proměnné a datové typy
Pokud chceme pracovat s nějakými hodnotami a daty, budeme potřebovat proměnné. Proměnná je jakési místo v paměti, které si nějak pojmenujeme a do kterého můžeme ukládat informace nebo je z něj číst. Proměnnou si můžeme představit jako takovou schránku, do které si můžeme vložit nějaká data, abychom je mohli později použít. Vše uvedu na tomto zdrojovém kódu a vysvětlíme si, co se na každém řádku děje. Zatím nic nikam nekopírujte, toto je pouze příklad:
Dim mojePromenna As Integer
mojePromenna = 36
MsgBox(mojePromenna)
První řádek vytvoří proměnnou, která se bude jmenovat mojePromenna a bude mít datový typ Integer. Datový typ určuje, jakým způsobem se data do paměti uloží a hlavně kolik místa budou potřebovat. Integer znamená celé číslo (v paměti zabere 32 bitů, tedy 4 bajty). Vytvořili jsme si tedy v paměti místo o velikosti 4 bajtů pro uložení celého čísla a toto "místo" se jmenuje mojePromenna. Názvy proměnných mohou obsahovat písmena anglické abecedy, čísla a podtržítko, jejich název ale nesmí začínat číslem. Teoreticky sice lze používat i písmena s háčky a čárkami, ale důrazně doporučuji je nepoužívat. V praxi bývá zvykem pojmenovávat proměnné anglicky, ale abych vás nemátl, budu je pojmenovávat česky a bez háčků a čárek.
Druhý řádek do naší proměnné uloží (říkáme také přiřadí) hodnotu 36. A na třetím řádku zobrazíme okno se zprávou, ve kterém se zobrazí hodnota proměnné mojePromenna, čili číslo 36.
Všimněte si, že v mojePromenna není v uvozovkách. Kdyby byla, zobrazil by se text mojePromenna. To je velmi důležité. Pokud použijeme uvozovky, to, co je uvnitř, je jen textová hodnota, není to žádný kus programu. Je vidět na tomto příkadu:
Dim mojePromenna2 As String
mojePromenna2 = "ahoj"
MsgBox(mojePromenna2)
Tento příklad je podobný, akorát používáme datový typ String, který říká, že do proměnné budeme ukládat text. Na druhém řádku přiřadíme do proměnné slovo ahoj. Musíme je ale také zapsat do úvozovek, aby bylo Visual Basicem pochopeno jako text. Bez úvozovek by ahoj bylo chápáno jako proměnná.
Datové typy nemůžeme jen tak míchat – obecně neplatí, že do proměnné jednoho typu můžeme přiřadit hodnotu jiného datového typu. Pokud někam napíšeme text v uvozovkách, jedná se automaticky o hodnotu typu String. Pokud někam napíšeme číslo bez uvozovek, je to typicky hodnota typu Integer (jsou tam trochu složitější pravidla, ale to teď nechme stranou).
Kontrolní otázka – jakého typu bude hodnota, kterou v kódu zapíšu jako “13” (i s uvozovkami)? Samozřejmě String. Je to něco v uvozovkách a ne samostatně stojící číslo.
U běžných typů jako je String a Integer platí výjimky – hodnotu typu Integer můžeme přiřadit do proměnné typu String a kompilátor ji zkonvertuje (String je v paměti uložen jinak než Integer, String je uchováván po znacích, kdežto Integer se ukládá jako číslo ve dvojkové soustavě). Ale pro libovolné dva typy to rozhodně neplatí, protože u nich nemusí být konverze známá anebo to vůbec nemusí dávat smysl. Obecně platí, že Visual Basic (bohužel) leccos skousne a povolí.
Nicméně vždy musíte mít na paměti, s jakým datovým typem pracujete, a uvědomovat si, že když přiřadíte typ Integer do typu String, musí se provádět nějaká konverze, i když ji tam nenapíšete.
Nejběžnější datové typy
Dva nejběžnější datové typy jsme si již ukázali. String je pro texty a Integer je pro celá čísla. Základních datových typů pro začátečníky je pět, jsou zobrazeny v této tabulce:
Datový typ |
Použití |
Rozsah |
Konverzní funkce |
String |
textové hodnoty |
max. 231 znaků |
CStr(hodnota) nebo hodnota.ToString() |
Integer |
celá čísla |
-231 až +231 |
CInt(hodnota) |
Boolean |
logická hodnota |
True (pravda, ano) nebo False (nepravda, ne) |
CBool(hodnota) |
Double |
desetinná čísla |
čím větší číslo, tím menší přesnost; asi 15 platných číslic |
CDbl(hodnota) |
Byte |
malé celé číslo |
0-255 |
CByte(hodnota) |
Pro ty z vás, co ještě neměli v matematice mocniny, 231 se čte “dvě na třicátou první” a je to jako když vedle sebe napíšete 31 dvojek a všechny je mezi sebou vynásobíte. Dohromady je to něco přes 2 miliardy.
Ptáte se, proč zrovna 31? Je to o 1 méně než 32. 32 je v počítačovém světě (stejně jako ostatní mocniny dvojky, tj. 1, 2, 4, 8, 16, 32 atd.) velmi důležité číslo. Procesory dnešních počítačů jsou 32 nebo 64-bitové, což znamená, že dokážou pracovat s 232 resp. 264 bajty paměti. To první jsou 4GB, což dnes má kdekdo, to druhé je strašně mega moc.
Konverzní funkce je funkce, která umí hodnotu základního typu překonvertovat na hodnotu nějakého konkrétního typu, pokud to má smysl.
Například Dim a As Integer = CInt(1.67) přiřadí do proměnné a číslo 1. Hodnotu typu Double, tedy desetinné číslo, převedeme na Integer, což vyvolá zaokrouhlení dolů. Pokud bychom chtěli zaokrouhlit “správně”, museli bychom použít jinou funkci.
Jinak pochopitelně pokud do kódu napíšeme desetinné číslo (používáme desetinnou tečku, ne desetinnou čárku!), je to automaticky hodnota typu Double.
Jak s proměnnými pracujeme?
Vytváření proměnných jsme již viděli v příkladu, zde jsou způsoby, jak to provést.
Dim a As Integer
Dim b As Integer = 6
První způsob pouze vytvoří proměnnou (rezervuje pro ni místo v paměti, tomuto procesu se říká alokace) určitého datového typu, druhý způsob navíc do této proměnné ihned uloží danou hodnotu, v našem případě číslo 6.
a = 132
b = 6 + 142 - a
První řádek do proměnné a přiřadí číslo 132. Druhý řádek je o něco zajímavější. Jako hodnotu jsme předali matematický výraz, ve kterém navíc figuruje proměnná. Nemusíme se toho ale bát, Visual Basic sám výraz vypočítá a za proměnnou a dosadí její hodnotu, kterou již zná. Výsledek tohoto výrazu pak uloží do proměnné b. Výrazy můžeme používat téměř všude a Visual Basic je nejprve vyhodnotí a pracuje až s výsledkem.
MsgBox(5 + 18 - a)
MsgBox("5 + 18 - a")
Na příkladu máme dva řádky. Na prvním z nich hodnota není v úvozovkách, takže se to pochopí jako výraz - nejprve se spočítá a zobrazí až výsledek. Kdežto na druhém řádku není žádný složený výraz, je to pouze textová hodnota, která se normálně zobrazí. Objeví se tedy text 5 + 18 - a.
Obor platnosti
Při deklaraci proměnných záleží na tom, kde proměnnou deklarujeme. Obecně se řiďte pravidlem “proměnnou deklarujeme tam, kde ji potřebujeme, a až ve chvíli, kdy ji potřebujeme”.
Pokud proměnnou potřebujeme jen uvnitř nějaké procedury, deklarujeme ji tam, klidně někde v půlce. Takové proměnné se říká lokální proměnná, přičemž tato proměnná se vytvoří pokaždé, kdy je procedura zavolána, a zruší pokaždé, kdy se provádění procedury dokončí (provedou se všechny příkazy uvnitř). Pokud do proměnné něco uložíme, při příštím volání procedury to tam již nebude!
Druhá možnost je deklarovat proměnnou mimo proceduru, tj. typicky za řádkem Class Form1 v příkladu v minulém díle. Taková proměnná se vytvoří při zakládání instance třídy (tj. při vytvoření okna) a zruší se při ukončení života třídy (v našem případě po zavření okna). O tom, co je to třída, bude řeč mnohem později, teď je pro nás důležité, že proměnná existuje po celou dobu, co existuje okno. Můžeme ji samozřejmě používat z procedur.
Aritmetické operátory
Jak jsme se již dočetli výše, Visual Basic umí počítat a vyhodnocovat tzv. výrazy. Pokud jsou to výrazy s čísly, používáme v nich tzv. aritmetické operátory, česky bychom řekli znaménka. V této tabulce jsou operátory, které můžeme používat. Zápis některých znamének je v programování jiný než v běžném životě.
Operátor |
Operace |
Příklady |
+ |
sčítání |
5 + 6 = 11 |
- |
odčítání |
11 - 6 = 5 |
* |
násobení |
5 * 6 = 30 |
/ |
dělení |
11 / 3 = 3.666666666667 |
\ |
celočíselné dělení |
11 \ 3 = 3 |
Mod |
zbytek po dělení |
11 Mod 3 = 2 |
První čtyři operace jsou jasné, zastavíme se až u posledních dvou. Kdysi na základní škole jste se asi učili tzv. dělení se zbytkem. Vypadalo to asi takhle: 11 : 3 = 3 (zbytek 2)
A přesně toto dělají operátory \ a Mod. 11 \ 3 je celá část (tj. 3) a 11 Mod 3 je zbytek (tj. 2). Tyto operace se musí provádět zvlášť.
Operátory samozřejmě můžeme používat s čísly i s proměnnými, můžeme používat i závorky ve výrazech, ovšem jen kulaté! Nemusíme se bát ani výrazů (((2 + 3) * 4) + 5), musíme ale dát pozor, abychom nám závorky seděly a nebyla tam nějaká navíc anebo jiná nechyběla.
Operátor slučování textů
Operátory nejsou jen aritmetické, máme i operátor pro práci s textem. Operátor & slučuje texty, tedy hodnoty typu String (může slučovat i text s číslem nebo naopak).
Takže "ahoj" & "ahoj" dá dohromady "ahojahoj". Uvozovky používáme, protože jsou to texty.
Dim t As String = "chleba"
MsgBox(t & " s máslem")
Tento program zobrazí text chleba s máslem, texty se prostě připojí jeden za druhý.
Jednoduchá kalkulačka
Na závěr tohoto dílu si ukážeme velmi jednoduchou kalkulačku. Spusťte si Visual Basic a vytvořte si nový projekt Windows Forms Application. Na formulář přidejte 2 textová pole (TextBox) vedle sebe, 4 tlačítka (Button) pod nimi a úplně dole ještě jedno textové pole (TextBox), kterému nastavte vlastnost ReadOnly na True, aby do něj uživatelé nemohli psát. Nastavte také hodnoty vlastností tlačítkům Text, aby formulář vypadal jako na obrázku:
Nezapomeňte, že když vytvoříte první komponentu TextBox, dostane jméno TextBox1, další bude TextBox2 a tak to pokračuje dále. Na obrázku jsou napsány názvy těchto komponent, je nutné, abyste zachovali jejich pořadí. Pokud omylem vytvoříte komponentu špatně, můžete jí změnit vlastnost Name. Musíte ale dát pozor, abyste nepojmenovali dvě komponenty stejně, objevila by se chybová hláška.
Program se bude ovládat tak, že do horních dvou textových polí zapíšete dvě čísla a kliknete na tlačítko s operací, kterou chcete provést. Ve spodním poli se ukáže výsledek.
Sčítání
Pokud již máte na formuláři všechny komponenty, dvakrát klikněte na tlačítko Sečíst. Otevře se nám okno kódu, do kterého zapíšeme, co se stane, když klikneme na dané tlačítko. Komponenty TextBox1 a TextBox2 budou obsahovat čísla, která budeme chtít sečíst. Tyto komponenty mají také vlastnost Text, která obsahuje jejich hodnotu. Tato hodnota je ale datového typu String, což je problém, protože nemůžeme počítat s texty. To ale vyřešíme snadno. V tabulce s datovými typy jsem uvedl konverzní funkci, která umí na daný typ převést. Pro Integer je to funkce CInt a za ni se do závorky uvede to, co převádíme na číslo.
Visual Basic totiž sám nepozná, jestli je v komponentě TextBox text, nebo číslo. Protože do TextBoxu se dá napsat i text, jeho vlastnost Text je typu String, ať už v ní je cokoliv.
Hodnotu z textového pole tedy musíme na typ Integer převést ručně, a proto si vytvoříme dvě proměnné a a b, do kterých si uložíme již převedené hodnoty. Nakonec tyto hodnoty sečteme a uložíme do proměnné c a tuto hodnotu přiřadíme do vlastnosti Text komponenty TextBox3.
Pokud chceme přistupovat k vlastnostem komponent v programovém kódu za běhu, napíšeme název komponenty, za ní tečku a hned za ní název vlastnosti. Vlastnosti komponent se chovají úplně stejně jako proměnné, mají taky své datové typy. Teď již víme vše, co potřebujeme.
Dim a As Integer = CInt(TextBox1.Text)
Dim b As Integer = CInt(TextBox2.Text)
Dim c As Integer = a + b
TextBox3.Text = CStr(c)
První řádek tedy vezme hodnotu Text v komponentě TextBox1 (co uživatel napsal do prvního políčka), převede jí pomocí funkce CInt na datový typ Integer a přiřadí ji do proměnné a.
Druhý řádek vezme hodnotu z druhého textového pole, opět ji převede a přiřadí do nové proměnné b.
Třetí řádek do proměnné c přiřadí součet proměnných a a b. Čtvrtý řádek tento součet převede na typ String a uloží jej do třetího textového pole, do vlastnosti Text.
Takto funguje sčítání. Sami si jistě budete schopni udělat odčítání, násobení a dělení. Stačí se vrátit do formuláře pomocí záložek nahoře, dvakrát klepnout na další tlačítka a zapsat proceduru. Bude velice podobná, takže ji můžete přes schránku zkopírovat a vložit, stačí pak změnit jenom znaménko, aby se provedla správná operace.
Aby u dělení fungovala desetinná čísla, zkuste kalkulačku změnit tak, aby v ní nebyl všude typ Integer, ale Double. U dělení by to ještě chtělo ošetřit dělení nulou a vynadat uživateli, že dělit nulou se rozumně nedá, ale to zatím neumíme, o tom až příště.
Pokud použijete typ Integer a budete zkoušet dělit nulou, program spadne a musíte jej ukončit kliknutím na tlačítko modrého čtverečku v panelu (Stop). Tím se program natvrdo ukončí. Pokud při dělení nulou budete mít datový typ Double, nic se nestane a v textovém poli výsledku se objeví hodnota +nekonečno nebo –nekonečno (případně bude přeložená v jiném jazyce). Typ Double totiž podporuje i tyto speciální hodnoty.
To je pro tentok díl všechno. Doufám, že vás proměnné moc neotrávily a že se vám programování nepřestalo líbit.
A jako domácí úkol můžete zkusit vzít program z minulého dílu, kromě tlačítka na formulář přidat ještě textové pole. Při kliknutí na tlačítko se uvnitř zprávy zobrazí to, co tam je, a za tím ještě text, který uživatel zadal do textového pole.