Seriál - 2. díl
Jak psát kód, proměnné a konstanty, datové typy

Dnes si ukážeme, jak psát ve VB kód, jaké typy proměnných a konstant můžete použít a také jak a kde. Nakonec si vysvětlíme jak ve VB pracovat s polem a popíšeme si i životní cyklus proměnných v projektu.

4. Jak a kam psát kód
5. Proměnné a konstanty
    5.1. Proměnné
    5.2. Konstanty
    5.3. Datový typ Variant
    5.4. Uživatelsky definované typy
    5.5. Pole
    5.6. Životnost proměnných
    5.7. Přehled datových typů

4. Jak a kam psát kód

Každá část projektu, jak např. formulář, modul atd. má svůj vlastní kód. Dokonce i všechny standardní prvky (můžete vytvořit prvek, který při použití nemusí dovolit psát zdrojový kód) mají svůj vlastní kód, který je však částí kódu formuláře nebo jiného tzv. kontaineru, na který je prvek umístěn. Jak zobrazit např. kód formuláře, naleznete v minulém, prvním dílu.

Veškeré názvy ve VB nerozlišují malá a velká písmena (nejsou tzv. Case Sensitive). Proto máte-li funkci GetComputerName, můžete ji volat GETCOMPUTERNAME, GetComputerName apod. Vždy voláte stejnou funkci.

VB je řádkově orientovaný programovací jazyk, proto je vhodné (ale ne nutné) psát každý příkaz na nový řádek. Na jeden řádek můžete zapsat více příkazů pokud je oddělíte dvoutečkou. Např:

A = SQR(3)
B = SQR(4)

je stejné jako

A = SQR(3) : B = SQR(4)

Poznámky v kódu se uvozují příkazem REM nebo apostrofem. Řádek s poznámkou může vypadat takto:

REM Toto je poznamka
'Tohle je taky poznamka
lngPokus=4*3 'A odtud uz je to taky poznamka

Zajímavá věc ve VB jsou návěstí. Používají se pro příkazy Goto nebo Gosub, kterým můžete určit návěstí, na které se kód přesune. Nejvíce se používají pro ošetřování chyb. V jiných případech, než u chyb, není vůbec vhodné používání příkazů Goto a Gosub (z důvodů čitelnosti zdrojového kódu), ačkoli je VB obsahuje. Návěstí se zapisuje svým názvem a dvojtečkou:

Dim x As Integer

For x=1 to 100
  Debug.Print x
Next x

moje_navesti: 'Tohle je navesti

Jestliže napíšete řádek a ten VB shledá správným, zformátuje jej do svých vlastních konvencí. Tzn. upraví malá a velká písmena, přidá mezery apod. Jestliže však příkazy na řádku nejsou správně napsány, řádek je zvýrazněn červeně a objeví se chybové hlášení.

Co je na VB příjemné, a Microsoft to již prosazuje i u jiných svých jazyků (např. Visual C++), je technologie nazvaná Intellisence. Tato velice urychluje a zpříjemňuje práci programátorům.

Chcete-li např. volat funkci GetCursorPos, stačí napsat např. Get a stisknout kombinaci SHIFT+MEZERA (SPACE). Pokud takto začíná více funkcí, VB vám nabídne jejich seznam, v opačném případě doplní zbývající text, tedy CursorPos.

Napíšete-li název objektu a tečku (volání metody nebo vlastnosti - viz minulý díl), VB vám nabídne seznam všech metod a vlastností k danému objektu. Stačí si jen vybrat ze seznamu, nemusíte znát nazpaměť všechny metody a vlastnosti.

A nakonec, napíšete-li název funkce, metody apod., VB zobrazí všechny parametry a jejich typy, tzn. nemusíte znát ani přesné parametry každé funkce, stačí znát jen název a k čemu slouží.

Zpět na obsah


5. Proměnné a konstanty

5.1. Proměnné

Ve VB, narozdíl od jiných jazyků, není nutné deklarovat žádnou proměnnou. Jednoduše ji použijete. Např.

a=10

Takovým způsobem je však velice nevhodné programovat, protože VB vůbec netuší, co proměnná bude obsahovat, např. text nebo číslo. Jestli Vám VB dovolí použít proměnnou bez deklarace, můžete nastavit v dialogu Options, pole Require Variable Declaration z menu Tools | Options. Pokud je tato položka zatržena, VB přidá do každé části projektu (formulář, modul atd.), která ještě nemá kód, na začátek příkaz Options Explicit a výše uvedený příklad nepůjde použít bez deklarace proměnné a.

Deklarace proměnných se provádí příkazy Dim, Public nebo Private. Tyto tři příkazy mají úplně stejnou syntaxi. Chcete-li pomocí nich nadeklarovat proměnnou, můžete to udělat dvěma způsoby:

Dim lPocet As Long
Dim lPocet&

První příkaz vytvoří proměnnou lPocet typu Long. Druhý příkaz vytvoří proměnnou lPocet& také typu Long. Ve VB totiž můžete buď pomocí As "Typ" říci typ slovem, nebo za jméno přidat znak (tzv. suffix), reprezentující typ. Pro Long je to &.

DIM

Příkaz DIM se používá na deklaraci lokálních proměnných v proceduře nebo funkci, nebo k deklaraci lokálních proměnných na úrovni formuláře, modulu nebo třídy.

Nebudeme uvádět přesnou syntaxi příkazu, tu si můžete zjistit z nápovědy. Deklarace pomocí příkazu Dim se provádí takto:

Dim A As Integer
Dim B%

PRIVATE

PRIVATE se používá na deklaraci lokálních proměnných na úrovni formuláře, modulu nebo třídy. Zapisuje se v deklarační části (to je kdekoliv mimo procedur a funkcí, většinou na začátku). Takto proměnná, vytvořená např. ve formuláři je známá na celém jeho "území", tzn. kdekoliv ve formuláři ji můžete použít, ale už nelze použít v jiném formuláři.

PUBLIC

Public (dříve Global - dnes pouze pro zachování kompatibility) lze použít také pouze v deklarační části formuláře, modulu nebo třídy, ale narozdíl od deklarace pomocí Private je tato proměnná známa v celém projektu.

Několik příkladů na deklaraci proměnných:

Option Explicit

Private lngPocet As Long
Private intDelka As Integer

Public strCesta As String

Private Sub Form_Load() 'Procedura Form_Load
  Dim a As Long, b As Integer
  Dim pocet As Integer

  a = 3 : b = 10
  pocet = a*18
End Sub

Zpět na obsah


5.2. Konstanty

Konstanty, narozdíl od proměnných, nezabírají žádné místo v paměti. Při kompilaci programu se totiž každý výskyt identifikátoru konstanty nahradí její hodnotou. Např.

Const A=4

x=A

Při kompilaci je A nahrazeno hodnotou 4. Řádek potom vypadá takto:

x=4

Práce s konstantami je velice podobná práci s proměnnými. Nelze je však použít na levé straně přiřazovacího příkazu, z čehož vyplývá, že jejich hodnotu nelze měnit (vyjímkou je samozřejmě deklarace).

Deklarují se pomocí klíčového slova Const. Stejně jako u proměnných lze mimo procedury a funkce použít klíčových slov Private a Public a také můžete definovat jejich typ. Co je velmi výhodné pro čitelnost kódu, je psaní identifikátorů konstant velkými písmeny.

Const CVELIKOST=150 'Stejný význam jako Private
Private Const CDELKA=500
Public Const PCKLIC="Software\Aplikace\1.0"
Public Const CMAX As Long=111

Pokud to jde, používejte místo přímého napsání hodnoty raději konstanty. Nejen že se kód velice zpřehlední, ale usnadníte si i práci při změně často používané hodnoty.

Zpět na obsah


5.3. Datový typ Variant

Pokud u proměnné neuvedete typ, je automaticky použit Variant. Variant je obecný datový typ. Může obsahovat jakýkoliv datový typ, včetně strukturovaných a objektových. Dokonce jde tak daleko, že pokud máte pole "Variantů", každý prvek může obsahovat hodnotu jiného typu.

Proměnná tohoto typu může dynamicky měnit svůj datový typ.

Dim X As Variant

X=4
X="Jirka"
Set X=Form1

V případě, že proměnné typu Variant dosud nebyla přiřazena hodnota, má hodnotu Empty. Pokud obsahuje hodnotu numerického typu, je tato hodnota totožná s 0, v případě znakového typu je totožná s prázdným řetězcem. Výskyt lze testovat pomocí funkce IsEmpty()

Variant může také nabývat hodnoty Null. A to v tom případě, že mu Null bylo přímo přiřazeno, nebo obsahuje výraz, jehož hodnota je Null (tento případ je většinou v případě, že pracujete s objekty). Testovat lze pomocí IsNull().

I když je Variant velice flexibilní typ, není dobré jej používat všude. Nejlépe je ovšem nepoužívat jej vůbec, nebo jen v případech, kdy není jiného východiska. Práce s ním je totiž velice pomalá a zabírá mnoho místa v paměti.

Zpět na obsah


5.4. Uživatelsky definované typy

Pokud vám nebude stačit žádný datový typ Visual Basicu, můžete si vytvořit svůj vlastní. Ten se vždy skládá z již definovaných a vytváří jakousi strukturu. Deklaruje se pomocí klíčového slova Type (je vhodné před název typu dát písmeno T jako Typ).

Type TClovek
  jmeno As String * 20
  prijmeni As String * 20
  vek As Byte
  funkce As String
End Type

Proměnná tohoto typu se deklaruje stejně jako jiné proměnné.

Dim zamestnanec As TClovek

Tato proměnná se potom používá podobně jako objektové proměnné.

zamestnanec.jmeno="Jiri"
zamestnanec.prijmeni="Novák"

Samozřejmně, že typ ve struktuře může být také uživatelský.

Type TAdresa
  ulice As String
  mesto As String
  psc As String * 5
End Type

Type TClovek
  jmeno As String
  prijmeni As String
  adresa As TAdresa
End Type

Použití vypadá následovně

Dim zamestnanec As TClovek

zamestnanec.jmeno="Petr"
zamestnanec.adresa.ulice="Náměstí SNP"

Zpět na obsah


5.5. Pole

Pole je skupina proměnných se stejným názvem a datovým typem. Odlišeny jsou pouze indexy. Pole ve VB mohou být dynamická nebo statická.

Statická pole

U statických polí je rozsah dán již při deklaraci a nelze jej měnit.

Dim jmena(10) As String
Dim vek(1 To 10) As Long

Pole jmena bude mít 11 prvků typu String, pole prijmeni bude mít 10 prvků typu Long. Pokud zadáte pouze jedno číslo, bude pole začínat indexem 0 bude mít n+1 prvků (n je uvedené číslo). Ve druhém případě je rozsah stanoven prvním a posledním indexem. K jednotlivým prvkům pole se přistupuje takto:

jmena(0)="Petr"
jmena(1)="Jiri"
vek(5)=34

Dynamická pole

U dynamických polí není při deklaraci zadán rozsah. Ten se určuje až příkazem ReDim. Pomocí tohoto příkazu můžete kdykoliv měnit rozsah pole.

Dim jmena() As String

ReDim jmena(15) 'vytvoří pole s indexy 0 až 15.

Při změně rozsahu pole se vynulují všechny jeho prvky. Chcete-li zachovat původní hodnoty u indexů, které budou stále zachovány, použijte příkaz ReDim Preserve (měnit je možno pouze horní index).

Dim jmena() As String

ReDim jmena(5)
jmena(0)="Mirek"
jmena(1)="Otakar"

ReDim jmena(10) 'jmena(0) a jmena(1) obsahují prázdný řetězec
jmena(0)="Mirek"
jmena(1)="Otakar"
jmena(8)="Hugo"

ReDim Preserve jmena(5) 'jmena(0) a jmena(1) zůstanou zachována

V případě, že chcete používat vícerozměrná pole, indexy se oddělují čárkami.

Dim X(1 To 5, 1 To 10) As Long

X(1,2)=15645

U statických i dynamických polí můžete zjistit dolní a horní index funkcemi LBound a UBound. Jako parametr těchto funkcí se zadává název pole.

Zpět na obsah


5.6. Životnost proměnných

Proměnná je známá tam, kde je deklarovaná. Je-li deklarovaná ve funkci nebo proceduře, zaniká při jejím ukončení a uvolňuje zabranou paměť. Je-li deklarovaná na úrovni formuláře (je lokální na úrovni formuláře), zaniká při odehrání formuláře z paměti.

Proměnná v modulu, deklarovaná pomocí klíčového slova Public, je známá po celou dobu běhu programu. Nadeklarujeme-li však v nějaké funkci proměnnou stejného jména, má tato přednost před tou v modulu.

Zvláštní případ jsou proměnné, deklarované klíčovým slovem Static (na začátku jsme jej záměrně vynechali). Takto deklarovaná proměnná, např. ve funkci, je známá pouze v ní, ale při opětovném spuštění této funkce si zachovává původní hodnotu.

Public Sub ukaz()
  Static X As Long
  Dim Y As Long

  X=X+1: Y=Y+1
  Print X,Y 'Vypíše na obrazovku hodnotu X a Y
End Sub

'Zavoláme dvakrát proceduru ukaz
ukaz 'vypíše "1 1"
ukaz 'vypíše "2 1"

Zpět na obsah


5.7. Přehled datových typů

Datové typy ve VB si můžeme rozdělit na několik skupin a to číselné, znakové, uživatelsky definované a "speciální" (nenapadl nás rozumný název).

Číselné datové typy

Datový typ       Velikost        Rozsah
Byte 1 bajt 0 až 255
Boolean 2 bajty True nebo False (-1 nebo 0)
Ve VB, narozdíl od jiných jazyků, je hodnota True rovna -1, místo 1. False je stejné jako jinde rovno 0.
Integer          2 bajty         -32768 až 32767
Long 4 bajty -2147483648 až 2147483647
Single 4 bajty -3.402823E38 až -1.401298E-45 pro záporné hodnoty 1.401298E-45 až 3.402823E38 pro kladné hodnoty
Double 8 bajtů -1.79769313486231E308 až -4.94065645841247E-324 pro záporné hodnoty 4.94065645841247E-324 to 1.79769313486232E308 pro kladné hodnoty
Currency 8 bajtů -922,337,203,685,477.5808 až 922,337,203,685,477.5807

Řetězcové datové typy

Datový typ       Velikost        Rozsah
String 10 bajtů + 0 až 2 miliardy znaků délka řetězce
String Délka řetězce 1 až 65400 znaků

Teď se možná divíte, co že jsme si to na Vás vymysleli. První String totiž znamená řetězec proměnné délky, druhý pevné délky. Lépe pomůže malý příklad:

Dim strPoznamka As String
Dim strJmeno As String * 20

Na prvním řádku je deklarace řetězce proměnné délky. Tento zabírá v každém případě minimálně 10 bajtů, naplníte-li jej textem, zabírá 10 + počet znaků bajtů.

Druhý řádek deklaruje řetězec pevné délky. Tento řetězec již v tuto chvíli zabírá v paměti 20 bajtů (záleží na délce) a i když jej naplníte více než dvaceti znaky, nebude si je pamatovat.

Ostatní datové typy

Datový typ        Velikost       Rozsah
Date 8 bajtů 1. ledna 100 až 31. prosince 9999 obsahuje i čas
Variant 16 bajtů Jakákoliv číselná hodnota do možností typu Double
Variant 22 bajtů Stejná délka jako string proměnné délky +délka řetězce
Object 4 bajty Jakýkoliv odkaz na objekt Tento typ si probereme až v nběkterém z příštích dílů
Pole (Array) vyžaduje 20 bajtů paměti + 4 bajty pro každou dimenzi + počet bajtů vyžadovaných samotným datovým typem * počet prvků v poli

Zpět na obsah