Chcete se seznámit se světem programování? Máte zájem poznat tvorbu kancelářských programů? Předkládáme Vám učebnici Visual Basicu 6.0., která vám to umožní. Po velmi krátké době se naučíte standardní programové úkony, jako jsou práce s textovými řetězci, čtení obsahu souboru z disku nebo přístup k datům. Jste začátečník? Potom potřebujete získat podrobné vědomosti o jazyce SQL, umět definovat DSN a používat přístup do databáze přes RDO. I toto vše dokážete pomocí naší učebnice poměrně snadno a rychle. Hned v první lekci autor popisuje vývojové prostředí a základní filosofii programování. Další kapitoly se věnují nejpoužívanějším ovládacím prvkům a jejich využití při programování. Zvláštní pozornost je určena přístupu do databáze a používání databázových dat. Následující části se zabývají ošetřením chyb, laděním kódu a hlavně možnostmi, které Visual Basic nabízí pro vytvoření „user friendly“ uživatelského rozhraní. Celá kniha končí popisem vybraných klíčových slov jazyka. Každá lekce obsahuje ilustrativní příklady, kontrolní otázky a úkoly, na kterých si prověříte i procvičíte právě získané znalosti. Vlastně už docela solidní programátorské dovednosti!
Vydalo vydavatelství a nakladatelství Computer Press® Hornocholupická 22, 143 00 Praha 4, http://www.cpress.cz Distribuce: Computer Press Brno, náměstí 28. dubna 48, 635 00 Brno-Bystrc, tel. (05) 46 12 21 11, fax: (05) 46 12 21 12, e-mail:
[email protected] Computer Press Bratislava, Hattalova 12 831 03 Bratislava, SR, tel.: +421 (7) 44 45 20 48, 44 25 17 20, fax: +421 (7) 44 45 20 46, e-mail:
[email protected] Publikaci lze objednat také na adrese http://www.vltava.cz
ISBN 80-7226-312-9 ProdejnÌ kÛd: K0350
9 788072 263127 DoporuËen· cena 127 KË 183 Sk
David Morkes
Učebnice Visual Basicu 6.0
Computer Press Praha 2000
Učebnice Visual Basicu 6.0 David Morkes Copyright © Computer Press® 2000. Vydání první. Všechna práva vyhrazena. Vydavatelství a nakladatelství Computer Press®, Hornocholupická 22, 143 00 Praha 4, http://www.cpress.cz ISBN 80−7226−312−9 Prodejní kód: K0350 Jazyková korektura: Ladislav Valík Vnitřní úprava: Jiří Matoušek Sazba: Jiří Matoušek Rejstřík: Pavlína Bauerová Obálka: Martin Sodomka Komentář na zadní straně obálky: David Morkes
Technická spolupráce: Petr Klíma Odpovědný redaktor: Jaroslav Škárka Vedoucí technické redakce: Martin Hanslian Vedoucí knižní redakce: Ondřej Jirásek Vedoucí produkce: Kateřina Vobecká
Žádná část této publikace nesmí být publikována a šířena žádným způsobem a v žádné podobě bez výslovného svolení vydavatele. Veškeré dotazy týkající se distribuce směřujte na: Computer Press Brno, náměstí 28. dubna 48, 635 00 Brno−Bystrc, tel. (05) 46 12 21 11, e−mail:
[email protected] Computer Press Bratislava, Hattalova 12/A, 831 03 Bratislava, Slovenská republika, tel.: +421 (7) 44 45 20 48, e−mail:
[email protected] Nejnovější informace o našich publikacích naleznete na adrese: http://www.cpress.cz/knihy/bulletin.html. Máte−li zájem o pravidelné zasílání bulletinu do Vaší e−mailové schránky, zašlete nám jakoukoli i prázdnou zprávu na adresu
[email protected].
Obsah
Část 1
Obecné zásady programování
1
Úvod
3
Lekce 1
Úvodní seznámení s prostředím Visual Basicu
5
Lekce 2
Začínáme programovat Funkce volání okna se zprávou MsgBox
11 15
Lekce 3
Začínáme programovat
19
Procedury Deklarace proměnných Deklarace konstant
20 25 35
Část 2
Programování ve Visual Basicu
37
Lekce 4
Popis a použití ovládacích prvků TextBox, CommandButton, ListBox
39
Lekce 5
Práce s textovými řetězci
49
Lekce 6
Další funkce a pokročilá práce s řetězci
55 vii
UČEBNICE VISUAL BASICU 6.0 Lekce 7
Přístup k textovým souborům a manipulace s nimi 61 Jak využít Word pro kontrolu pravopisu? Nahrazování textu
65 66
Lekce 8
Přístup k datům
69
Lekce 9
Vytváření SQL dotazů Příkaz SELECT Klauzule IN Fráze WHERE Fráze GROUP BY Fráze HAVING Fráze ORDER BY Deklarace WITH OWNERACCESS OPTION SELECT...INTO Operace UNION Operace INNER JOIN Operace LEFT JOIN a RIGHT JOIN Predikáty ALL, DISTINCT, DISTINCTROW, TOP Příkaz TRANSFORM Příkaz PARAMETERS Příkaz CREATE TABLE Příkaz ALTER TABLE Fráze CONSTRAINT Příkaz CREATE INDEX Příkaz DROP Příkaz UPDATE Příkaz DELETE SQL dotaz aplikace z předchozí lekce DSN-less Ovládací prvek Data
77 77 78 78 79 79 79 80 80 81 81 81 82 82 83 83 83 84 84 85 85 85 86 90 90
Lekce 10
Tvorba uživatelsky příjemných aplikací Menu Kontextové menu
viii
93 93 95
OBSAH StatusBar ToolBar Další tipy pro tvorbu user friendly aplikací
97 101 104
Lekce 11
Tisk a ovládání tiskáren CommonDialog
107 110
Lekce 12
Chyby a jejich ošetření Použití příkazu On Error.
113 116
Lekce 13
Ladění programového kódu Ladicí okno
121 123
Lekce 14
MDI formuláře
127
Lekce 15
Vytváření DLL knihoven 131 Přehled klíčových slov Visual Basic for Application 137 Direktivy překladače Funkce Příkazy
Rejstřík
137 137 151
163
ix
Část 1
Obecné zásady programování
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ
Úvod Visual Basic a jeho odnože se v posledních letech staly hlavním programovacím prostřed− kem na platformě produktů firmy Microsoft. Různé mutace tohoto programovacího jazy− ka se používají nejen pro programování samostatných (i síťových) aplikací, ale také pro tvorbu maker v balíku programů Microsoft Office (Visual Basic for Applications) a při programování internetových aplikací, spouštěných na straně serveru (ASP) i klienta (Vi− sual Basic Script). K oblibě tohoto programovacího jazyka přispěla hlavně jednoduchá syntaxe, snadná tvorba uživatelského rozhraní a velká variabilita a flexibilita jazyka. Učebnice, kterou právě začínáte číst se zabývá Visual Basicem jako samostatným programovacím jazy− kem pro tvorbu převážně kancelářských aplikací. Popisovaná – dosud poslední verze jazyka – je 6.0. Programování ve Visual Basicu je počítáno mezi objektově orientované a událostmi říze− né techniky. V krátkosti řečeno to znamená toto: Programátor může používat velké množství předdefinovaných objektů jako jsou formu− láře, textová pole pro zadávání a zobrazování dat, příkazová tlačítka, menu, popisky a velké množství dalších objektů. Souhrnně tyto objekty nazýváme ovládacími prvky (anglicky controls). Každý ovládací prvek má definovány své vlastnosti, metody a události. Co jsou a k če− mu slouží? Vlastnostmi prvku (anglicky properties) jsou přesně v souladu s názvem vlast− nosti daného ovládacího prvku. Tyto vlastnosti udávají vzhled a chování ovládacího prvku v aplikaci. U textového pole lze například definovat font, kterým bude v poli zob− razen text, velikost pole a jeho umístění na formuláři, název, pomocí něhož se na ovlá− dací prvek bude odkazovat programový kód a mnoho dalších vlastností. Vlastnosti lze rozdělit do kategorií (viz obr. 1). Kategoriemi mohou být vzhled (Appere− ance), chování (Behaviour), vazba na databázová data (Data) a další.
TIP: Vlastnosti ovládacích prvků však lze rozdělit také podle jejich dostupnosti. Hodnoty některých vlastností je možné nastavit pouze jednou při zakreslování (design) ovládacího prvku na formulář, ale nelze je již měnit programovým kódem. Příkladem takové vlastnosti je Alignment (zarovnání). Jiné vlastnosti je možné definovat pouze za běhu aplikace (run time) programovým kódem, avšak při zakreslování jsou nedostupné. Drtivou většinu hodnot vlastností všech ovládacích prvků je však možné definovat jak při zakreslování a základní definici prvku, tak programovým kódem.
3
UČEBNICE VISUAL BASICU 6.0
Obr. 1 Okno vlastností textového pole (TextBox) Metody ovládacích prvků vlastně představují činnosti, které daný ovládací prvek může vykonávat, případně které mohou být vykonány na něm. Pokud se podržíme příkladu textového pole, najdeme u něj definované např. metody Refresh (obnovit zobrazovaná data) nebo SetFocus (umístění fokusu – tj. zaměření – na textové pole). Události definované u všech ovládacích prvků zajišťují, že programování ve Visual Basi− cu se počítá mezi událostmi řízené programovací techniky. U každého ovládacího prvku najdeme seznam událostí, které mohou při běhu naprogramované aplikace vzniknout v přímém vztahu k tomuto prvku. Klasickými událostmi, které najdeme u většiny ovláda− cích prvků, jsou Click (klepnutí myší na ovládací prvek), DblClick (poklepání myší na ovládací prvek), GotFocus a LostFocus (události nabytí, resp. pozbytí fokusu, tj. zaměře− ní) a mnoho dalších. Události slouží k programování procedur, které se vykonají jako odezva na výskyt určité události. Např. procedura, která bude v programovém kódu při− řazena k události Clik na příkazové tlačítko, se vykoná vždy, když uživatel na toto tlačít− ko klikne myší.
TIP: Uvedené charakteristiky Visual Basicu způsobují, že programování je v mnoha ohledech velice jednoduché a že kancelářské aplikace vytvořené pod Visual Basicem se graficky zcela shodují s prostředím operačního systému Windows. Tak se každý uživatel, který pracuje ve Windows, velice rychle naučí pracovat s novým programem, jehož ovládání se mu zdá intuitivní a podobné tomu, na co je zvyklý.
4
Lekce 1
Úvodní seznámení s prostředím Visual Basicu Cíle lekce: Seznámení a základní popis pracovního prostředí programovacího jazyka Visual Basic 6.0. Stejně jako člověk, který nastoupí do nového zaměstnání se musí nejprve seznámit se svými spolupracovníky a místem, kde bude pracovat, musíme se i my nejdřív podívat na to, čím budeme své nové programy vytvářet. Abychom mohli začít prvními jednoduchými programy, musíme poznat prostředky, kte− ré nám k tomu Visual Basic nabízí. I když tato lekce nepodá ucelený popis všech nástro− jů obsažených ve Visual Basicu, přiblížíme si zde ty, jež jsou nutné pro naprogramování první aplikace. Další vlastnosti, nastavení a nástroje potřebné pro práci v programovém prostředí si budeme popisovat průběžně v dalších lekcích tak, jak se vynoří potřeba je− jich použití. Otevřete si tedy nejprve Visual Basic – nejlépe z nabídky Start hlavního menu Windows. Při otevírání narazíte hned na první problém. Musíte zvolit typ nového projektu, který zakládáte.
TIP: Projektem ve Visual Basicu rozumíme kolekci souborů, které v sobě obsahují definice formulářů a jejich ovládacích prvků a programový kód. Každý projekt obsahuje svůj hlavní soubor s příponou VBP (Visual Basic Project), pomocí něhož se projekt edituje v prostředí Visual Basicu.
Na obr. 2 je zobrazeno množství možností, ze kterých je možné zvolit typ projektu. Ačko− li dále v této učebnici bude řeč i o některých jiných typech projektů, v naprosté většině případů si vystačíme s tím základním – Standard EXE (tj. projekt, jehož výsledkem bude standardní spustitelný soubor s příponou EXE).
5
UČEBNICE VISUAL BASICU 6.0
Obr. 2 Volba typu projektu Po volbě typu projektu se dostaneme hned do pracovního prostředí Windows. K první orientaci na této ploše slouží obr. 3. Obrázek obsahuje popisy nejdůležitějších částí plo− chy. Pojmy definované tímto obrázkem budeme nadále používat v celé učebnici.
Obr. 3 Pracovní plocha nové založeného projektu.
6
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ První dvě části vývojového prostředí Visual Basicu jsou standardní snad ve všech aplika− cích Windows. Nabídka (menu) a nástrojová lišta jsou základními ovládacími prvky každého programu. Součásti těchto dvou částí pracovní plochy programu si budeme po− pisovat postupně v celé knize. Další podokna vývojového prostředí jsou již plně přizpůsobena potřebám programování. Bílá střední část vývojového prostředí, která zabírá nejvíce místa, je pracovní plocha. Ten− to sektor je určen ke dvěma základním účelům: • Pro grafické navrhování formulářů a dialogových oken • pro psaní, editaci a ladění programového kódu. Na obr. 3 je na pracovní ploše Visual Basicu zobrazen pouze jediný prázdný formulář s názvem Form1.
TIP: V příštích lekcích se dozvíte, že v této části vývojového prostředí se mohou objevit i jiné objekty – např. designer pro definici připojení aplikace ke zdroji dat v databázi. I tyto části však souvisejí s tvorbou programového kódu.
V levé části je panel ovládacích prvků (ToolBox). Tento panel obsahuje schématické ikony ovládacích prvků, které lze přidávat do formulářů. První ikonou je šipka, která ne− představuje ovládací prvek, ale volbu kurzoru pro manipulaci s již vytvořenými objekty. Dále již následují nejpoužívanější ovládací prvky v tomto pořadí: PictureBox (obrázkové pole), Label (popisek), TextBox (textové pole), Frame (rámec), CommandButton (příka− zové tlačítko) atd.
TIP: V dalším textu se budeme držet anglického názvosloví ovládacích prvků. Jednak proto, že prostředí Visual Basicu není lokalizováno do češtiny a při programování budete stejně muset znát anglické názvy, jednak proto že používání angličtiny je v programátorské komunitě běžnější a jednoznačnější než čeština.
TIP: Prvků zobrazených v panelu ovládacích prvků může být mnohem více. Panel obsahuje vždy jen ty prvky, které jsou již použity v projektu a základní sadu prvků, která je zobrazena na obr. 3.
Zkuste si na formulář umístit libovolný ovládací prvek. Klepněte na zvolený ovládací pr− vek v panelu ovládacích prvků a potom při stisknutém levém tlačítku myši vymezte na formuláři Form1 plochu, na kterou bude ovládací prvek umístěn. Po uvolnění tlačítka myši se prvek na formuláři zobrazí v té velikosti, jakou jste nadefinovali. Úpravám veli− kosti, umístění a nastavením ostatních vlastností se budeme věnovat dále v této lekci. V pravé části vývojového prostředí nalezneme další malá podokna, která jsou vesměs ur− čena k tomu, aby usnadňovala programátorovi orientaci v právě vytvářeném projektu, ale i pro definici některých výchozích hodnot.
7
UČEBNICE VISUAL BASICU 6.0 Prvním takovým oknem je okno projektu. Toto okno obsahuje vždy všechny základní součásti, ze kterých se editovaný projekt skládá. V našem případě je to pouze kolekce formulářů obsahující jeden jediný formulář. Udělejme teď trochu odbočku a uveďme si, ze kterých součástí se projekt ve Visual Ba− sicu skládá a jaké objekty se tudíž mohou v okně projektu objevit. Pokud mluvíme o součástech projektu, nemáme na mysli jednotlivé ovládací prvky vklá− dané do formulářů. Prvky, které se na formuláře umísťují z panelu ovládacích prvků, te− dy v okně projektu neuvidíte. Okno projektu zobrazuje objekty, které jsou součástí projektu ve dvou úrovních jako stromovou strukturu. Vyšší úrovní je kolekce konkrétních objektů, na niž jsou navázány jednotlivé objekty kolekce. První kolekcí (viz obr. 4) je kolekce formulářů obsahující čtyři různé formuláře.
obr. 4 Příklad zobrazení okna projektu Dalším kontejnerem je kontejner nezávislých programových modulů. Programový modul obsahuje programový kód většinou nezávislý na formulářích. Do samostatných progra− mových modulů se umísťují procedury a funkce Visual Basicu, které většinou nepracují přímo s ovládacími prvky jednotlivých formulářů, ale které mají k těmto polím vztah pou− ze vzdálený. Tento přístup si budeme demonstrovat později.
TIP: Každý formulář má implicitně vytvořen svůj vlastní programový modul, který však není vidět v okně projektu. Tento modul je určen (na rozdíl od nezávislých modulů) především pro manipulaci s ovládacími prvky formuláře, zobrazování dat na formuláři, atd. Modul formuláře je k tomuto účelu speciálně uzpůsoben, o čemž si již brzy povíme.
Formuláře a moduly jsou daleko nejčastější objekty, které obsahuje téměř každý projekt. Ve většině lekcí této učebnice vystačíme právě s těmito dvěma objekty. Posledním druhem objektů, které jsou zobrazeny na obr. 4, je kontejner Designers obsa− hující definici připojení aplikace k externí databázi.
8
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ
TIP: Práce s externími daty bývá velice frekventovanou činností kancelářských aplikací programovaných ve Visual Basicu. Proto se budeme možnostmi přístupu k datům zabývat velice podrobně. Použití designeru pro definici připojení k databázi je jednou z mnoha možností.
Následujícím oknem vývojového prostředí je okno vlastností ovládacího prvku. Aktuálně je v tomto okně zobrazen soubor vlastností právě zvoleného ovládacího prvku. Vzhle− dem k tomu, že jediným ovládacím prvkem nově založeného projektu je automaticky za− ložený formulář, obsahuje okno vlastností informace právě o tomto okně. Rozbalovací lišta (ComboBox) v horní části okna slouží ke zvolení ovládacího prvku, jehož soubor vlastností chceme zobrazit. Tam je vždy zobrazen název ovládacího prvku (aktuálně Form1), následovaný udáním typu tohoto prvku v angličtině (aktuálně Form). Pod oknem vlastností je implicitně umístěn stručný komentář popisující význam právě zvolené vlastnosti. V okně na obr. 3 je zvolena vlastnost Caption, a proto nás popis in− formuje, že tato vlastnost vrací nebo nastavuje text zobrazený v titulku objektu. Pro for− mulář je to text v horní modré liště. Poslední okno je určeno pro nastavení startovní pozice formuláře na pracovní ploše Win− dows – tedy pozici, kde se formulář objeví při jeho prvním zobrazení v aplikaci. Pozici můžete definovat prostě tak, že jej myší umístíte na požadované místo v rámci malého monitoru v tomto okně.
Otázky a úkoly: 1. Z jakých součástí se většinou skládají standardní projekty ve Visual Basicu? K čemu tyto objekty slouží? 2. Vysvětlete význam termínů metoda, vlastnost a událost ovládacího prvku.
9
Lekce 2
Začínáme programovat Cíle lekce: Vytvoření prvního jednoduchého progra− mu ve Visual Basicu a demonstrace použití ovládacích prvků a základních charakteris− tik programu. V této lekci vytvoříme první jednoduchou aplikaci. Celá aplikace bude sestávat z jediné− ho formuláře, který bude obsahovat TextBox a CommandButton. Po kliknutí na Com− mandButton se text napsaný v TextBoxu zobrazí jako samostatné hlášení. Otevřete si tedy vývojové prostředí ve Visual Basicu a založte nový projekt Standard EXE, stej− ně jako v minulé lekci. Měli byste mít otevřeno vývojové prostředí odpovídající obrázku č. 3. Nyní v panelu ovládacích prvků zvolte TextBox.
TIP: Dokud si nezvyknete na ikony označující jednotlivé ovládací prvky, zjistíte správnou ikonu tak, že umístíte kurzor myši nad některou ikonu. Bezprostředně poté se u kurzoru objeví název ovládacího prvku.
Postupem popsaným v předcházející lekci umístěte TextBox na formulář Form1 (viz obr. 5). Nyní upravte velikost ovládacího prvku tažením za úchytné body TextBoxu.
obr. 5 Formulář s TextBoxem
TIP: Velikost většiny ovládacích prvků lze definovat také přesně nastavením jejich vlastností Height (výška) a Width (šířka) v okně vlastností. Kromě těchto vlastností můžete každý viditelný prvek přesně umístit na formuláři nastavením jeho vlastností Left (vzdálenost od levého okraje formuláře) a Top (vzdálenost od horního okraje formuláře). Nastavení těchto vlastností používejte především v těch případech, kdy potřebujete více ovládacích prvků zarovnat stejně.
11
UČEBNICE VISUAL BASICU 6.0
TIP: V praxi bývá často potřebné umísťovat na jeden formulář více ovládacích prvků tak, aby byly přímo pod sebou a se stále stejnou roztečí. K tomu slouží mřížka, kterou vidíte na obr. 5 ve formě teček na formuláři. Rozteč mřížky je možné nastavit v dialogovém okně na obr. 6, které můžete editovat Příkazem nabídky Tools/Options/General. V rámečku FormGrid Settings je možné nastavit následující parametry: Show Grid – při zatržení se mřížka zobrazí Width – šířka rozteče mezi sloupci mřížky Height – výška rozteče mezi řádky mřížky Align Controls to Grid – při zatržení jsou všechny ovládací prvky umísťované na formuláře přichyceny k mřížce.
Obr. 6 Dialog pro nastavení mřížky Nyní nastavte některé vlastnosti ovládacího prvku TextBox: Vlastnost
Hodnota
(Name)
txtText
MultiLine
True
Text
(prázdný řetěz)
Name (jméno) je vlastnost určující název ovládacího prvku, pod kterým se bude daný pr− vek ovládat programovým kódem. MultiLine – pokud je nastaveno na hodotu True, je povoleno vkládat do TextBoxu více− řádkový text. Text – jedná se o textový řetězec, který je obsažen v TextBoxu. Pokud bude hodnotou prázdný řetězec, nebude při prvním zobrazení formuláře v poli žádný text.
12
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ Dalším krokem bude přidání příkazového tlačítka CommandButton na plochu formulá− ře. Proveďte to stejným způsobem jako u TextBoxu. Potom u tohoto tlačítka nastavte ná− sledující vlastnosti: Vlastnost
Hodnota
(Name)
cmdZobraz
Caption
Zobraz text
Textová hodnota vlastnost Caption představuje titulek, který se zobrazí na příkazovém tlačítku. Stejně jako u TextBoxu můžete i u CommandButtonu nastavit jeho velikost buď tažením za úchyty nebo definicí vlastností Width a Height. Celý formulář nyní vypadá tak jako na obr. 7.
Obr. 7 Hotový návrh formuláře Nyní přistoupíme k definování programového kódu spojeného s formulářem. V našem případě nebudeme zakládat žádný samostatný programový modul, ale vystačíme s mo− dulem formuláře. Jediným kódem bude kód, který zajistí, že při klepnutí na tlačítko cmdZobraz se otevře okno se zprávou (Message Box), kde textem zprávy bude text ob− sažený v TexBoxu txtText. Pro otevření modulu formuláře poklepejte kamkoli na plochu formuláře Form1 mimo ovládací prvky, které obsahuje. Otevře se okno kódu, které vidíte na obr. 8. Popišme si nyní organizaci tohoto okna. V levem rozbalovacím poli jsou vyjmenovány názvy všech ovládacích prvků umístěných na formuláři. Pouze formulář (jenž je na ob− rázku právě vybrán) je identifikován slovem Form a nikoli svým názvem. Důvod je zřej− mý – zatímco ovládacích prvků jednoho druhu může být na formuláři více, je nutné je− jich rozlišení podle vlastnosti Name. Formulář však může být jen jeden, protože se po− hybujeme v programovém modulu právě jednoho formuláře. V pravém rozbalovacím menu je uveden výčet událostí, které mohou na zvoleném ovlá− dacím prvku vzniknout a které je tudíž možné programově ošetřit. Aktuálně zvolená je událost Load formuláře. Událostní procedura Form_Load může obsahovat kód, který se provede při natažení formuláře do paměti počítače, tedy těsně před jeho zobrazením na monitoru. Tato událostní procedura nás ovšem nezajímá – tu tentokrát programovat nebudeme.
13
UČEBNICE VISUAL BASICU 6.0
Obr. 8 Okno pro definici programového kódu příslušného k formuláři
TIP: Událostní procedurou označujeme ucelenou část programového kódu, která se provede jako odezva na výskyt události, ke které je procedura připojena.
Potřebujeme naprogramovat činnost aplikace po kliknutí na tlačítko cmdZobraz. Proto z levého sloupce vybereme ovládací prvek cmdZobraz a z pravého jeho událost Click. Do událostní procedury cmdZobraz_Click zaneseme následující kód: Private Sub cmdZobraz_Click() MsgBox txtText.Text End Sub
Popišme si, co znamená programový text, který jsme právě zapsali. Popisem procedur a jejich použitím se budeme podrobněji zabývat v následující lekci. Zde je popsán pou− ze základ nezbytný k porozumění uváděného příkladu. První řádek je definice hlavičky procedury. Klíčová slova Private Sub uvozují proceduru. Jejich přesný význam bude popsán později. Následuje název procedury. Pro událostní procedury je zavedena neměnná konvence tak, že její název se skládá: • z názvu ovládacího prvku, na němž může událost vzniknout • z podtržítka • z názvu události, která je programovaná.
14
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ Za názvem procedury následuje tzv. seznam parametrů, které do procedury vstupují. Vzhledem k tomu, že tato procedura žádné parametry nemá, následují za názvem už jen levá a pravá závorka. Pod prvním řádkem v proceduře následuje vždy tzv. tělo, které představuje samotný kód Visual Basicu. V našem případě se jedná o jediný řádek. Klíčové slovo MsgBox zobrazí okno se zprávou. Zpráva, která bude zobrazena, následuje za klíčovým slovem. Podle zadání úlohy to má být textový řetězec zapsaný v TextBoxu txtText. Jak již víme, tento řetězec je zapsán ve vlastnosti Text příslušného ovládacího prvku. Jak tedy programově zjistit hodnotu vlastnosti ovládacího prvku? Vždy tak, že zapíšeme název příslušného ovládacího prvku, který je následován tečkou a názvem vlastnosti. Posledním řádkem procedury je End Sub, který standardně ukončuje proceduru. Nyní spusťte celý program příkazem Run/Start z nabídky nebo klávesou F5. Vytvořený formulář se zobrazí na obrazovce s kurzorem blikajícím v textovém poli. Vepište tedy do textového pole libovolný textový řetězec a klepněte na tlačítko s nápisem Zobraz text. Výsledek by měl vypadat podobně jako na obrázku 9.
Obr. 9 Takto funguje náš první program
TIP: Aplikaci zastavíte příkazem Run/End z nabídky. Před tím ovšem musíte zavřít okno se zprávou klepnutím na tlačítko OK tohoto okna.
Funkce volání okna se zprávou MsgBox U této funkce se zastavme hned v začátku, protože její použití je velmi časté. Okno se zprávou se používá vždy, když program potřebuje uživatele na něco upozornit nebo o něčem informovat. Typickým příkladem může být zobrazení chybového hlášení. Funkce MsgBox zobrazí dialogové okno se zprávou a čeká dokud uživatel nestiskne tla− čítko. Vrací hodnotu, která určuje, které tlačítko uživatel stiskl. Kromě textu zprávy uži− vatel také definuje, jaká tlačítka se mají zobrazit, které z nich bude předvoleno a která ikona bude zprávu graficky doplňovat.
15
UČEBNICE VISUAL BASICU 6.0 Syntaxe funkce je následující: MsgBox(prompt[, buttons][,title][, helpfile, context])
TIP: Argumenty uvedené v hranatých závorkách znamenají, že jejich definice je nepovinná. V našem příkladu z lekce 1 je definován pouze argument prompt.
Popis argumentů: prompt
Řetězcový výraz zobrazený jako dialogová zpráva. Maximální délka promptu je závislá na šířce znaků písma, které je použito (cca 1024 zna− ků). Má−li prompt více než jednu řádku, je možné jej rozdělit pomocí zna− ků konce odstavce (Chr(13)), přesunu na další řádek (Chr(10)) nebo je− jich kombinací (Chr(13) + Chr(10)) mezi všemi řádky. Více si o této tech− nice povíme v lekci věnované práci s řetězci.
buttons
Číselný výraz sestávající ze součtů identifikačních čísel tlačítek, které mají být zobrazeny, ikon a předvoleného tlačítka (viz dále). Implicitní hodnota (pokud vynecháte tuto volbu) je 0.
title
Řetězcový výraz zobrazený v titulkovém pruhu dialogu. Pokud title vyne− cháte, je do titulkového pruhu vloženo jméno aplikace. V našem případě byl názvem aplikace text Project1.
helpfile
Řetězcový výraz určující název souboru, který obsahuje text nápovědy k di− alogu. Je−li argument helpfile určen, musí být také určen argument context.
context
Číselný výraz, který je přiřazen k tématu nápovědy.
Hodnota argumentu buttons vzniká jako součet hodnot vybraných po jedné z následují− cích částí (zkušenější z Vás správně poznávají vztah těchto dekadických čísel k binární soustavě). V prvním sloupci je určen název konstanty, který lze použít místo číselné hod− noty, dále hodnota a popis: 1. část určuje tlačítka zobrazená v dialogu: Identifikátor
Hodnota Popis:
vbOKOnly
0
Zobrazí pouze tlačítko ”OK”.
vbOKCancel
1
Zobrazí tlačítka “OK” a “Storno”.
vbAbortRetryIgnore
2
Zobrazí tlačítka ”Zpět”, ”Znovu” a ”Ignorovat”.
vbYesNoCancel
3
Zobrazí tlačítka ”Ano”, ”Ne” a ”Storno”.
vbYesNo
4
Zobrazí tlačítka ”Ano” a ”Ne”.
vbRetryCancel
5
Zobrazí tlačítka ”Znovu” a ”Storno”.
2. část určuje styl ikony:
16
Identifikátor
Hodnota
Popis:
vbCritical
16
Zobrazí ikonu kritické zprávy.
vbQuestion
32
Zobrazí ikonu varovného dotazu.
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ vbExclamation
48
Zobrazí ikonu varovné zprávy.
vbInformation
64
Zobrazí ikonu informační zprávy.
3. část určuje, které tlačítko je výchozí: Identifikátor
Hodnota Popis:
vbDefaultButton1
0
Výchozí tlačítko je první.
vbDefaultButton2
256
Výchozí tlačítko je druhé.
vbDefaultButton3
512
Výchozí tlačítko je třetí.
4. část určuje režim dialogu: Identifikátor
Hodnota Popis:
vbApplicationModal
0
Aplikační režim – uživatel musí před pokračo− váním další práce ve zvolené aplikaci odpově− dět na zprávu. Hodnota 0 je implicitně předvo− lena. Pokud vynecháte zadání argumentu but− tons, budou informační okna pracovat v tomto režimu.
4096
Systémový režim – všechny aplikace jsou po− zastaveny, dokud uživatel neodpoví na zobra− zenou zprávu.
vbSystemModal
A jaké hodnoty funkce MsgBox vrací? V prvním sloupci je název vrácené konstanty, ve druhém její číselná hodnota a v posledním název tlačítka, které bylo stisknuto. Identifikátor
Hodnota Popis:
vbOK
1
OK
vbCancel
2
Storno
vbAbort
3
Zpět
vbRetry
4
Znovu
vbIgnore
5
Ignorovat
vbYes
6
Ano
vbNo
7
Ne
V případě, že v TextBoxu nebude zapsán žádný text, zobrazí se hlášení „Není zadán žád− ný text“
obr. 10 MsgBox “Toto je okno se zprávou.”, vbInformation + vbOKOnly, “Zpráva”
17
Lekce 3
Začínáme programovat Cíle lekce: Vysvětlit základní možnosti tvorby progra− mového kódu, popis a použití procedur, proměnných a konstant. Než začneme vytvářet první program ve Visual Basicu, je nutné si říci základní filozofii vytváření takového programu a to, jaké nástroje máme pro tvorbu kódu k dispozici. Programový kód Visual Basicu netvoří jeden ucelený program, jako je tomu v některých jiných programovacích jazycích. Náš program se skládá ze souboru procedur a funkcí. S událostními procedurami jsme se již seznámili v první lekci – tyto procedury patří ve Visual Basicu mezi nejdůležitější. Jsou připojeny k událostem jednotlivých ovládacích prvků a jsou aktivovány aplikací samotnou vždy ve chvíli, kdy příslušná událost nasta− ne. (Událostí může být např. klepnutí nebo poklepání myší na ovládací prvek, otevření formuláře, ztráta nebo získání zaměření ovládacího prvku a mnoho dalších.) Kromě udá− lostních procedur lze definovat i procedury obecné, které nejsou připojeny k žádné udá− losti, ale na které se mohou ostatní událostní i obecné procedury odvolávat. Všechny procedury (událostní i obecné) se uchovávají v tzv. programových modulech. Rozezná− váme dva druhy modulů: • Modul připojený k formuláři – v modulech tohoto typu jsou uloženy všechny událostní procedury a mohou v něm být i procedury obecné. Tento modul se automaticky zakládá spolu se svým formulářem a už ho neopouští. • Standardní modul – tento modul může obsahovat pouze obecné procedury a je nutné ho před použitím explicitně založit. K tomu slouží příkaz nabídky Pro− ject/Add Module. Název každého standardního modulu zahrnutého do projektu se objeví v okně projektu (viz obr. 4). Popis okna modulu, do kterého se ukládají procedury a vůbec veškerý programový kód, byl uveden již v první lekci. Proto jen stručně: • Mezi procedurami v každém modulu se lze pohybovat pomocí rozbalovacích se− znamů v horní části okna modulu (viz obr. 8). • Levé pole slouží k vybrání konkrétní procedury pro editaci. • Zobrazuje−li levé pole položku (General), pak nabídka pravého pole obsahuje názvy všech obecných procedur. Pokud levé pole obsahuje název některého z ovládacích prvků formuláře, v pravém poli se objeví název události pro aktuál− ně editovanou událostní proceduru.
19
UČEBNICE VISUAL BASICU 6.0
TIP: Události, ke kterým jsou již přiřazeny událostní procedury, se v nabídce pravého pole zobrazují tučně.
Začněme tedy se seriózním a úplným popisem programovacího jazyka Visual Basic. Nej− důležitější jednotkou programového kódu je procedura. Proto začneme nejprve s popi− sem procedur.
Procedury Spustitelný kód je v modulech uložen ve formě procedur. Událostní procedura reagující na výskyt události, ke které je připojena, je vždy uvozena klíčovým slovem Sub a uklá− dá se do modulu připojeného k formuláři. Obecné procedury se netýkají konkrétního objektu, a proto se mohou vyskytovat v obou druzích modulů popsaných výše. Mohou být uvozeny klíčovým slovem Sub (tyto procedury nevracejí při svém ukončení žádnou hodnotu) nebo slovem Function (procedury vracející hodnotu využitelnou v dalším bě− hu programu). V příštím výkladu budeme nazývat procedury uvozené slovem Funktion jako funkce. Obecné procedury se spustí, pouze pokud je explicitně vyvoláte (v jiné obecné nebo událostní proceduře). Důvodů pro tvorbu obecných procedur je hned několik. Prvním z nich je možnost výpočtu a vrácení hodnoty procedurou – obecné procedury se tedy dají naprogramovat jako uživatelem definované funkce a používat je třeba ve výrazech.
TIP: Klasickým přikladem může být výpočet DPH. Do takové funkce vstupuje cena bez DPH, případně příznak definující procentuální výši DPH. Funkce pak vrací cenu s DPH.
Další situací, kdy je dobré použít obecnou proceduru, je případ, kdy několik událostních procedur vykonává stejnou činnost. Tuto činnost je výhodné naprogramovat ve formě obecné procedury, která bude volána ze všech událostních procedur. Zabrání se tak duplikaci kódu a zjednoduší se údržba a případné další změny této části aplikace. Uveďme si nyní obecnou syntaxi procedur a funkcí. [Static] [Private] [Friend] Sub názevprocedury (seznam argumentů) příkazy End Sub Klíčová slova Static, Private a Friend jsou v syntaxi nepovinná a definují, zda se jedná o tzv. statickou, soukromou nebo ??? proceduru. Tato klíčová slova budou popsána poz− ději. Název procedury nesmí obsahovat mezery. Pokud se jedná o událostní proceduru, řídí se název procedury Sub přesnými pravidly: skládá se z kombinace názvu ovládacího prvku, k jehož události je procedura připojena (např. Form, je−li událostní procedura při− pojena k formuláři), dále znaku podtržítko (_) a názvu události. Např. Form_DblClick je
20
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ název událostní procedury určené pro spuštění při poklepání (dvojitém kliknutí) myší na plochu formuláře mimo jeho záhlaví a kterýkoli ovládací prvek umístěný na formuláři.
TIP: Jak již víme, pokud je událostní procedura připojena k ovládacímu prvku formuláře, nahrazuje slovo Form název ovládacího prvku.
TIP: Název ovládacího prvku je uveden v poli vlastnosti Name (název) a nemusí souhlasit s vlastností Caption (titulek). Pokud později změníte název ovládacího prvku, je nutné stejně změnit i názvy všech událostních procedur. Jinak se spojení mezi ovládacím prvkem a událostními procedurami ztratí.
Procedura typu Function má podobnou syntaxi: [Static] [Private] Function názevprocedury (seznam argumentů) [As typ] Klíčová slova zde mají stejný význam jako u procedury Sub. Mezi oběma typy procedur je však několik rozdílů: 1. Procedury Function vracejí při ukončení hodnotu do názvu procedury, a proto má procedura Function udaný datový typ. Implicitně je funkce typu Variant. 2. Argumenty procedury Function se uvádějí v závorkách nejen při deklaraci, ale také při volání procedury. 3. Procedura Function nemůže v aplikaci figurovat jako událostní procedura a musí být proto definována jako obecná. 4. Zatímco procedury Sub často nepotřebují žádný seznam argumentů, funkce jsou ur− čeny především pro zpracování těchto argumentů. Proto je deklarace funkce bez udaného seznamu argumentů spíše výjimkou. Popišme si nyní, jak vypadá tento seznam argumentů: Proceduře nebo funkci lze předávat jeden nebo více argumentů. Předává−li se více než jeden argument, jsou argumenty navzájem odděleny čárkou. Syntaxe každého argumen− tu je následující: [Optional] [ByVal] názevproměnné [()] [As typ] Implicitní způsob předávání argumentů je tzv. odkazem (někdy se uvádí jménem). To znamená, že procedura může měnit hodnotu této proměnné a nová hodnota zůstane za− chována i po skončení procedury při dalším běhu programu. Pokud chcete předávat ar− gument hodnotou, musíte uvést před argument klíčové slovo ByVal. Klíčové slovo Opti− onal bude popsáno později. Případné závorky za názvem proměnné určují, že předáva− ným argumentem je indexové pole. Typ proměnné se uvádí za klíčové slovo As. Visual Basic používá následující datové typy: Byte, Boolean, Integer, Long, Single, Double, Date, Currency, String, Variant, Object nebo uživatelem definovaný typ. Popis datových typů bude uveden později. Pokud datový typ argumentu není explicitně uveden, stává se
21
UČEBNICE VISUAL BASICU 6.0 datovým typem Variant, což znamená, že proměnná může obsahovat jakýkoli typ dat. Při volání procedury se její argumenty (na rozdíl od její definice) neuvádějí v závorkách.
Příklad: Na volání procedury Alfa nejsnáze pochopíte rozdíl, mezi předáváním argumentů odka− zem a hodnotou. Procedura Alfa má argument intA volaný odkazem a intB volaný hod− notou. Po zavolání procedury Alfa z procedury Main bude v proměnné a hodnota 4 a v proměnné b hodnota 2. K tomuto příkladu se vrátíme v dalším výkladu, až si vysvě− tlíme další pojmy nezbytné k pochopení tohoto kódu. Sub Alfa (intA As Integer, ByVal intB As Integer) intA = 2*intA intB = 2*intB End Sub Sub Main () Dim a As Integer a = 2 b = 2 Alfa a,b Debug.Print a Debug.Print b End Sub
Příklad: Funkce vypočte, kolik je x procent (hodnota proměnné dbProcenta) ze zadaného celku (hodnota proměnné dbCelek). Oba argumenty jsou volány hodnotou. Výsledná hodno− ta se přiřadí do proměnné vysledek v proceduře Main. Function Counter ( ByVal dbCelek, dbProcenta As Double) As Double Counter= dbCelek/100*dbProcenta End Function Sub Main () vysledek = Counter (300, 10) End Sub
TIP: Vidíte, že tělo procedury se ukončuje klíčovým slovem End Function, jedná-li se o proceduru Function a End Sub, pokud jde o proceduru Sub.
TIP: Pokud vás nezajímá hodnota, kterou procedura vrací, můžete ji vyvolat i bez přiřazení této hodnoty jiné proměnné.
22
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ
TIP: Pokud je argument volán odkazem, musejí být obě proměnné (volaná – intA a volající – a) deklarovány jako stejný datový typ. U proměnných volaných hodnotou je jejich použití volnější. Jak ukazuje funkce Counter, volající nemusí být vůbec proměnná, ale může se předávat konstanta.
Funkce (jak sám název napovídá) jsou určeny pro provádění výpočtů. Výpočty se pro− vádějí pomocí výrazů, jejichž součásti a povolené operace závisejí na tom, s jakými ope− randy výraz nakládá a jakého typu má být výsledek. Pokud chcete, aby funkce vracela výsledek výpočtu, musí tělo funkce obsahovat řádek, na kterém se názvu funkce (jako proměnné výše definovaného typu) přiřadí příslušná hodnota. Tato hodnota musí být stejného datového typu, jako je deklarovaná funkce.
TIP: „Výpočty“ lze provádět nejen s čísly, ale s daty všech datových typů – Tj. např. s textovými řetězci nebo daty typu Currency (peněžními položkami – jejich datový typ se od běžných čísel také liší).
Zapsáním kódu procedury do modulu často pravé programátorské trampoty teprve začí− nají. Zapsaný kód funkcí a obecných procedur typu Sub je nutné zkompilovat a všech− ny procedury pak odladit.
TIP: Syntaxe vkládaného kódu se ověřuje již při jeho zadávání po jednotlivých řádcích (při přechodu na nový řádek pomocí klávesy ENTER), a proto je kompilace procedur většinou rychlou záležitostí. Pokud však nechcete, aby byla syntaxe kontrolována již při psaní, zrušte zatržení položky Auto Syntax Check v dialogu na obr. 11. Tento dialog otevřete příkazem nabídky Tools/Options.
obr. 11 Zde můžete zrušit automatickou kontrolu syntaxe psaného kódu.
23
UČEBNICE VISUAL BASICU 6.0 Kompilace převádí vámi zapsané procedury do strojového kódu. Ve formě strojového kódu je potom počítač schopen program spustit.
TIP: Spouštět aplikaci v prostředí systému Visual Basic je možné buď příkazem Run/Start (klávesa F5) nebo příkazem Run/Start With Full Compile – spustit s explicitní kompilací veškerého programového kódu (klávesová zkratka CTRL+F5). Oba příkazy jsou dostupné z nabídky.
Programovací jazyk Visual Basic nabízí mnoho variant při řešení mnohých programátor− sky složitých situací. Jednoduchým příkladem této příznivé vlastnosti jazyka je možnost použití proměnného počtu argumentů v procedurách. Chcete−li definovat proceduru, která při volání v různých částech aplikace provádí stejnou nebo velmi podobnou čin− nost ovšem s jinými argumenty, nemusíte proceduru programovat dvakrát. Stačí, když některé argumenty definujete jako volitelné. K tomu slouží klíčové slovo Optional. Po− kud kompilátor jazyka najde toto klíčové slovo před definicí argumentu procedury, ne− považuje jeho vynechání při volání procedury za chybu. Fakt, že volitelný argument ne− byl při volání procedury uveden, lze zjistit v těle procedury pomocí funkce IsMissing.
TIP: Volitelné argumenty musejí být definovány vždy až na konci seznamu parametrů a musejí být datového typu Variant.
Příklad: následující funkce vrací součet dvou až tří argumentů podle toho, kolik je jich při vyvo− lání funkce uvedeno v seznamu argumentů. Function Soucet( intA, intB As Integer, Optional varC As Variant) If IsMissing(varC) Then Soucet = intA + intB Else Soucet = intA + intB + varC End If End Function
Tato úloha se dá řešit ještě obecněji za pomoci procedury, do které lze zadat libovolný počet argumentů. Libovolný počet argumentů je možné zadat pomocí definice seznamu argumentů klíčovým slovem ParamArray. Následující funkce vrací součet všech argu− mentů, které byly při volání funkce uvedeny. Function Soucet1( ParamArray varPole() As Variant) Dim varSoucet, var As Variant varSoucet = 0
24
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ For Each var In varPole varSoucet = varSoucet + var Next var Soucet1 = varSoucet End Function
Funkci Soucet1 lze volat libovolným z následujících řádků: Suma = Soucet1( 25, 258, 259.6) Vysledek = 5 * Soucet1(1, 258, 35.58, 15, 1, 2, 45)
Popis programové konstrukce For Each ... In je uveden v kapitole zabývající se příkazy cyklu dále v učebnici. V našem případě se jedná o smyčku procházející všechny argu− menty funkce. Obecné procedury Visual Basicu ve standardních modulech se často definují jako veřej− né (Public). To znamená, že jsou dostupné z kterékoli části aplikace. To znamená, že veřejnou proceduru definovanou např. v samostatném modulu je možné volat i z jiných modulů, např. z modulů formulářů. Při volání procedury se spustí první procedura pří− slušného jména, kterou v modulech aplikace objeví. Pokud v aplikaci existuje několik procedur jednoho jména, můžete specifikovat cestu ke konkrétní proceduře pomocí teč− kové notace – příkazový řádek bude mít tuto podobu: NázevModulu.NázevProcedury.
TIP: Pokud hodláte obecnou proceduru používat pouze v rámci jejího modulu, deklarujte ji klíčovým slovem Private. Tím zajistíte, že proceduru nebude „vidět“ z ostatních modulů a vyloučíte tím možnost konfliktů se stejnojmennými procedurami jiných modulů. Navíc se tím urychlí kompilace kódu procedury. Událostní procedury musejí být definovány pomocí klíčového slova Private, protože se předpokládá jejich použití pouze pro databázový objekt, ke kterému jsou připojeny.
Deklarace proměnných Proměnné ve Visual Basicu – stejně jako v jiných programovacích jazycích – slouží k do− časnému uchovávání hodnot během vykonávání programového kódu. Každá proměnná se musí deklarovat. Deklarace proměnné se provádí před jejím prvním použitím. Pojem deklarace proměnných v sobě zahrnuje nejen definici názvu proměnné a jejího dato− vého typu, ale také obor (veřejné Public – či soukromé – Private – proměnné) a dobu platnosti (statické, které si uchovávají svou hodnotu i po skončení procedury, ve kte− ré jsou deklarovány, nebo takové proměnné, které „žijí“ pouze po dobu provádění pro− cedury).
TIP: Určením oboru proměnných určujeme, ze kterých procedur a modulů bude proměnná dostupná. Stejně jako tomu bylo u procedur
25
UČEBNICE VISUAL BASICU 6.0 Začněme nejprve oborem proměnných. U některých proměnných je žádoucí, aby byly dostupné nejen v jedné proceduře, ale z celého modulu a někdy dokonce z celé aplika− ce. Jak tuto dostupnost zařídit? Všechny proměnné jsou deklarovány v jedné z následujících částí programového kódu: 1. V deklarační sekci procedury. Proměnné, které se zde deklarují, musejí být vždy uvozeny klíčovým slovem Dim. Takové proměnné jsou ve všech případech soukro− mé vzhledem k proceduře a nejsou tudíž dostupné z jiných částí modulu ani apli− kace. 2. V deklarační sekci modulu. Tj. v sekci označené jako (General) v levém rozbalova− cím seznamu na obr. 8. Zde se dají deklarovat dva druhy proměnných: • Soukromé vzhledem k modulu, ve kterém jsou deklarovány. Tyto proměnné mo− hou být uvozeny buď klíčovým slovem Dim nebo Private. V tomto případě není mezi Dim a Private žádný rozdíl. Takto deklarované proměnné mohou používat všechny procedury daného modulu, nejsou však dostupné v ostatních modulech aplikace. • Veřejné. Veřejné proměnné se v deklarační čási modulu definují pomocí klíčové− ho slova Public. Tyto proměnné jsou dostupné ve všech modulech aplikace.
TIP: Explicitní deklarace klíčovými slovy Dim, Private nebo Public je povinná, pokud deklarační sekce modulu obsahuje klíčová slova Option Explicit – viz obr. 12. Pokud modul tato klíčová slova neobsahuje, není explicitní deklarace povinná. V tom případě kompilátor považuje každý neznámý identifikátor za novou proměnnou a při jejím prvním použití provede tzv. implicitní deklaraci. V takovém případě však hrozí nebezpečí, že Visual Basic bude i překlep v těle procedury v některých případech považovat za implicitní deklaraci proměnné a programový kód (ačkoli bude syntakticky správný) bude pracovat jinak, než zamýšlíte. Potlačením možnosti implicitní deklarace se vyhnete problémům při ladění procedur.
26
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ
obr. 12 Modul, v němž je povinná explicitní deklarace všech proměnných.
TIP: Příkaz Option Explicit není nutné vypisovat v každém modulu zvlášť. Tento příkaz bude uveden v deklarační části každého modulu, pokud zaškrtnete pole Require Variable Declaration (tj. v překladu požadovat deklaraci proměnných) v dialogovém okně Options (viz obr. 11), které vyvoláte příkazem Tools/Options z nabídky. Tuto volbu je vhodné zaškrtnout při vytváření aplikace hned na začátku, protože Visual Basic vloží po zaškrtnutí příkaz Option Explicit do nových modulů, ale nezmění již vytvořený kód.
Pokud mají dvě proměnné se stejným názvem různý obor platnosti, je v jazyce Visual Ba− sic praktikován přednostní přístup k proměnné „lokálnější“. Např. máte−li deklarovanou proměnnou intX na úrovni modulu i na úrovni procedury Proc1 příslušné k tomuto mod− ulu, bude se volání proměnné intX v proceduře Proc1 vztahovat k její lokální proměn− né, zatímco ve všech ostatních procedurách modulu se bude samozřejmě identifikátor intX vztahovat k jediné v té chvíli dostupné proměnné – totiž k proměnné deklarované na úrovni modulu.
TIP: Je možné deklarovat dvě různé veřejné proměnné v různých modulech, které budou dostupné z celé aplikace, stejným názvem. Aby při jejich používání nedošlo ke konfliktu, je třeba je v kódu odlišit tak, že v odkazu na ně uvedete i název modulu, ve kterém byly deklarovány – např. proměnná intX je deklarovaná v modulech Modul1 a Modul2. Označením proměnných Modul1.intX a Modul2.intX získáte odkaz na správnou proměnnou.
27
UČEBNICE VISUAL BASICU 6.0 Výše uvedená pravidla překrývání se nevztahují pouze na proměnné, ale i na všechny ostatní objekty, na které je možné v programovém kódu vytvářet odkazy: Tj. vlastnosti, ovládací prvky formulářů a sestav, procedury, konstanty nebo uživatelem definované ty− py. Z toho vyplývá mimo jiné i to, že nemůžete pojmenovat stejně např. ovládací prvek formuláře a proměnnou deklarovanou na úrovni modulu příslušného k formuláři, proto− že mají stejný obor platnosti. Stejně tak není možné nastavit vlastnost Name u dvou růz− ných ovládacích prvků na stejnou hodnotu. Jak tedy získat hodnotu ovládacího prvku formuláře nebo libovolné z jeho vlastností v proceduře, ve které je deklarována lokální proměnná stejného názvu? Řešení poskytu− je použití klíčového slova Me. Předpokládejme, že existuje lokální proměnná Informace a stejnojmenné příkazové tlačítko. V proceduře lze použít následující příkazy: ‘ Přiřazení hodnoty proměnné informace = 0 ’ Znepřístupnění ovládacího prvku Informace Me.Informace.Enabled = False
Následující příkaz však vygeneruje chybu: Informace.Enabled = False
TIP: Přestože pravidla překrývání jsou poměrně jednoznačná, přispěje k přehlednosti programu, když budou všechny názvy jednoznačně odlišeny.
Doba platnosti proměnných: Kromě oboru platnosti lze proměnným přisoudit také dobu platnosti. Hodnoty proměn− ných deklarovaných na úrovni modulu se zachovávají po celou dobu, kdy je databázová aplikace otevřená. Lokální proměnné deklarované v procedurách klíčovým slovem Dim existují pouze po dobu běhu kódu procedury. Při novém spuštění procedury se tyto pro− měnné znovu inicializují. Existuje však způsob, jak zachovat hodnotu lokální proměnné i pro následující spuštění procedury, ve které je deklarovaná. Taková lokální proměnná musí být definována jako statická klíčovým slovem Static. Přístup k lokální proměnné de− klarované v proceduře má pouze její procedura, avšak hodnota proměnné se zachovává i po ukončení běhu procedury a vstupuje do ní při jejím dalším volání.
TIP: Chcete-li, aby všechny proměnné procedury byly statické, deklarujte celou proceduru klíčovým slovem Static, které uveďte před klíčové slovo Sub nebo Function. Proměnné v proceduře pak budou statické bez ohledu na to, zda jsou deklarovány klíčovým slovem Dim nebo Static.
V předcházejících odstavcích byla řeč o oboru a době platnosti proměnných. Nyní si řek− něme, jak se proměnné skutečně deklarují. Syntaxe explicitní deklarace proměnných je následující: [Dim] [Static] NázevProměnné [As typ]
28
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ Vytváření názvů ve Visual Basicu: Konvence pro vytváření názvů (výraz NázevProměnné ve výše uvedené syntaxi) se týká názvů všech nových objektů, které při programování definujete. Vztahuje se tedy na ná− zvy pocedur, proměnných, konstant, ale musejí se dodržovat i u názvů ovládacích prvků a jiných objektů, na které se programový kód Visual Basicu odvolává. Všechny názvy ob− sažené v programovém kódu tedy musejí: • začínat písmenem, • skládat se pouze z číslic, písmen a znaku podtržení (_). Žádné jiné znaky nejsou povoleny, • mít maximální délku 256 znaků, • obsahovat pouze takové sekvence znaků, které se liší od klíčových slov Visual Basicu. Zaměřme se nyní na definici datového typu proměnné. Ten se uvádí za klíčové slovo As a jeho uvedení je nepovinné. Popis datových typů uvádí následující tabulka: Název typu
Popis
Byte
Celočíselná hodnota zabírající jeden bajt, tj. 0 až 255.
Integer
Celočíselná hodnota se znaménkem zabírající nejvýše dva bajty, tj. −32 768 až 32 767.
Long
Celočíselná hodnota se znaménkem zabírající nejvýše čtyři bajty.
Single
Reálné kladné číslo s plovoucí čárkou zabírající nejvýše čtyři bajty.
Double
Reálné kladné číslo s plovoucí čárkou zabírající nejvýše osm bajtů.
Currency
Reálné číslo se čtyřmi desetinnými místy zabírající nejvýše osm bajtů.
String
Řetězec znaků, jehož délka je prakticky neomezená – činí asi dvě miliardy znaků.
Boolean
Dva bajty obsahující hodnotu True nebo False (pravda nebo nepravda).
Date
Osm bajtů obsahující hodnotu datum/čas, tj. 1. leden 100 až 31. prosinec 9999.
Object
Čtyři bajty obsahující odkaz na libovolný Object.
Variant
Tento datový typ může obsahovat kterýkoli z předešlých dato− vých typů v rozsahu, který byl uveden. Tento datový typ je im− plicitně přiřazen každé proměnné, u které explicitní deklarace typu chybí. Nevýhodou, která je daní za flexibilitu proměnných tohoto typu, je jejich délka 16 bajtů a o něco pomalejší inter− pretace hodnot při běhu programu. Ve většině případů použití této proměnné musí Visual Basic provést odpovídající konverzi podle typu výrazu, ve kterém je proměnná typu Variant právě použita.
29
UČEBNICE VISUAL BASICU 6.0 S proměnnou typu Variant lze provádět všechny operace, které jsou povoleny s jednot− livými datovými typy. Příkladem budiž následující kód: Dim varVariable
’ varVariable je typu Variant
varVariable = “356.25“
’ varVariable obsahuje řetězec “356.25“
varVariable = varVariable * 2
’ varVariable obsahuje reálnou číselnou hodnotu 712.5
varVariable = “Ahoj“ & varVariable
’ varVariable obsahuje řetězec ’ “Ahoj712.5“
varVariable = varVariable * 2
’ Tento řádek vygeneruje chybu, protože s obsa− hem proměnné varVariable nelze provádět arit− metické operace
Předešlý příklad ukazuje další vlastnost jazyka, a to psaní poznámek do programového kódu. Poznámky slouží ke komentování jednotlivých programových pasáží a při kompi− laci se ignorují. Poznámka je uvozena apostrofem (’). Tento znak kompilátoru oznamu− je, že až do konce řádky není uveden žádný programový kód. Další možnost, jak do pro− gramu dostat komentář, představuje klíčové slovo Rem. Komentář uvedený za klíčovým slovem Rem se také ignoruje. Testování hodnoty proměnné typu Variant: Předcházející příklad ukazuje pouze jednu z mnoha situací, která může při používání proměnných datového typu Variant dělat problémy. Aby bylo možné předejít podob− ným chybám při běhu programu, obsahuje Visual Basic celou sadu funkcí určených pro testování hodnot proměnných typu Variant. První z těchto funkcí je funkce IsNumeric. Funkce vrací hodnotu True nebo False po− dle toho, zda aktuální hodnotu testované proměnné je možné použít jako platné číslo ve výrazu. Testovaná hodnota se uvádí do závorek za klíčové slovo IsNumeric – např: If IsNumeric(varVariable) Then varVariable = varVariable*2 Else varVariable = 0 End If
Podobně jako funkce IsNumeric funguje také funkce IsDate. Tato funkce zjišťuje, zda obsah proměnné splňuje podmínky kladené na datový formát Date. Užitečné funkce testující proměnné typu Variant jsou dále IsEmpty a IsNull. Funkce IsEmpty testuje, zda byla proměnné po jejím vytvoření přiřazena hodnota či nikoli. Z an− glického významu názvu funkce je zřejmé, že funkce vrací hodnotu True pouze v přípa− dě, že proměnné dosud nebyla přiřazena žádná hodnota. Při běhu programu je proměn− né možné přiřadit hodnotu Empty a uměle tak navodit stejný stav, jaký byl před prvním přiřazením libovolné hodnoty této proměnné. Další zvláštní hodnotou, kterou může proměnná datového typu Variant obsahovat, je hodnota Null. Hodnota Null se většinou používá na místech, kde jsou dosud neurčená
30
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ data – hodnotu Null mají např. všechna pole před svou inicializací. Hodnotu Null lze proměnné přiřadit (stejně jako hodnotu Empty) prostým přiřazovacím příkazem – např.: varVariable = Null
Funkce IsNull zjišťuje, zda testovaná proměnná má hodnotu Null či nikoli.
TIP: Zapamatujte si: hodnoty Null a Empty jsou dvě navzájem různé hodnoty. Zároveň se obě hodnoty liší od prosté číselné nuly nebo řetězce nulové délky. Hodnoty Empty i Null však je možné použít ve výrazech. Hodnota Empty se ve výrazech chová buď jako nula nebo řetězec nulové délky (podle typu výrazu). Dále hodnota Null proniká výrazy obsahujícími proměnné datového typu Variant. Znamená to, že pokud se hodnota Null vyskytne ve výrazu, výsledkem celého výrazu už bude automaticky hodnota Null. Stejně tak pokud použijete hodnotu Null jako argument funkce typu Variant, funkce vrací hodnotu Null.
Tím máme nezbytné informace o datovém typu Variant vyčerpány a můžeme se pustit do popisu dalších typů. Číselné datové typy: Číselné datové typy se dělí na typy, které uchovávají pouze celočíselné hodnoty a na ty− py, které jsou určeny pro reálná čísla. Ačkoli čísla lze uchovávat i v proměnných typu Variant, číselné datové typy zabírají méně paměti a aritmetické operace s nimi provádě− né jsou rychlejší. Stejně tak je vhodné v programech rozlišovat proměnné na celočíselné a typy s desetinnou čárkou a neusnadňovat si práci tím, že všechny proměnné budou deklarovány jako typ Double. I celočíselná hodnota vložená do proměnné typu Single, Double nebo Currency se převede na hodnotu s desetinnou čárkou, což může (pokud s tímto jevem nepočítáte) při dalším zpracování způsobit nemalé potíže. Řetězcové proměnné: Proměnné typu String budou vždy obsahovat pouze řetězce a nikoli číselné hodnoty. Řetěz− cové hodnoty, které se do těchto proměnných přiřazují, se uvádějí v uvozovkách – např.: Dim strRetez As String strRetez = “Ahoj, světe“
Proměnná strRetez byla deklarována jako řetězec proměnné délky. Velikost takové pro− měnné se prodlužuje a zkracuje podle hodnoty, která je v ní aktuálně uložená. Kromě toho lze také deklarovat řetězcové proměnné s pevnou délkou. Příklad: Dim strPevny As String * 25
Proměnná strPevny bude mít vždy pevnou velikost 25 znaků. Pokud této proměnné při− řadíte řetězec, jehož délka bude přesahovat 25 znaků, budou všechny znaky počínaje šestadvacátým ignorovány.
31
UČEBNICE VISUAL BASICU 6.0
TIP: Vyhodnocování výrazů typu String se dá nadefinovat v deklarační části každého modulu – příkazem Option Compare. Lze zde využít příkazů Option Compare Binary nebo Option Compare Text. Těmito příkazy se nastavuje relativní uspořádání použité při porovnání a to, zda se při porovnávání řetězců budou rozlišovat velká a malá písmena (Option Compare Binary) nebo ne (Option Compare Text).
Datový typ Boolean: Datový typ Boolean je obdobou podobného datového typu, který se vyskytuje téměř ve všech vyšších programovacích jazycích. Proměnná datového typu Boolean může obsa− hovat pouze dvě hodnoty: False (nepravda) nebo True (pravda). Hodnota typu Boole− an je výsledkem všech logických výrazů. Výchozí hodnotou proměnných typu Boolean je False. Datový typ Object: Proměnná datového typu Object obsahuje čtyřbajtovou adresu odkazující na objekt v aplikaci nebo na objekty v některých jiných aplikacích. K přiřazení objektu této pro− měnné se používá příkaz Set. Uživatelem definované typy: Tím končíme stručný popis základních datových typů programového jazyka Visual Basic. Avšak ještě než opustíme oblast datových typů, zastavme se u vlastních datových typů de− finovaných uživatelem. Jde o podobnou konstrukci programovacího jazyka Visual Ba− sic, jaká je např. v programovacím jazyce C označována slovem struktura. Uživatelem de− finované typy se používají v případě, že je výhodné v jedné proměnné uchovávat něko− lik souvisejících informací různých datových typů najednou. Uživatelem definované typy se deklarují pomocí klíčového slova Type. Tyto datové typy je možné definovat pouze v deklaračních sekcích modulu (nikoli procedur) a mohou být označeny jako soukromé (klíčové slovo Private) nebo veřejné (Public).
TIP: Veřejné uživatelem definované datové typy mohou být definovány pouze ve standardních modulech.
Příklad: Datový typ MujTyp bude přístupný pouze ve „svém“ modulu a bude obsahovat dvě pro− měnné: varVariable typu Variant a strJmeno typu String. Private Type MujTyp varVariable As Variant strJmeno As String End Type
32
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ Tímto způsobem je zatím definován uživatelský typ s názvem MujTyp. Vlastní deklarace proměnných tohoto typu již probíhá v souladu se všemi konvencemi deklarace proměn− ných tak, jak byly popsány v předcházejících kapitolách – např.: Dim var, var1 As MujTyp var.strJmeno=“Petr“ var1=var
Proměnné var a var1 jsou typu MujTyp. Přiřazení hodnot proměnným uživatelského ty− pu se děje podle předcházejícího příkladu. Na jednotlivé vnořené proměnné se odvolá− vá pomocí tečkové notace. Je povoleno i přiřazení hodnoty proměnné uživatelského ty− pu jiné proměnné (přiřazení struktury jako celku).
TIP: Pomocí proměnné uživatelského typu lze přehledným způsobem předávat argumenty do procedur. Argumenty uživatelem definovaného typu se do procedur předávají vždy odkazem. Dokonce i návratová hodnota funkcí může být uživatelem definovaného typu.
Visual Basic samozřejmě umožňuje i vytváření vnořených struktur a struktur obsahujících pole. Názorný příklad tuto možnost dostatečně ozřejmí: Type Zakaznik strJmeno As String strAdresa As String intIdentifikace As Integer End Type Type Prodej strVyrobek As String Odberatel() As Zakaznik End Type Dim LednovyProdej(100) As Prodej LednovyProdej(1).Odberatel(0).intIdentifikace = 105
Proměnná LednovyProdej je definována jako pole o sto jednom prvku uživatelského da− tového typu Prodej. Proměnná Odběratel je pole s proměnnou velikostí typu Zakaznik. Uživatelský typ Zakaznik je vnořený do typu Prodej. Odkazy na jednotlivé součásti struk− tury LednovyProdej ukazuje poslední příkaz našeho příkladu. Pole: Pole jsou posledním druhem proměnných, o kterých ještě nebyla řeč. Pojem pole je zná− mý snad ze všech programovacích jazyků. Jeho prvky mají vždy stejný datový typ (po− kud je pole typu Variant, mohou jednotlivé prvky samozřejmě obsahovat různé druhy dat). Pole se dají deklarovat stejně jako ostatní proměnné pomocí klíčového slova Dim,
33
UČEBNICE VISUAL BASICU 6.0 Private, Public nebo Static. Je možné definovat dynamická pole nebo pole s pevnými rozměry. U deklarace pole s pevnými rozměry se za identifikátor proměnné do kulatých závorek uvádí horní, případně dolní mez indexů.
Příklad: Dim intPole(20) As Integer Dim dbPole(1 To 20) As Double
Pole intPole je pole jednadvaceti hodnot typu Integer (indexy v rozsahu 0 – 20). Pole dbPole je pole dvaceti hodnot typu Double (indexy v rozsahu 1 – 20). Při určení horní i dolní meze indexového pole použijte v deklaraci klíčové slovo To.
TIP: Všimli jste si, že pokud neuvedete dolní mez indexů, je tato mez implicitně nastavena na 0. To se dá změnit, pokud v deklarační sekci (General) příslušného modulu uvedete příkaz Option Base následovaný nejnižším platným indexem. Příkazem Option Base 1 nadefinujete implicitní dolní mez indexů polí na hodnotu 1.
TIP: Ve Visual Basicu je možné deklarovat i vícerozměrná pole až do dimenze 60. Následující deklarace definuje třírozměrné pole s rozměry 4x5x20. Dim int3D(3, 1 To 5, 6 To 25)
Vícerozměrná pole s pevnými mezemi je třeba užívat uváženě, aby nedocházelo ke zby− tečně velké alokaci paměti, která nebude v průběhu vykonávání programového kódu potřeba. Zvláště pole prvků datového typu Variant mohou zabrat v paměti počítače ne− přiměřeně velkou oblast. Dynamická pole představují lákavou alternativu ve chvílích, kdy počet prvků pole ne− ní předem znám. Deklarace takového pole se provede bez určení horní a dolní meze indexů.
Příklad: Dim intPole1() As Integer
Deklarace je v tomto případě stejná pro jedno− i vícedimenzionální pole. Než ale může− te prvkům dynamického pole přiřadit konkrétní hodnoty, musíte velikost pole jedno− značně určit pomocí klíčového slova ReDim. To se však děje už v těle procedury (niko− li tedy v deklarační části) třeba na základě předchozích výpočtů. Tímto způsobem je možné lépe a úsporněji využít paměť počítače a po použití pole ho z paměti opět od− alokovat tím, že poli přiřadíte minimální rozměry – např. Function MojeFunkce () As Integer
34
ČÁST 1 – OBECNÉ ZÁSADY PROGRAMOVÁNÍ Dim intPole1() As Integer Rem Začátek těla funkce ReDim intPole1(99, 10)
’ Alokace dynamického pole 100x11
Rem Pokračování funkce ReDim intPole1(0)
’ Odalokování pole z paměti
End Function
Každým uvedením příkazu ReDim ztratíte všechny hodnoty pole, které v něm byly ulo− žené. Často je to v souladu s vaším přáním. Pokud však chcete pouze rozšířit pole o ně− kolik prvků, může být ztráta dat na škodu. Situace se dá řešit za pomoci klíčového slo− va Preserve. Tímto způsobem však můžete pouze zvětšit horní indexovou mez u po− sledního rozměru pole. Každé jiné použití klíčového slova Preserve vygeneruje chybu. Je tedy možné použít následující sekvenci: ReDim intPole1(10,10) ReDim Preserve intPole(10, 20)
Místo druhého řádku našeho příkladu však již není možné uvést: ReDim Preserve intPole(20, 20)
První rozměr pole intPole musí v tomto případě zůstat zachován.
Deklarace konstant Konstanta představuje symbolický název, kterému je přiřazen řetězec nebo číslo, které se nemění. Definice konstant je výhodnější pro přehlednost a význam konstantních hod− not v programovém kódu. Některé konstanty jsou definované systémem (např. některé konstanty pro přístup k da− tům), které jsou dostupné v kterémkoli modulu aplikace. Sám systém Visual Basic defi− nuje velké množství konstant, z nichž některé byly již popsány v části knihy věnované ovládacím prvkům a jejich vlastnostem. Všechny druhy konstant lze využít v pro− gramovém kódu Visual Basic. Konstanty definované systémem Visual Basic jsou všech− ny veřejné, tj. lze je použít v kterékoli proceduře v kterémkoli modulu vaší aplikace. Kromě těchto konstant může uživatel nadefinovat i své vlastní konstanty pomocí klíčo− vého slova Const. Definice vlastních konstant má následující syntaxi: [Public|Private] Const názevkonstanty [As typ] = výraz Pravidla pro definici konstant jsou velmi podobná jako pro deklaraci proměnných. Kon− stanty mohou být definovány jako veřejné či soukromé. Není−li explicitně uvedeno, jsou konstanty považovány za soukromé. Veřejné konstanty je však možné definovat pouze ve standardním modulu – nikoli v modulu sestavy nebo formuláře.
35
Část 2
Programování ve Visual Basicu
Lekce 4
Popis a použití ovládacích prvků TextBox, CommandButton, ListBox Cíle lekce: Osvojit si ovládání a programování jednoduš− ších ovládacích prvků pro zobrazování dat. V aplikacích naprogramovaných ve Visual Basicu uživatel často pracuje s daty, která bý− vají zobrazena ve standardních ovládacích prvcích. Tato lekce popisuje a na vzorovém příkladu vysvětluje základní možnosti programování nejčastěji používaných ovláda− cích prvků. Těmito prvky jsou TextBox, Label, CommandButton, ListBox, ComboBox. Otevřete si Pracovní prostředí Visual Basicu a založte nový projekt Standard EXE. Na nový formulář projektu umístěte ovládací prvek ListBox. Schématická ikona tohoto prvku je standardně umístěna v Toolboxu. Název (vlastnost Name) Listboxu změňte na hodnotu lstZeme.
TIP: Co to vlastně je ListBox? Listbox je prvek, ve kterém se zobrazuje seznam položek, ze kterých lze jednu nebo více položek vybírat. Konkrétním příkladem ListBoxu v operačním systému Windows je třeba seznam nainstalovaného programového vybavení v Ovládacích panelech pod ikonou Přidat nebo ubrat programy – viz obr. 13.
obr. 13 Příklad ListBoxu použitého v operačním systému Windows.
39
UČEBNICE VISUAL BASICU 6.0 Existuje mnoho vlastností ListBoxu, ze kterých si nyní popíšeme ty nejdůležitější. Je zřej− mé, že ve vlastnostech tohoto ovládacího prvku je nutné zadefinovat seznam položek, které bude ListBox zobrazovat. K tomu slouží vlastnost List. Tato vlastnost nemá jedinou hodnotu, ale jedná se vlastně o pole hodnot, které jsou vlast− nosti přiřazeny. Pokud se podíváte do okna vlastností prvku ListBox a najdete vlastnost list, zjistíte, že jednotlivé položky lze zapsat pod sebe do rozbalovacího seznamu (viz obr. 14). Do tohoto seznamu lze zadávat jednotlivé položky jak ve stavu návrhu aplika− ce, tak i programovým kódem při jejím běhu (naučíme se později v této lekci). Nyní za− pište do seznamu Názvy zemí tak, jak to ukazuje obr. 14.
obr. 14 Příklad zadání hodnot vlastnosti List při návrhu aplikace. Další možností ListBoxu, která je velmi užitečná, je to, že programátor může každé po− ložce pole vlastnosti List přiřadit číselnou hodnotu. Pole těchto hodnot se zapisuje do vlastnosti ItemData.
TIP: Zatímco pole hodnot vlastnosti List je typu String, vlastnost ItemData může obsahovat pouze číselné položky. Příkladem použití vlastnosti ItemData může být telefonní seznam, kde v ListBoxu uživatel vybere zemi, do které chce telefonovat. ListBox bude v takovém případě zobrazovat seznam zemí a ve vlastnosti ItemData bude ke každé zemi přiřazena číselná předvolba telefonního čísla.
Při návrhu aplikace jsou položky seznamu List a ItemData v odpovídajícím pořadí. Po− kud nezadáte číselnou hodnotu ItemData k některé položce seznamu List, přiřadí jí Vi− sual Basic automaticky nulu. Naopak při vymazání položky ze seznamu se automaticky smaže i odpovídající údaj v poli ItemData. To znamená, že počet položek seznamů List a ItemData je v každém okamžiku vždy stejný. Naplňte tedy i pole ItemData libovolnými čísly. Formulář s ovládacím prvkem ListBox teď bude vypadat podobně jako na obr. 15.
40
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
obr. 15 Formulář s vyplněným prvkem ListBox ve stavu návrhu aplikace V naší vzorové aplikaci budeme chtít s položkami seznamu ListBox také programově ma− nipulovat. Konkrétně si předvedeme, jak programově odchytit zvolenou položku a jí při− řazené číslo v ItemData. Položku včetně jejího čísla budeme zobrazovat v TextBoxu. Umístěte tedy na formulář dva TextBoxy, z nichž první (Text1) bude zobrazovat řetězco− vou položku z ListBoxu a druhý (Text2) jí odpovídající hodnotu z pole ItemData. Zároveň na formulář umístěte i CommandButton, který bude sloužit k přenesení zmíně− ných údajů o aktuálně zvolené položce z ListBoxu do obou výše zmíněných TextBoxů. Vlastnost Name prvku CommandButton nechte na implicitní hodnotě Command1. Změňte pouze vlastnost Caption (tj. titulek – nápis, jenž bude na tlačítku zobrazen) na „Přenes“. Formulář bude nyní vypadat podle obr. 16.
obr. 16 Formulář rozšířený o další ovládací prvky Slíbili jsme si, že si ukážeme také možnost dynamického přidávání položek do ListBoxu již za běhu aplikace. Tato část bude fungovat tak, že uživatel zadá do dvou různých TextBoxů číselnou i řetězcovou hodnotu, které se po klepnutí na další CommandButton přidají do polí List a ItemData původního ListBoxu. Za tímto účelem přidejte do našeho formuláře další dva TextBoxy (Text3 a Text4) a je− den CommandButton. Vlastnost Caption tlačítka nastavte tentokrát na hodnotu „Přidej“. Formulář bude tentokrát vypadat jako na obr. 17.
41
UČEBNICE VISUAL BASICU 6.0
obr. 17 Formulář rozšířený o další ovládací prvky Tím je návrh formuláře hotový a můžeme přikročit k programování událostí, které se nad ovládacími prvky umístěnými ve formuláři na obr. 17 vyskytnou. Nejprve musíme zobrazit programový modul formuláře, o kterém víme, že je již implicit− ně vytvořen spolu s formulářem, i když jej nevidíme v okně projektu. V okně projektu tedy zvolte formulář, na který jste umístili prvky (bude tam pouze jeden formulář – viz obr. 18) a v tom samém okně klepněte na ikonu View code (prohlédnout kód). Zobra− zí se plocha modulu, do kterého budeme přidávat kód.
obr. 18 Okno projektu Z levého ovládacího pole modulu – v tomto poli bude nejprve zobrazen text (General) – zvolte položku Command1. To je název CommandButtonu určeného pro zobrazení ak− tuální položky ListBoxu v textových polích Text1 a Text2. V pravém poli si následně zvolte událost, kterou budeme programovat – událost Click. Do takto sestavené procedury zapište následující programový text: Private Sub Command1_Click() Text1.Text = lstZeme.Text With lstZeme Text2.Text = .ItemData(.ListIndex) End With End Sub
42
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU První a poslední řádek představují úvodní a koncový řádek deklarace procedury – tyto řádky již známe, a proto si popíšeme pouze tělo procedury: První řádek těla procedury říká: Do vlastnosti Text textového pole Text1 přiřaď hodnotu vlastnosti Text ovládacího prvku lstZeme. Tedy tu řetězcovou hodnotu ListBoxu, která je v seznamu aktuálně zvolena. Pokud se tato procedura vyvolá v okamžiku, kdy není zvo− lena žádná položka ListBoxu, nastane běhová chyba aplikace. Eliminaci této chyby zajis− tíme v programovém kódu později. Další řádek uvozený klíčovým slovem With pouze uvozuje konstrukci Visual Basicu. Ta říká, že následující řádky programového kódu budou pracovat s objektem lstZeme a je− ho název se tudíž v následujícím textu nemusí vyskytovat. Následující řádek přiřazuje do vlastnosti Text textového pole Text2 aktuální číselnou hod− notu ItemData. Řádek je vlastně zkráceným zápisem Text2.Text = lstZeme.ItemData(lstZeme.ListIndex)
Na pravé straně přiřazení je hodnota pole ItemData určená indexem lstZeme.ListIndex. Aktuální index zvolené položky ListBoxu je, jak vidno z použité syntaxe, uložen jako hodnota vlastnosti ListIndex.
TIP: Vlastnost ListIndex nenajdete v okně vlastností příslušného ovládacího prvku. Tato vlastnost je příkladem toho, že některé vlastnosti jsou dostupné pouze programovým kódem za běhu aplikace.
Následuje již jen ukončení konstrukce With.
TIP: Vlastnost Text je u ovládacího prvku implicitně předdefinovaná. To znamená, že se v zápisu kódu nemusí uvádět. Znamená to, že zápis Text2.Text = .ItemData(.ListIndex) je ekvivalentní se zápisem Text2 = .ItemData(.ListIndex).
Na obr. 19 je zobrazeno okno modulu formuláře s naprogramovanou první procedurou.
Obr. 19 Okno modulu formuláře
43
UČEBNICE VISUAL BASICU 6.0 Nyní zajistíme, aby při prvním natažení formuláře bylo znepřístupněno tlačítko Com− mand1. Při natažení formuláře není zvolena žádná položka ListBoxu, a proto musíme předejít spuštění procedury Command1_Click, ve které by jinak vznikla běhová chyba. Událost natažení formuláře Form_Load vznikne vždy při natahování formuláře do pamě− ti těsně před jeho zobrazením na monitoru: Private Sub Form_Load() Command1.Enabled = False End Sub
V této proceduře přiřadíme vlastnosti Enabled prvku Command1 hodnotu False. Příka− zové tlačítko se tedy na formuláři zobrazí jako nedostupné, zšedlé. Stejně jak jste na to zvyklí z běžných aplikací Windows, které obsahují nedostupná tlačítka. Podobným způsobem teď naprogramujeme událostní proceduru lstZeme_Click, tedy odezvu na událost Click, která vznikne na ovládacím prvku ListBox: Private Sub lstZeme_Click() If lstZeme.SelCount > 0 Then Command1.Enabled = True End Sub
Aplikaci vylepšíme tím, že údaje z ListBoxu se budou do textových polí Text1 a Text2 vypisovat i po poklepání na určitou položku seznamu. Proto přidáme do projektu další událostní proceduru: Private Sub lstZeme_DblClick() If lstZeme.SelCount > 0 Then Command1_Click End Sub
Při poklepání na ovládací prvek lstZeme tato procedura zkontroluje, jestli je aktivní ně− která položka seznamu. Pokud ano, zavolá proceduru Command1_Click – tedy stejnou akci, jakou vyvolá uživatel klepnutím na tlačítko Command1. Další funkcí bude naprogramování tlačítka Command2, které má sloužit k přidání polož− ky do seznamu lstZeme. Procedura očekává textový řetězec v TextBoxu Text3 a odpoví− dající číselnou hodnotu ItemData v poli Text4: Private Sub Command2_Click() lstZeme.AdItem Trim(Text3) With lstZeme .ItemData(.NewIndex) = Text4 End With End Sub
První řádek těla procedury vyvolává metodu AdItem ovládacího prvku lstZeme. Parametrem této metody je řetězcová hodnota textového pole Text3. Funkce Trim je vestavěnou funkcí Visual Basicu a používá se k vypuštění případných mezer na začátku a konci textového ře− tězce.
44
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Například příkaz Trim(“ ahoj, světe “) vrátí hodnotu řetězce „ahoj, světe“. Mezera mezi slovy tedy zůstane zachována.
Do pole ItemData příslušného ovládacího prvku je následně nutné vložit hodnotu obsa− ženou v textovém poli Text4. Dříve vyvolaná metoda AdItem automaticky přiřadila nové položce jedinečný index. Hodnota posledního vytvořeného indexu se uchovává ve vlast− nosti NewIndex – tato vlastnost je také využita při zanesení hodnoty do pole ItemData. Procedura Sub Command2_Click předpokládá, že obě pole Text3 a Text4 jsou vyplněna korektně – tedy že v okamžiku jejího spuštění Text3 obsahuje řetězec znaků a Text4 číslo.
TIP: Pokud Text4 nebude obsahovat platnou číselnou hodnotu, nastane v proceduře Command2_Click běhová chyba.
Tuto situaci je také třeba programově ošetřit. Provedeme to v několika krocích: Nejprve doplníme proceduru Form_Load takto: Private Sub Form_Load() Command1.Enabled = False Command2.Enabled = False End Sub
Dále je nutné zkontrolovat, zda Text4 obsahuje číselnou hodnotu a pokud ano, zpřístup− níme tlačítko Command2.
TIP: Pro kontrolu, jestli hodnota je číselná použijeme opět vestavěnou funkci Visual Basicu IsNumeric, která vrací hodnotu typu Boolean – False v případě, že argument není číslo, True v případě, že číslem je.
Procedura, kterou naprogramujeme bude vypadat takto: Private Sub Text4_LostFocus() If IsNumeric(Text4) Then Command2.Enabled = True Else Beep Command2.Enabled = False MsgBox “Hodnota není číselná“, vbCritical End If End Sub
Setkáváme se zde s novou událostí – LostFocus (při ztrátě fokusu neboli zaměření).
45
UČEBNICE VISUAL BASICU 6.0
TIP: Ovládací prvek je zaměřen (má fokus), pokud s ním uživatel zrovna pracuje. TexBox má fokus v případě, že je v něm umístěn čárkový kurzor, CommandButton má fokus, pokud je zvýrazněn čárkovanou čarou – viz obr. 20, atp. Přesun fokusu z prvku na prvek může uživatel provádět například klepnutím myší na určitý prvek nebo klávesou Tab. Na aktivním formuláři existuje vždy právě jeden ovládací prvek se zaměřením. Zaměřen může být i formulář jako celek.
obr. 20 Tlačítko Update má právě fokus, tlačítko Zavřít nikoli. Kontrola, zda Text4 obsahuje číselnou hodnotu, se provede vždy při opuštění tohoto po− le. Funkce Beep vyvolá akustické pípnutí, které uživatele upozorní, že něco není v po− řádku.
TIP: V následujících lekcích si ukážeme další způsoby jak kontrolovat, zda zadávané hodnoty jsou požadovaného datového typu. V naší první aplikaci však s tímto způsobem vystačíme.
Naučíme se také vypustit položku ze seznamu ListBox. Pokud má ListBox fokus a uživa− tel stiskne klávesu Delete na klávesnici, bude vymazána aktuální položka seznamu. Doplňte tedy do projektu následující proceduru: Private Sub lstZeme_KeyDown(KeyCode As Integer, Shift As Integer) If (lstZeme.SelCount > 0) And (KeyCode = vbKeyDelete) Then If MsgBox(“Opravdu smazat?“, vbYesNo + vbQuestion)= vbYes Then lstZeme.RemoveItem (lstZeme.ListIndex) End If End If End Sub
Setkáváme se zde opět s novou událostí – KeyDown (stlačení klávesy na klávesnici). Uvědomte si, že procedura lstZeme_KeyDown se provede pouze v případě, že ovládací prvek lstZeme je právě zaměřen a uživatel stlačí libovolnou klávesu. Tato vstupní procedura má také dva vstupní parametry, podle kterých může programá− tor zjistit, která klávesa byla stisknuta. Prvním parametrem je KeyCode. Ten při aktivování procedury obsahuje číselný kód klávesy.
46
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Aby byl programový kód přehlednější má Visual Basic nadefinováno velké množství globálních konstant, které lze v v programech použít. Např. výše použitá konstanta vbKeyDelete má hodnotu 46 – číselný kód klávesy Delete. Podobně jsou definovány také konstanty vbKeyF1 (klávesa F1), vbKeyHome (klávesa Home) a mnohé další.
Druhým parametrem je Shift. Pokud je stisknuta klávesa spolu s některým přepínačem (tj. Shift, Alt nebo Ctrl), umožňuje tento parametr zjistit, která kombinace přepínačů by− la stisknuta zároveň. Pokd je stisknut samotný přepínač Shift, má parametr Shift hodnotu 1. Pro přepínač Ctrl je to hodnota 2 a pro Alt hodnota 4. Je−li stisknuto více přepínačů najednou, hodnoty se sčítají. Pokud byly např. stisknuty přepínače Ctrl a Alt, má parametr Shift hodnotu 6 atd. V případě, že nebyl stisknut žádný přepínač, má parametr Shift hodnotu 0.
TIP: Podobně jako událost KeyDown lze používat i událost KeyUp, která vznikne při uvolnění klávesy.
Při aktivace procedury lstZeme_KeyDown musíme nejprve zjistit, jestli stisknutou kláve− sou bylo Delete a zda je zvolena aktivní položka seznamu. Tyto dvě podmínky musejí platit zároveň, a proto jsou v první podmínce If spojeny logickým součinem (operátor AND). V případě splnění obou podmínek se vyvolá okno se zprávou vyžadující potvrzení, že položka má být opravdu smazána. Stiskne−li uživatel tlačítko „Ano“, aktivní položka se opravdu vymaže. K tomu slouží metoda RemoveItem ovládacího prvku lstZeme. Argu− mentem metody je index položky, která má být vymazána.
obr. 21 Hotová aplikace demonstrující použití ovládacích prvků ListBox, CommandBut− ton a TextBox.
47
UČEBNICE VISUAL BASICU 6.0
Otázky a úkoly: 1. Zopakujte si, jaké události jsme se u jednotlivých ovládacích prvků naučili progra− movat a kdy se tyto události aktivují. 2. Zkuste si pomocí vlastnosti Enabled střídavě zpřístupnit a znepřístupnit ovládací prvky TextBox a ListBox. 3. Podobnou vlastností jako Enabled je u většiny ovládacích prvků vlastnost Visible. Vyzkoušejte si její funkci v právě naprogramované aplikaci. V čem se obě vlastnosti liší?
48
Lekce 5
Práce s textovými řetězci Cíle lekce: Naučit se skládat textové řetězce, vyhledá− vat a formátovat podřetězce, naučit se ovlá− dat vestavěné funkce Visual Basicu určené pro práci s řetězci. V minulé lekci jsme se naučili používat ovládací prvky, které nejčastěji zobrazují da− ta. Předpokládali jsme, že data (ať již textová nebo číselná) jsou v ovládacích prvcích zadána ve správném tvaru a není je nutné již dále upravovat. V praxi se však setkáte s potřebou upravovat řetězce znaků pro jejich další použití. Jedná se vlastně o malé úlohy, které je nutné řešit v rámci větších projektů. Typickými úlohami pro práci s ře− tězci jsou např.: • zjištění podřetězce ze zadaného řetězce znaků • spojení několika řetězců v jediný • rozdělení jediného řetězce na několik částí • zjištění, zda se ve vstupním řetězci vyskytuje určitá posloupnost znaků a pokud ano tak kolikrát. • Zobrazení řetězce uloženého v jediné proměnné typu String na několika řádcích. Tyto a podobné úlohy budete muset řešit nejen při zpracovávání velkého množství vstupních dat v textových souborech, ale i při standardní práci s databázovými daty. Prvním příkladem, na němž si demonstrujeme práci s daty, bude aplikace, která přečte křestní jméno a příjmení zadané v jednom textovém poli, rozpozná křestní jméno od pří− jmení a každé zvlášť zapíše do jiného TextBoxu. Budeme předpokládat, že jméno i příjmení je vždy právě jedno slovo. Proto otevřete prostředí Visual Basicu a založte nový projekt s jediným formulářem. Umístěte na něj ovládací prvky tak, jak vidíte na obr. 22.
obr. 22 Nový formulář pro demonstraci práce s řetězci
49
UČEBNICE VISUAL BASICU 6.0 Názvy textových polí odshora dolů pojmenujte podobně jako jejich popisky: txtCele, txtKrestni, txtPrijmeni. Ovládací prvek CommandButton pojmenujte cmdRozdel. Aplikace bude mít jednu jedinou funkci – jméno zapsané do pole txtCele rozdělí do dvou dalších polí. K tomu poslouží dvě událostní procedury: Private Sub cmdRozdel_Click() Dim Cele As String Dim Prijmeni As String Dim Krestni As String Dim Pozice As Integer Cele = Trim(txtCele.Text) If Cele = „“ Then MsgBox “Není vloženo jméno!“ Exit Sub End If Pozice = InStr(Cele, “ “) If Pozice = 0 Then MsgBox “Musí být vloženo napsat křestní jméno i příjmení!“ Exit Sub End If Krestni = Left(Cele, Pozice – 1) Prijmeni = LTrim(Mid(Cele, Pozice)) Pozice = InStr(Prijmeni, “ “) If Pozice <> 0 Then MsgBox “Smí být vloženo pouze křestní jméno a příjmení!“ Exit Sub End If txtKrestni.Text = Krestni txtPrijmeni.Text = Prijmeni End Sub Private Sub txtCele_Change() txtKrestni.Text = ““ txtPrijmeni.Text = ““ End Sub
Procedura txtCele_Change zajišťuje pouze vymazání textových polí txtKrestni a txtPrijme− ni, kdykoli začne uživatel psát do pole txtCele.
50
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Událost Change nastává nad každým ovládacím prvkem zpravidla ve chvíli, kdy se změní jeho hodnota.
Procedura cmdRozdel_Click má deklarované tři řetězcové proměnné a jednu proměnnou datového typu Integer. Nejprve se do proměnné „Celé“ uloží text zapsaný v textovém po− li txtCele, ovšem zbavený případných mezer na začátku a na konci celého řetězce. Pokud není v poli txtCele vložen žádný text, bude vypsáno hlášení a příkazem Exit Sub ukončena činnost událostní procedury. Novinkou je pro nás řádek kódu Pozice = InStr(Cele, “ “). Tento řádek přiřazuje do pro− měnné „Pozice“ číselnou pozici první mezery v řetězci uloženém do proměnné „Cele“. Funkce InStr je tedy vestavěnou funkcí Visual Basicu se dvěma argumenty: prvním je pro− hledávaný řetězec. Druhým pak řetězec znaků, který má být v prvním řetězci nalezen.
TIP: V našem případě je druhým řetězcem jediný znak, funkci InStr ale můžete využít i pro vyhledávání celých posloupností znaků.
Funkce může obsahovat i třetí, nepovinný argument. Tento argument specifikuje typ po− rovnávání řetězců a může nabývat následujících hodnot: 0 – binární porovnávání (záleží na velikosti písmen) 1 – textové porovnávání (nezáleží na velikosti písmen) 2 – typ porovnávání je závislé na nastavení databáze Pokud je tento třetí argument vynechán, použije se předdefinovaná hodnota 0 – tj. bi− nární porovnávání.
TIP: Je možné nastavit typ prohledávání pro celý modul nebo projekt. Pokud to chcete udělat, definujte předdefinovanou hdnotu třetího argumentu v sekci (General) příkazem Option Compare, za kterým následuje celé číslo v rozsahu od 0 do 2. Tato hodnota se pak použije jako předdefinovaná nejen ve funkci InStr ale i v jiných funkcích pracujících s řetězci znaků – viz dále.
Funkce InStr vrací pořadové číslo prvního znaku, kterým začíná hledaný řetězec. Pokud hledaný řetězec není nalezen, návratová hodnota je 0. To znamená: InStr(“Alfa beta“, „ „) vrací číslo 5, InStr(“Leze leze po železe“, “leze“) vrací číslo 6 InStr(“Leze leze po železe“, “leze“, 1) vrací číslo 1 InStr(“Leze leze po železe“, “lze“) vrací číslo 0
51
UČEBNICE VISUAL BASICU 6.0 Pokud tedy text v poli txtCele neobsahuje mezeru (tj. proměnná „Pozice“ má hodnotu 0), znamená to, že nebylo zadáno celé jméno skládající se z křestního jména a příjmení. I v tomto případě se činnost procedury ukončí. Další řádek kódu Krestni = Left(Cele, Pozice – 1) slouží k přiřazení křestního jména do proměnné „Krestni“. Je použita funkce Left, která vrací levý podřetězec zadaného texto− vého řetězce. Prvním argumentem je zadaný řetězec, druhým počet znaků zleva, které mají být vráceny. V našem případě je vráceno křestní jméno, tedy všechny znaky až ke dříve identifikované mezeře. Zbytek řetězce by správně měl obsahovat příjmení s předřazenou mezerou. Proto se ten− to zbytek přiřadí do proměnné „Prijmeni“ na příkazovém řádku Prijmeni = LTrim(Mid(Cele, Pozice))
Tento řádek obsahuje dvě funkce (Mid a LTrim) vnořené do sebe. Podle závorkové kon− vence obecně platné v matematice se nejprve provede vnitřní funkce Mid. Tato funkce slouží k výběru podřetězce ze zadaného řetězce. Funkce Mid má obecně tři argumenty: • prvním je řetězec znaků, z něhož se má podřetězec vytvořit • druhým je pořadové číslo počátečního znaku v řetězci – tj. pozice, od které má začínat podřetězec • třetí argument je volitelný a udává počet znaků, které mají být v podřetězci vrá− ceny. Pokud tento argument není uveden (jako v našem případě), vrátí se všech− ny znaky do konce řetězce.
Příklady Mid (“Leze leze po železe“, 6) vrací „leze po železe“ Mid (“Leze leze po železe“, 6, 9) vrací „leze po ž“ Podřetězec, který vrací funkce Mid, vstupuje jako jediný argument do funkce LTrim. Ta− to funkce, podobně jako výše uvedená funkce Trim, zbavuje řetězec mezer – tentokrát však pouze těch, které jsou uvedeny před prvním znakem, který není mezera.
TIP: Stejně jako LTrim existuje také funkce RTrim, která zbavuje řetězec mezer, které jsou umístěny na konci řetězcového argumentu funkce.
Pokud i po této akci obsahuje řetězec uložený v proměnné Prijmeni mezeru, znamená to, že příjmení sestává nejméně ze dvou slov, což je v předpokladech naší aplikace ne− přípustné. Proto poslední podmínka zjišťuje, zda jako celé jméno byla zadána ne více než dvě slova. Teprve v případě, že je vše v pořádku, přiřadí se hodnoty proměnných „Krestní“ a „Prijmeni“ do polí txtKrestni a txtPrijmeni.
52
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Adekvátně k funkci Left existuje také funkce Right, která vrací pravý podřetězec z udaného řetězce. Syntaxe této funkce je: Right(prohledávaný_řetězec, počet_vrácených_znaků_zprava) Např.: Right(“Leze leze po železe“, 6) vrací „železe“
obr. 23 Spuštěná aplikace.
Otázky a úkoly: 1. Napište příklad uváděný v této lekci do programového prostředí Visual Basicu a vy− zkoušejte zadat různé textové řetězce do pole txtCele. Zkuste vždy předem odhad− nout, jak se program zachová po klepnutí na tlačítko cmdRozdel. 2. V příkladu je použita funkce Mid. Nahraďte ji v programovém kódu funkcí Right tak, aby funkčnost programu zůstala nezměněna. 3. Jak bude procedura cmdRozdel_Click pracovat v případě, že mezi jménem a pří− jmením nebude pouze jedna, ale libovolný větší počet mezer? Proč?
53
Lekce 6
Další funkce a pokročilá práce s řetězci Cíle lekce: Naučit se používat všechny vestavěné funkce Visual Basicu pro práci s řetězci znaků, formátování řetězců, vysvětlena bu− de i konverze číselných datových typů na řetězce a obráceně. Práce s řetězci znaků je při programování velice častá. Ukázali jsme si to na jednodu− chém příkladu v předcházející lekci. Nyní se naučíme používat další z velkého množství funkcí pro konverzi řetězců, formátování a další manipulaci s nimi. Prvním bude funkce pro porovnávání řetězců. Pokud porovnáváte dva řetězce, můžete samozřejmě použít jednoduché operátory „je větší“ (>) nebo „je menší“ (<). Mnohem efektivnější je ovšem použití funkce StrComp.
TIP: Dva řetězce se porovnávají podle kódových čísel svých počátečních znaků – stejným způsobem probíhá v počítači rovnání podle abecedy. Pamatujte si – číslice jsou v kódové tabulce před velkými i malými písmeny Asc(“0“) = 48, Asc(“A“) = 65, Asc(“a“) = 97. Několik příkladů:
• „ZLO“ je pro počítač menší než „zlo“. • „aabb“ je větší než „aa“ • „01alfa“ je menší než „Alfa01“ Funkce StrComp má následující syntaxi: StrComp(string1, string2[, typ_porovnani])
První dva argumenty jsou povinné a představují dva porovnávané řetězce. Třetí argument je nepovinný a představuje definici toho, jakým způsobem se budou oba řetězce porov− návat – jeho význam byl popsán v předcházející lekci u výkladu věnujícího se funkci InStr. Výsledkem porovnávání mohou být tyto hodnoty: • string1 je menší než string2, funkce vrací hodnotu −1 • string1 je roven string2, funkce vrací hodnotu 0 • string1 je větší než string2, funkce vrací hodnotu 1 • string1 nebo string2 má hodnotu Null, funkce vrací hodnotu Null
55
UČEBNICE VISUAL BASICU 6.0 Pokud potřebujete naplnit řetězcovou proměnnou jedinou hodnotou, použijte funkci String. Tato funkce má dva argumenty – počet opakování a znak, který se má opako− vat. Např.: String(5, “r“) vrací „rrrrr“
TIP: Podobnou funkcí jako String je funkce Space. Tato funkce vrátí zadaný počet mezer. Tedy String(5, “ “) pracuje stejně jako Space(5).
Velice užitečnou funkcí je také možnost zjištění počtu znaků v řetězci (délky řetězce) funkcí Len. Funkce má jediný argument – řetězec, jehož délka se zjišťuje. Např.: Len(„Alfa“)
vrací hodnotu 4
LSet, RSet Tyto funkce jsou vhodné pro opakované naplnění řetězcové proměnné tak, aby velikost řetězce (Hodnota funkce Len) zůstala stále stejná. Pokud je nový řetězec kratší, bude za− rovnán vlevo (LSet), resp. vpravo (RSet). Zbytek řetězce bude doplněn mezerami. Např.: MujString = “0123456789“ LSet MujString = “<-Left“
Po provedení těchto dvou řádků bude proměnná MujString obsahovat hodnotu „<−Left“ MujString = “01234“ LSet MujString = “<-Left“
Po provedení těchto dvou řádků bude proměnná MujString obsahovat hodnotu „<−Lef“ MujString = “0123456789“ RSet MujString = “Right->“
Po provedení těchto dvou řádků bude proměnná MujString obsahovat hodnotu „Right−>“
TIP: Jistě jste si všimli, že pokud chcete zobrazit uživateli nějakou zprávu pomocí funkce MsgBox, je tato zpráva zobrazena vždy na jeden řádek. Pokud chcete zprávu rozdělit na více řádků, musíte do zobrazovaného textu zakomponovat speciální řídící znak pro konec odstavce. Tento znak má kódové číslo 13. Zkuste tedy zapsat: MsgBox “První řádek“ & Chr(13) & “Druhý řádek“, vbInformation, “Víceřádková zpráva“
56
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
obr. 24 Víceřádková zpráva zobrazená funkcí MsgBox Kromě uvedených funkcí pro práci s řetězci můžeme ve Visual Basicu používat také množství konverzních funkcí. Tyto funkce konvertují datový typ svého argumentu na ji− ný – většinou se konvertuje datový typ String na některý z číselných typů nebo naopak. Asc Argumentem funkce Asc je řetězec znaků. Funkce vrací hodnotu Integer, která odpoví− dá kódu prvního znaku v řetězci. Vrácená hodnota je z oboru 0 – 255. Např.: Asc(„Alfa“)
vrací hodnotu 65.
Chr Inverzní funkcí je funkce Chr, jejímž argumentem je celé číslo 0 – 255. Funkce vrací znak odpovídající udanému kódu. Např.: Chr(65)
vrací velké A.
Chr(Asc(„Alfa“))
vrací velké A.
CStr Výsledkem funkce je vždy textový řetězec. • pokud je argumentem funkce hodnota typu Boolean, je výsledkem řetězec „True“ nebo „False“, • pokud je argumentem funkce hodnota typu Date, je výsledkem datum v krátkém formátu datumu. Přesný formát závisí na nastavení Místních nastavení v Ovláda− cích panelech, • pokud je argumentem funkce libovolná číselná hodnota, bude tato hodnota vrá− cena ve formě řetězce. Např.: CStr(#12/30/99#)
vrací “30.12.1999“, pokud máte nastavené české prostředí
Format Mnohem příjemnější funkcí pro formátování datumů, čísel nebo řetězců je Format. Při jednodušším použití této funkce je prvním argumentem formátovaný řetězec, druhým pak specifikace formátu, do kterého se má řetězec přeformátovat.
57
UČEBNICE VISUAL BASICU 6.0 Např.: vrací „148,90“ pokud máte v Místních nastaveních v Ovláda− cích panelech nastaven desetinný oddělovač na čárku. (Znak # je zástupným znakem pro libovolnou číslici).
Format(148.9, “###0.00“)
vrací „alfa“. Řetězec je převeden na malá písmena. Funkce je shodná s funkcí LCase(“Alfa“). LCase je speciální funkce pro převod argumentu na malá písmena.
Format(“Alfa“, “<“)
vrací „ALFA“. Řetězec je převeden na velká písmena. Funkce je shodná s funkcí UCase(“Alfa“). UCase je speciální funkce pro převod argumentu na vel− ká písmena.
Format(“Alfa“, “>“)
vrací např. „17:04“ podle právě aktuálního systémového času po− čítače, na němž je program spuštěn.
Format(Now, “hh:mm“)
TIP: Funkce Now zjišťuje aktuální datum a čas ve chvíli, kdy byla zavolána. Např.: „6.3.2000 09:28:17“
Str Funkce Str pracuje podobně jako funkce CStr – převádí číselný argument na řetězcovou hodnotu. Na rozdíl od funkce CStr interpretuje funkce Str jako oddělovač desetinných míst pouze tečku. Val Tato funkce je inverzní k funkci Str. Funkce Val očekává řetězcový argument a vrací čí− selnou hodnotu obsaženou v řetězci. Např.: Val(“ 2 56
7“)
vrací 2567.
Val(“37 and 57“)
vrací 37.
Na závěr lekce jeden užitečný příklad. Funkci, která nahradí všechny výskyty jednoho podřetězce jiným v rámci delšího textu, si musí programátor naprogramovat sám. Uve− dená funkce je zcela obecná. Používá některé programátorské obraty, které budou vys− větleny v následujících lekcích. Public Function ReplaceString(strTextIn As String, strFind As String, _ strReplace As String, fCaseSensitive As Boolean) As String Dim strTmp As String Dim lngPos As Long Dim intCaseSensitive As Integer On Error GoTo PROC_ERR intCaseSensitive = IIf(fCaseSensitive, 0, 1)
58
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU strTmp = strTextIn lngPos = InStr(1, strTmp, strFind, intCaseSensitive) Do While lngPos > 0 strTmp = Left$(strTmp, lngPos – 1) & _ strReplace & _ Mid$(strTmp, lngPos + Len(strFind)) lngPos = InStr(lngPos + Len(strReplace), _ strTmp, _ strFind, _ intCaseSensitive) Loop ReplaceString = strTmp PROC_EXIT: Exit Function PROC_ERR: MsgBox “Error: “ & Err.Number & “. “ & Err.Description, , _ “ReplaceString“ Resume PROC_EXIT End Function
Funkce očekává čtyři argumenty – první je textový řetězec, v rámci něhož se bude na− hrazovat. Druhý je podřetězec, který bude vyhledáván a nahrazován. Třetí je podřetězec, kterým se bude nahrazovat. Poslední argument je typu Boolean – True znamená, že prohledávání bude rozlišovat velká a malá písmena, False nikoli. Např. ReplaceString(“Leze leze po železe“, “leze“, “+++“, False)
vrací „+++ +++ po že+++“
ReplaceString(“Leze leze po železe“, “leze“, “+++“, True)
vrací „Leze +++ po že+++“
Z uvedených příkladů vidíte, že nahrazovaný a nahrazující řetězec nemusejí být stejně dlouhé.
Otázky a úkoly: 1. Projděte si pečlivě funkci ReplaceString a pokuste se pochopit, jak funguje. 2. Naprogramujte funkci Mid použitím funkcí Left, Right a Len.
59
Lekce 7
Přístup k textovým souborům a manipulace s nimi Cíle lekce: Naučit se zpracovávat textové soubory a po− užívat nástroje pro jejich správu a vytváření. Zpracování textových souborů je jednou z nejčastějších programátorských úloh. V minu− lých lekcích jsme se naučili pracovat s textovými řetězci, ze kterých se textové soubory skládají. Nyní se podíváme na texty v širším kontextu. Před tím, než je možné ze souboru číst nebo do něho zapisovat, je nutné ho nejprve ote− vřít. K tomu slouží příkaz Open. Jeho nejjednoduší použití vypadá takto: Open cesta For mode As [#]cislo_souboru Za příkazem Open je povinný argument cesta, který označuje cestu k souboru, který se bude používat – např.: „c:\dokumenty\soubor.txt“.
TIP: Pokud zadáte pouze název souboru (např.: soubor.txt), musí být tento soubor umístěn v právě aktivním adresáři.
Argument mode je také povinný a označuje mód, ve kterém bude soubor otevřen. Pro− gramátor má k dispozici následující módy: • Append – otevření souboru pro připojení (zápis) nových znaků do souboru. Pouze sekvenčně • Input – otevření souboru pro čtení. Pouze sekvenčně • Output – otevření souboru pro zápis. Pouze sekvenčně • Random – otevření souboru pro nesekvenční přístup • Binary – otevření souboru pro binární přístup. V tomto případě může soubor ob− sahovat nejen text ale i binární data.
TIP: Pokud je soubor otvírán v režimu Append, Binary, Output nebo Random a v udané cestě neexistuje, bude nově vytvořen.
TIP: Pokud je soubor otevřen v jednom z módů Binary, Input nebo Random, je možné jej otevřít znovu příkazem Open s použitím jiného čísla souboru, aniž by bylo nutné jej nejprve zavřít. Při otevření v módech Append a Output je nutné nejprve soubor zavřít příkazem Close.
61
UČEBNICE VISUAL BASICU 6.0 Příklady otevření textového souboru: Příkaz otevření souboru test.txt v sekvenčním Input módu: Open “test.txt“ For Input As #1
Příklad otevření souboru v binárním módu. Bude povolen pouze zápis. Open “test.txt“ For Binary Access Write As #1
Příklad otevření souboru pro sekvenční zápis. Klíčové slovo Shared umožní kterémuko− li jinému procesu číst nebo zapisovat do souboru. Open “test.txt“ For Output Shared As #1
Příklad otevření souboru v binárním módu pouze pro čtení. Jiné procesy nemohou z to− hoto souboru číst (nastevení klíčovými slovy Lock Read), dokud první proces neuzavře soubor příkazem Close. Open “test.txt“ For Binary Access Read Lock Read As #1
Čtení a zápis dat do textového souboru se realizuje pomocí funkcí Input (čtení) a Write (zápis). Zde uveďme příklad zápisu do nového textového souboru: Open “test.txt“ For Output As #1 Write #1, “Text“, 234 Write #1,
První řádek vytvoří nový soubor test.txt, druhý řádek do něho zapíše dvě hodnoty od− dělené čárkou – stringovou hodnotu „Text“ (včetně uvozovek) a číselnou hodnotu 234. Poslední řádek vloží do textového souboru prázdný řádek.
TIP: Všimněte si, že každé použití funkce Write představuje zápis samostatného řádku do výstupního textového souboru.
TIP: Datumy a hodnoty typu Boolean se zapisují ve zvláštním formátu bez ohledu na místní nastavení počítače. Např. následující kód: Open “d:\TESTFILE.txt“ For Output As #1 Write #1, Now Write #1, True
vede k zápisu těchto hodnot do textového souboru: #2000-03-07 13:18:51# #TRUE#
Příklad čtení z textového souboru funkcí Input:
62
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Open “test.txt“ For Input As #1 Do While Not EOF(1) Input #1, MyString, MyNumber Debug.Print MyString, MyNumber Loop Close #1
Příklad předpokládá, že každý řádek souboru test.txt obsahuje dvě hodnoty. Smyčka Do bude probíhat tak dlouho, dokud nebude dosažen konec souboru, jehož číslo je 1. Po− užití funkce EOF (End of File) ke zjištění konce souboru je při zpracování textových nebo binárních souborů velmi obvyklé.
TIP: Příkaz Debug.Print se používá při ladění programu pro tisk hodnot do okna Immediate, které se při spuštění programu v prostředí Visual Basicu objeví, pokud do něho program zapisuje (viz obr. 25). Lze jej zobrazit také explicitně příkazem menu View/Immediate Window.
obr. 25 Okno Immediate se zobrazenými hodnotami.
TIP: Je možné číst také jednotlivé znaky ze souborů otevřených pro sekvenční přístup: Open “d:\TESTFILE.txt“ For Input As #1 Do While Not EOF(1) strRetez = Input(1, #1) Loop Close #1
Argumenty funkce Input jsou řazeny postupně – počet znaků, které se mají číst, číslo souboru, ze kterého se čte.
TIP: Je možné také zjišťovat aktuální pozici v souboru. Zkuste kód z předcházejícího tipu obohatit o příkaz Seek určený pro zjištění aktuální pozice v souboru: Open “d:\TESTFILE.txt“ For Input As #1 Do While Not EOF(1) strRetez = Input(1, #1)
63
UČEBNICE VISUAL BASICU 6.0 Debug.Print Seek(1) Loop Close #1
Čtení a zápis dat do binárního souboru se realizuje pomocí funkcí Get (čtení) a Put (zá− pis). Přístup do binárních souborů je realizován trochu odlišným způsobem než přístup do souborů textových. Vysvětleme si to na následujícím příkladu: Private Type Record ID As Integer Name As String * 20 End Type Dim MyRecord As Record Dim RecordNumber as Variant ‘ Open file for random access. Open “TESTFILE.txt“ For Random As #1 Len = Len(MyRecord) For RecordNumber = 1 To 5 MyRecord.ID = RecordNumber MyRecord.Name = “My Name“ & RecordNumber Put #1, RecordNumber, MyRecord Next RecordNumber Close #1
U binárních souborů je zapotřebí definovat záznam (Record), který bude „datovou jed− notkou“ zápisu a čtení z tohoto souboru. Velikost záznamu se musí udat již při otevírá− ní souboru – viz Len = Len(MyRecord) v příkazu Open. Proměnná MyRecord je datové− ho typu Record – ten je předem zadefinován jako uživatelský typ pomocí klauzule Ty− pe. Funkce Len zjistí jeho velikost a zjištěnou hodnotu přiřadí parametru Len příkazu Open. Následující smyčka For zapíše 5 záznamů do souboru TESTFILE.txt Podobným způsobem je potom možné číst obsah takto vytvořeného souboru: Private Type Record ID As Integer Name As String * 20 End Type Dim MyRecord As Record Dim Position as Integer Open “TESTFILE.txt“ For Random As #1 Len = Len(MyRecord) Position = 3 Get #1, Position, MyRecord Close #1 Debug.Print MyRecord.ID Debug.Print MyRecord.Name
64
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Příklad použití funkce Get dokumentuje skutečnost, že binární soubory (otevřené v mó− du Binary nebo Random) není nutné číst sekvenčně od začátku. Uvedený příklad přečte pouze třetí záznam v pořadí.
TIP: Druhý argument funkce Get (pořadové číslo záznamu) je nepovinný. Pokud je vynechán, (např. Get #1, , MyRecord), je přečten záznam na aktuální pozici. Pořadové číslo aktuálního záznamu je možné získat podobně jako u sekvenčních souborů použitím funkce Seek. Po přečtení záznamu se aktuální pozice přesune vždy na následující záznam. Přesvědčte se o tom tím, že přidáte do kódu řádek Debug.Print Seek(1) bezprostředně za příkaz Get.
Jak využít Word pro kontrolu pravopisu? Se zpracováním textových souborů souvisí i využití ostatních aplikací Office, konkrétně Wordu. Ze svého programu ve Visual Basicu můžete volat objekty a vlastnosti ostatních aplikací Office, které mají v sobě zabudován tzv. Visual Basic for Applications. Obecně řečeno je nutné: • mít nainstalovaný Word (příp. Excel apod.) na počítači, kde spouštíte své programy • v programu vytvořit instanci Wordu (Excelu) Pak můžete začít používat objekty Visual Basicu for Applications. Ukážeme si konkrétní příklad využití kontroly pravopisu pro text zapsaný do TextBoxu. Založte nový projekt a vytvořte formulář podle obrázku č. 26.
obr. 26 Formulář pro kontrolu pravopisu Na formuláři je TexBox (s názvem Text1) a dvě příkazová tlačítka – Kontrola (Com− mand1) a Konec (Command2). Programový kód je velice jednoduchý a je obsažen pouze ve dvou událostních procedurách: Private Sub Command1_Click() Dim X As Object Set X = CreateObject(“Word.Application“)
‘ Vytvořit instanci Wordu
X.Visible = False
‘ skrýt Word
X.Documents.Add
‘ otevřít nový dokument
65
UČEBNICE VISUAL BASICU 6.0 X.Selection.Text = Text1.Text
‘ zkopírovat obsah TextBoxu do dokumentu
X.ActiveDocument.CheckSpelling
‘ spustit kontrolu gramatiky
Text1.Text = X.Selection.Text
‘ zkopírovat výsledky zpět
‘ Neukládat dokument při zavírání X.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges X.Quit
‘ zavřít Word
Set X = Nothing
‘ uvolnění paměti
End Sub
První řádek definuje objektovou proměnnou X.
TIP: Hodnotou objektové proměnné může být odkaz na libovolný objekt (např. instanci Wordu, DLL knihovny atp.). Přiřazení tohoto odkazu musí být realizováno pomocí příkazu Set. Potom, co se objekt přestane používat, musí se do objektové proměnné přiřadit hodnota Nothing. Tím se uvolní paměť, kterou instance objektu v počítači zabírala.
Po spuštění Wordu se nejprve otevře nový dokument a zkopíruje se obsah TextBoxu do tohoto dokumentu. Po spuštění kontroly pravopisu je ovládání změn stejné jako ve Wor− du. Opravy se provádějí do skrytého dokumentu Wordu, a proto je po skončení kontro− ly pravopisu nutné překopírovat obsah tohoto dokumentu zpět do TextBoxu. Následuje již pouze zavření aktivního dokumentu (hodnota wdDoNotSaveChanges udá− vá, že obsah dokumentu se nemá ukládat), zavření Wordu a uvolnění paměti počítače. Druhá událostní procedura se vztahuje ke druhému příkazovému tlačítku (Konec) a slou− ží pouze k ukončení programu. Private Sub Command2_Click() End End Sub
Nahrazování textu Podobným způsobem, jakým jsme použili z Wordu nástroj pro kontrolu pravopisu, mů− žeme využít i další nástroje – třeba pro nahrazování textu. V novém projektu vytvořte nejprve formulář podle obr. 27.
66
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
obr. 27 Formulář pro prezentaci nahrazování textu Formulář obsahuje textová pole Text1 (pro zadání prohledávaného textu), Text2 (TextBox označený jako „Najít co:“) a Text3 (TextBox „Nahradit čím:“) a dvě příkazová tlačítka – Command1 (s titulkem „Nahradit“) a Command2 („Konec“). Díky využití aplikace Word bude programový kód opět velice jednoduchý: Private Sub Command1_Click() Dim X As Object Set X = CreateObject(“Word.Application“) X.Visible = False X.Documents.Add X.Selection.Text = Text1.Text With X.Selection.Find
‘spustit hledání k nahrazování
.ClearFormatting
‘ ignorovat formátování
.Text = Text2.Text
‘ hledaný text
.Replacement.ClearFormatting .Replacement.Text = Text3.Text ‘ text, jímž se nahrazuje .Execute Replace:=wdReplaceAll, Forward:=True, _ Wrap:=wdFindContinue End With Text1.Text = X.Selection.Text X.ActiveDocument.Close SaveChanges:=wdDoNotSaveChanges X.Quit Set X = Nothing End Sub
Nová je zde pouze sekce příkazu Width. Pomocí klauzule ClearFormatting určíme, že slova se mají vyhledávat bez ohledu na jejich formátování (font, velikost atp.). Hledaný text vezmeme z textového pole Text2, text, jímž se bude nahrazovat, z pole Text3. Ná−
67
UČEBNICE VISUAL BASICU 6.0 sledující metoda Execute wordovského objektu Find se spouští s parametry pro nahraze− ní všech výskytů (Replace:=wdReplaceAll), prohledávání textu probíhá v dokumentu směrem dolů (Forward:=True). Zbytek programového textu je stejný jako v případě kontroly pravopisu. Uvědomte si, že nevýhodou používání ostatních aplikací Office ve vašich programech je nutnost instalace Office na počítači, kde se program spouští a také fakt, že při déletrva− jících operacích může volaná aplikace Office rušivě probliknout na pracovní plochu, i když její vlastnost Visible je nastavena na hodnotu False.
Otázky a úkoly: 1. Zkuste použít kód Open “test.txt“ For Input As #1 Do While Not EOF(1) Input #1, MyString, MyNumber Debug.Print MyString, MyNumber Loop Close #1
na textový soubor, který bude obsahovat více než dvě položky na jednom řádku, pří− padně prázdné řádky atd. 3. Podívejte se v prohlížeči NotePad na soubory vytvořené v textovém režimu (mód Output) a v režimu binárním (mód Random). Jaký je mezi nimi na první pohled rozdíl? 4. V lekci je popsán příklad pro kontrolu pravopisu. Jakým způsobem by za použití Wordu bylo možné kontrolovat gramatiku?
68
Lekce 8
Přístup k datům Cíle lekce: Naučit se přistupovat k datům v databázi a manipulovat s nimi – číst, zapisovat a ak− tualizovat tato data. Programování aplikací pro přístup k datům jsou v současnosti vůbec nejžádanější. Visu− al Basic poskytuje několik nástrojů, které poskytují přístup do databází nejrůznějšího ty− pu. V této a následující lekci si popíšeme nejpoužívanější z těchto způsobů. K tomu, abyste si mohli vyzkoušet programový kód obsažený v těchto lekcích, je nutné, abyste měli nainstalován Microsoft Access nebo abyste alespoň měli možnost vytvořit da− tabázi Accessu a umístit ji na svůj počítač. Vždy před tím, než můžete začít komunikovat s daty v databázi, je nutné založit komu− nikační kanál mezi programem zobrazujícím data a databází. Při programování ve Visu− al Basic můžete v zásadě používat dva druhy těchto kanálů – ODBC a DAO. V této osmé lekci se budeme zabývat přístupem k databázi přes ODBC. V první fázi vytvoříme databázi Accessu, ke které budeme programovou aplikací přistu− povat. Vytvořte tedy databázi MDB, která bude obsahovat jedinou tabulku „Pracovnik“ podle obrázku 28.
obr. 28 Definice tabulky Pracovnik v Accessu.
69
UČEBNICE VISUAL BASICU 6.0 Tabulka bude obsahovat následující pole: • ID – primární klíč tabulky • Jmeno (datový typ Text) – Křestní jméno pracovníka • Prijmeni (datový typ Text) – Příjmení pracovníka • Titul (datový typ Text) – Titul pracovníka • Plat (datový typ Číslo) – Plat pracovníka v korunách • Poznámka (datový typ Memo) – Další textové údaje o pracovníkovi. Databázi uložte pod názvem DB1.MDB např. do adresáře c:\databaze Při použití ODBC spojení s databází můžeme použít dva přístupy: 1. nadefinovat DSN (Data Source Name) v Ovládacích panelech systému Windows 2. tzv. DSN−less připojení bez nutnosti jakékoli definice v Ovládacích panelech.
TIP: Oba typy spojení jsou při programování běžné. První má výhodu v trochu rychlejší tvorbě připojení samotnou aplikací, druhé zase v nezávislosti na definici DSN v Ovládacích panelech. Ukážeme si v této lekci postupně oba způsoby.
Nejprve tedy vytvoříme DSN záznam v Ovládacích panelech. Otevřte Ovládací panely sy− stému Windows a poklepejte na ikonu ODBC. Na kartě System DSN (viz obr. 29) klep− něte na tlačítko „Přidat“.
obr. 29 Definice systémového DSN. V dalším okně se vybírá typ databáze, na kterou má DSN ukazovat. V našem případě vy− berte řádek „Microsoft Access Driver (*.mdb)“ a klepněte na tlačítko „Dokončit“.
70
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
obr. 30 Výběr databázového ovladače Popisek „Dokončit“ na tlačítku je trochu zavádějící, protože definice DSN tím zdaleka ne− končí. Na obr. 31 je další dialogové okno, kde konečně přistoupíme k záznamu o spo− jení s konkrétní databází.
obr. 31 Definice připojení k databázi DB1.MDB Do pole s označením „Data Source Name“ vepište název, pomocí kterého budeme poz− ději vytvářet komunikační kanál s databází. Následující pole je vyhrazeno pro popis. Tla− čítko „Select“ slouží k výběru konkrétního MDB souboru. Klepněte tedy na toto tlačítko a ze stromové struktury adresářů zvolte dříve vytvořený soubor db1.mdb. Po potvrzení tlačítkem „OK“ se nově definované DSN objeví mezi ostatními v okně na obrázku 29. Nyní přistupme k tvorbě samotné aplikace. Založte tedy nový projekt ve Visual Basicu Standard EXE a založte v něm tři formuláře: • Form1 pro zadávání nových dat do databáze • Form2 pro zobrazování dat z databáze
71
UČEBNICE VISUAL BASICU 6.0 • FormMain pro přepínání mezi oběma výše uvedenými formuláři Nejjednodušším bude pro nás formulář Form1, který se bude skládat pouze ze známých ovládacích prvků – viz obr. 32.
obr. 32 Formulář pro zadávání nových údajů do databáze. Jednotlivá pole mají názvy: • txtJmeno • txtPrijmeni • txtTitul • txtPlat • txtPoznamka Jako druhý vytvořte formulář FormMain pro přepínání mezi Form1 a Form2. Viz obr. 33.
obr. 33 Hlavní formulář aplikace Formulář je velice jednoduchý – obsahuje pouze 2 tlačítka. První z nich bude zobrazo− vat formulář Form1, druhé Form2. K událostní proceduře OnClick prvního tlačítka připojte následující kód: Dim frm As New Form1 frm.Show vbModal, Me Set frm = Nothing
Tento kód nejprve zakládá novou instanci formuláře Form1 a odkaz na ni ukládá do lo− kální proměnné frm. Následuje volání metody Show, která tento formulář zobrazí.
72
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Následující parametry vbModal a Me určují, že formulář bude modální vzhledem k formuláři, ze kterého je volán. Modální formulář znamená, že dokud uživatel neukončí práci ve Form1, budou pro něho ostatní části aplikace nedostupné.
Poslední řádek přiřazuje proměnné frm hodnotu Nothing a uvolňuje tak formulář Form1 z paměti.
TIP: Bylo by možné zobrazit formulář Form1 také jednoduše jediným řádkem kódu: Form1.Show
Tento přístup má však tu nevýhodu, že po ukončení práce ve formuláři Form1 se neuvolní paměť počítače, kterou zabíral. Ta se uvolní teprve po ukončení celé aplikace. Při vícenásobném zavírání a otvírání tohoto formuláře v rámci jediného spuštění celé aplikace by stále rostly nároky na paměť.
Podobně k druhému tlačítku připojte kód zobrazující formulář Form2, který vytvoříme později: Dim frm As New Form2 frm.Show vbModal, Me Set frm = Nothing
Nyní máme již hotový základ celé aplikace a dostáváme se ke stěžejní otázce: Jak vytvo− řit připojení do databáze? Musíme nejprve vytvořit komunikační kanál pro manipulaci s daty: V prvním kroku je nutné přidat do referencí projektu odkaz na Microsoft Remote Data Object 2.0. Zvolte tedy z menu Visual Basicu příkaz Project/References. V okně na obr. 34 zatrhněte zmíněný řádek. Celou akci potvrdte tlačítkem „OK“.
obr. 34 Nastavení referencí na Microsoft RDO.
73
UČEBNICE VISUAL BASICU 6.0 Tím máme připravenu půdu pro použití metody OpenConnection, která otevírá komu− nikační kanál s databází. Nejprve se podíváme na syntaxi této metody: Set connection = environment.OpenConnection(dsName[, prompt[, readonly[, connect [, options]]]]) Popis: connection
objektová proměnná ukazující na objekt typu rdoConnection s defi− nicí spojení
environment
objektová proměnná odkazující na existující objekt typu rdoEnvi− ronment
dsName
název DSN, které jsme založili v Ovládacích panelech Windows
prompt
konstatnta, která definuje, zda se metoda bude dotazovat uživatele na DSN či nikoli
readonly
hodnota Boolean, která určuje, zda připojení k databázi bude pou− ze pro čtení (hodnota True) nebo i pro zápis (False). Pokud tento parametr není uveden, bere se implicitně hodnota False
connect
řetězec obsahující dodatečné informace o připojení, pokud je jich třeba (typicky např. uživatelské jméno a heslo pro přístup do data− báze)
options
tento parametr může obsahovat konstantu rdAsyncEnable pro asynchrnonní přenos dat
TIP: Pokud se má z databáze do volající apliace vrátit velký objem dat, může tato operace zabrat i několik desítek sekund. Při tzv. synchronním módu připojení (který je implicitní) se zastaví běh celé aplikace, dokud nepřijme všechna data. Při nastavení asynchronního přenosu konstantou rdAsyncEnable se data do aplikace předávají při dalším současném chodu aplikace. Pokud budete používat asynchronní přenos dat, je možné zjistit, zda databáze už dodala všechna data či nikoli zjištěním hodnoty vlastnosti StillConnecting objektu rdoConnection. Probíhající asynchronní komunikaci je také možné ukončit metodou Cancel tohoto objektu.
Nyní můžeme konečně přistoupit k naprogramování připojení databáze. Založte v pro− jektu nový modul a vložte do něho kód: Public cn As rdoConnection Sub main() Set cn = rdoEnvironments(0).OpenConnection(dsName:=“NovaDatabaze“, _ Prompt:=rdDriverNoPrompt) FormMain.Show End Sub
74
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Metoda OpenConnection podporuje tzv. pojmenované argumenty. To znamená, že při volání metody nemusejí být její argumenty uváděny v přesně stanoveném pořadí, pokud jsou jim hodnoty přiřazovány pomocí znaku přiřazení (:=).
Dále je nutné zajistit, aby procedura main() byla nastavena jako startovací procedura ce− lé aplikace. To lze nastavit v okně na obr. 35.
obr. 35 Nastavení startovacího objektu celé aplikace Okno zobrazíte příkazem nabídky Project/Properties. Startovací objekt se nastaví pomo− cí ComboBoxu s titulkem Startup Object. Vzhledem k tomu, že máme již připravený formulář Form1, vrátíme se nyní k němu. Je− diná zajímavá procedura bude připojena k události OnClick tlačítka „Uložit“. Tato proce− dura musí shromáždit data z formuláře do patřičného tvaru a odeslat je do databáze. Tato akce se praktikuje tvořením a spouštěním tzv. SQL dotazů, pomocí kterých se manipu− luje s daty v databázi. Proveďme tedy malou odbočku a podívejme se na možnosti do− tazů SQL podrobněji.
Otázky a úkoly: 1) Zkuste si založit i další DSN záznamy k databázím. K jakým jiným databázím (s vý− jimkou Accessu) můžete na vašem počítači definovat DSN connection? 2) Zkuste nakonfigurovat přístup do databáze db1.mdb tak, aby databáze vyžadovala přístup s uživatelským jménem a heslem.
75
Lekce 9
Vytváření SQL dotazů Cíle lekce: Naučit se vytvářet všechny druhy SQL dota− zů pro přístup do databáze a manipulaci s daty Jazyk SQL je speciální jazyk pro tvorbu dotazů, pomocí nichž se manipuluje s daty da− tabáze. Stejně jako v běžném životě na každý dotaz očekáváme odpověď, tak i databá− ze reaguje na každý SQL dotaz. Odpovědí může být to, že vrátí do volající aplikace sa− du dat k dalšímu zpracování, smaže nebo aktualizuje data v databázi, založí v databázi novou tabulku apod. V této lekci se seznámíme se všemi druhy SQL dotazů tak, abyste je uměli ve své další programátorské praxi již sami vytvářet.
Příkaz SELECT Jednoduché použití příkazu SELECT, které si zde nyní popíšeme, nereprezentuje plnou syntaxi ani sémantiku tohoto příkazu, přesto je dostatečně ilustrativní. Příkaz SELECT slouží k selekci (výběru) jednotlivých polí tabulky. Může být tedy použit jako výběrový dotaz nebo kritérijní poddotaz v mřížce návrhu. Velice zjednodušená syntaxe příkazu je následující: SELECT [tabulka.]pole1 [AS alias1] FROM tabulkový výraz
Tento příkaz vybere z tabulky jedno pole (pole1), které bude ve výsledku dotazu zob− razeno pod hlavičkou (alias1).
Příklad: SELECT Příjmení AS Prim FROM Zaměstnanci
Tento příkaz vybere pole Příjmení z tabulky Zaměstnanci a ve výsledku jej zobrazí pod hlavičkou pole Prim.
Příklad: SELECT Dodavatelé.Příjmení AS Prim, Jméno FROM Zaměstnanci
Příkaz vybere z tabulky Dodavatelé pole Příjmení a ve výsledku jej zobrazí pod hlavič− kou pole Prim. Zároveň vybere pole Jméno z tabulky Zaměstnanci. Výsledek dotazu te− dy bude obsahovat dvě pole: Prim a Jméno.
Příklad: SELECT * FROM Zaměstnanci
77
UČEBNICE VISUAL BASICU 6.0 Příkaz vybere všechny záznamy (a všechna pole) z tabulky zaměstnanci. Jedná se vlast− ně o kopii tabulky Zaměstnanci.
Příklad: SELECT Count(*)As Počet FROM Zaměstnanci
Příkaz zobrazí počet záznamů tabulky zaměstnanci a zapíše jej do pole pod hlavičkou Počet. Výsledek dotazu tedy bude jediné číslo (jediný záznam o jediném poli).
Příklad: SELECT Count (*) AS CelkemZaměstnanců, Avg(Plat) AS PrůměrnýPlat, Max(Plat) AS NejvyššíPlat FROM Zaměstnanci
Příkaz zobrazí počet zaměstanců a jejich průměrný a nejvyšší plat. Výsledek dotazu bu− de obsahovat jediný záznam o třech polích: CelkemZaměstnanců, PrůměrnýPlat a Nejvyš− šíPlat.
Klauzule IN Klauzule IN slouží v jazyce SQL k definování cílové nebo zdrojové databáze (viz také pří− klad INSERT).
Příklad: SELECT [Kód zákazníka], Firma FROM [Oblast zákazníci] IN “c:\documenty\xldata.xls“ „EXCEL 5.0;“
Výběr z pojmenované oblasti excelovského dokumentu xldata.xls.
Příklad: SELECT [Kód zákazníka] FROM Zákazníci IN External.mdb
Výběr pole Kód zákazníka (pokud název pole obsahuje mezeru, je třeba jej uzavřít do hranatých závorek), z tabulky Zákazníci v externí databázi.
Fráze WHERE Klauzule Where určuje podmínku, kterou musejí splňovat definovaná pole, aby se na ně vztahoval příkaz SELECT, UPDATE nebo DELETE.
Příklad: SELECT * FROM Zaměstnanci WHERE ((([Zaměstnanci].Plat)>6500) AND ((Zaměstnanci.Nástup) Between #1/1/98# And #12/31/98#));
78
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Příkaz vrátí kompletní záznamy všech zaměstnanců, jejichž plat je vyšší než 6500 Kč a kteří byli přijati v roce 1998.
Fráze GROUP BY Fráze GROUP BY sloučí věty se stejnými hodnotami v zadaném seznamu polí do jediné věty. Pokud zadáte v příkazu SELECT agregovanou funkci SQL, například Sum nebo Count, vytvoří se pro každou větu souhrnná hodnota.
Příklad: SELECT Funkce,
Count([Funkce]) AS Počet FROM Zaměstnanci
GROUP BY Funkce
Tento příklad vytvoří seznam všech funkcí v zaměstnání a počet zaměstnanců pro kaž− dou funkci. Každá funkce bude ve výsledku dotazu zahrnuta jen jednou.
Příklad: SELECT Funkce, Count(Funkce) AS Počet FROM Zaměstnanci WHERE Region = “Liberec“ GROUP BY Funkce
Tento příklad vypočítá pro každou jedinečnou funkci v zaměstnání počet zaměstnanců v Liberci, kteří mají takovou funkci.
Fráze HAVING Fráze HAVING určuje, které věty seskupené pomocí fráze GROUP BY budou v příkazu SELECT zobrazeny. Poté co fráze GROUP BY sloučí věty, fráze HAVING zobrazí všechny věty sesku− pené frází GROUP BY, které splňují podmínku fráze HAVING.
Příklad: SELECT ČísloDodavatele, Avg(JednotkováCena) AS PrůměrnáCena FROM Výrobky GROUP BY ČísloDodavatele HAVING (Avg(JednotkováCena)>3200)
Výsledkem dotazu budou dodavatelé, jejichž výrobky mají průměrnou jednotkovou ce− nu vyšší než 3200 Kč.
Fráze ORDER BY Fráze ORDER BY setřídí věty výsledného dotazu podle zadaného pole nebo polí ve vze− stupném nebo sestupném pořadí.
79
UČEBNICE VISUAL BASICU 6.0
Příklad: SELECT Příjmení, Jméno FROM Zaměstnanci ORDER BY Příjmení DESC
V tomto příkladu jsou záznamy zaměstnanců seřazeny sestupně (od Z do A) podle jejich příjmení.
Příklad: SELECT ČísloKategorie, NázevVýrobku, JednotkováCena FROM Výrobky ORDER BY ČísloKategorie, NázevVýrobku ASC
V tomto příkladu jsou záznamy seřazeny nejprve podle čísla kategorie a poté (tj. v rám− ci jedné kategorie) podle názvu výrobku vzestupně.
Příklad: SELECT [Příjmení], [Jméno], [Funkce], [Plat] FROM [Zaměstnanci] WHERE [Plat] >= (SELECT AVG([Plat]) FROM [Zaměstnanci] WHERE ([Zaměstnanci].[Funkce] = “Obchodní ředitel“) OR ([Zaměstnanci].[Funkce] = “Obchodní zástupce“))
Podle tohoto kritéria budou zobrazeny údaje těch zaměstnanců, jejichž plat je vyšší než průměrný plat zaměstnanců s funkcí Obchodního ředitele nebo zástupce.
Deklarace WITH OWNERACCESS OPTION Deklarace WITH OWNERACCESS OPTION má svůj význam ve víceuživatelském prostře− dí se zabezpečením pracovní skupiny. Tuto deklaraci použijte společně s dotazem, kte− rý dává uživatelům používajícím nějaký dotaz stejná přístupová práva jako vlastníkovi dotazu (o zabezpečení databáze a ošetření konfliktů se dočtete v závěru této knihy). Deklarace se vkládá na závěr SQL příkazu.
Příklad: SELECT Příjmení, Jméno, Plat FROM Zaměstnanci ORDER BY Příjmení WITH OWNERACCESS OPTION
Příkaz SELECT...INTO Příkaz SELECT...INTO je ekvivalentem vytvářecího dotazu. Výsledkem dotazu je vždy vy− tvoření nové tabulky:
Příklad: SELECT Zaměstnanci.* INTO [Zaměstnanci-záloha] IN “c:\dokumenty\extrnal.mdb“ FROM Zaměstnanci
80
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Vytvoření záložní kopie tabulky Zaměstnanci a její uložení do externí accessovské data− báze external.mdb. Klauzule IN je nepovinná – je samozřejmě možné vytvářet tabulku i v aktuální databázi.
Operace UNION Operace UNION je ekvivalentem sjednocovacího dotazu. Dotaz obsahující klíčové slovo UNION slučuje výsledky dvou či více nezávislých dotazů nebo tabulek.
Příklad: SELECT Firma, Město FROM Dodavatelé WHERE Země = “USA“ UNION SELECT Firma, Město FROM Zákazníci WHERE Země = “USA“
Výsledek dotazu zobrazí názvy a domovská města všech firem USA, která jsou vzhledm k vám v dodavatelském či zákaznickém vztahu.
Operace INNER JOIN Operace INNER JOIN slučuje záznamy ze dvou tabulek za předpokladu, že se shodují je− jich hodnoty ve společném poli. Toto společné pole je do nového záznamu zahrnuto jen jednou. Jinak se záznam skládá ze všech polí obou tabulek. Jedná se tedy o slučovací dotaz.
Příklad: SELECT DISTINCTROW Sum(JednotkováCena * Množství) AS Prodej, Jméno & “ “ & Příjmení AS CeléJméno FROM Zaměstnanci INNER JOIN(Objednávky INNER JOIN Rozpis objednávek] ON Objednávky.ČísloObjednávky = [Rozpis objednávek].ČísloObjednávky)ON Zaměstnanci.ČísloZaměstnance = Objednávky.ČísloZaměstnance GROUP BY Jméno & “ “ & Příjmení
Uvedený trochu složitější SQL příkaz vytváří dvě ekvivalentní spojení: jedno mezi tabulka− mi Rozpis objednávek a Objednávky a druhé mezi tabulkami Objednávky a Zaměstnanci. Obě spojení jsou nezbytná, neboť tabulka Zaměstnanci neobsahuje data o prodeji a tabul− ka Rozpis objednávek neobsahuje informace o zaměstnancích. Výsledkem dotazu bude seznam zaměstnanců a celková suma, kterou získali prodejem.
Operace LEFT JOIN a RIGHT JOIN Operace LEFT JOIN a RIGHT JOIN slučují (zleva nebo zprava) záznamy ze zdrojové ta− bulky, jsou−li použity v nějaké klauzuli FROM. I tímto způsobem je můžete pomocí jazy− ka SQL definovat sjednocovací dotaz.
81
UČEBNICE VISUAL BASICU 6.0
Příklad: SELECT [Jméno oddělení], Jméno & Chr(32) & Příjmení AS Jméno FROM Oddělení LEFT JOIN Zaměstnanci ON Oddělení.[Číslo oddělení] = Zaměstnanci.[Číslo oddělení] ORDER BY [Jméno oddělení]
Uvedený příklad předpokládá pole Jméno oddělení a Číslo oddělení v tabulce Zaměst− nanci. Tento příklad vybere všechna oddělení včetně těch, která nemají žádné zaměst− nance.
Predikáty ALL, DISTINCT, DISTINCTROW, TOP Predikáty ALL, DISTINCT, DISTINCTROW, TOP blíže specifikují činnost dotazů, ve kte− rých jsou definovány. Používají se v souvislosti s příkazem SELECT. Jejich syntaxe je: SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]] FROM tabulka
Příklad: SELECT DISTINCTROW JménoSpolečnosti FROM Zákazníci INNER JOIN Objednávky ON Zákazníci.[Kód zákazníka] = Objednávky.[Kód zákazníka] ORDER BY Firma
Použití predikátu DISTINCTROW vytvoří seznam společností, které mají alespoň jednu objednávku, avšak bez podrobností o těchto objednávkách
Příklad: SELECT TOP 25 Jméno, Příjmení FROM Studenti WHERE RokUkončení = 1994 ORDER BY MaturitníPrůměr DESC
Dotaz vrátí 25 záznamů, ve výběru určeného frází ORDER BY. V tomto případě prvních 25 záznamů seřazených sestupně. Pokud neuvedete frázi ORDER BY, dotaz vrátí náhodnou podmnožinu 25 vět z tabulky STUDENTI, které splňují podmínku uvedenou ve frázi WHERE.
Příkaz TRANSFORM Příkaz TRANSFORM vytvoří křížový dotaz. Jeho syntaxe je: TRANSFORM agregfunkce vybratpříkaz PIVOT kontingenčnípole [IN (hodnota1 [, hodnota2[, ...]])]
Příklad: PARAMETERS [Požadovaný rok] LONG;
82
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU TRANSFORM Sum([Rozpis objednávek].Množství * ([Rozpis objednávek].JednotkováCena – ([Rozpis objednávek].Sleva / 100) * [Rozpis objednávek].JednotkováCena)) AS Prodej SELECT Firma FROM Objednávky INNER JOIN ((Dodavatelé INNER JOIN Výrobky ON Dodavatelé.ČísloDodavatele = Výrobky.ČísloDodavatele) INNER JOIN [Rozpis objednávek] ON Výrobky.ČísloVýrobku = [Rozpis objednávek].ČísloVýrobku) ON Objednávky.ČísloObjednávky = [Rozpis objednávek].ČísloObjednávky WHERE DatePart(“yyyy“, DatumObjednávky) = [Požadovaný rok] GROUP BY Firma ORDER BY Firma PIVOT “Qtr “ & DatePart(“q“, DatumObjednávky) In (‘Qtr 1’, ‘Qtr 2’, ‘Qtr 3’, ‘Qtr 4’)
V uvedeném příkladu je vytvořen křížový dotaz, který vrátí přehled prodeje výrobků pro jednotlivé dodavatele podle čtvrtletí v roce, který uživatel určí. Čtvrtletí jsou vracena zleva doprava jako sloupce a názvy dodavatelských firem jsou vraceny shora dolů jako řádky.
Příkaz PARAMETERS Příkaz PARAMETERS definuje parametr parametrického dotazu. Uživatelem definovaná hodnota po spuštění dotazu se dále používá při jeho běhu.
Příklad: PARAMETERS [Požadovaný rok] LONG;
Po spuštění dotazu musí uživatel zadat celočíselnou hodnotu typu Long do parametru s názvem Požadovaný rok.
Příkaz CREATE TABLE Příkaz CREATE TABLE je ekvivalentem vytvářecího dotazu – příkaz vytvoří novou tabulku.
Příklad: CREATE TABLE Tab (Jméno TEXT, Příjmení TEXT)
Uvedený příkaz vytvoří v aktuální databázi tabulku Tab se dvěma poli Jméno a Příjme− ní, která budou obě datového typu Text.
Příkaz ALTER TABLE Příkaz ALTER TABLE umožní upravit návrh tabulky (stejně jako v mávrhovém zobrazení tabulky) poté, co byla vytvořena pomocí příkazu CREATE TABLE.
83
UČEBNICE VISUAL BASICU 6.0
Příklad: ALTER TABLE Zaměstnanci ADD COLUMN Plat CURRENCY
Příkaz přidá do tabulky Zaměstnanci pole Plat, které bude datového typu Měna.
Příklad: ALTER TABLE Zaměstnanci DROP COLUMN Plat
Příklad odstraní z tabulky Zaměstnanci pole Plat.
Fráze CONSTRAINT Frázi CONSTRAINT je možno použít v příkazech ALTER TABLE a CREATE TABLE pro vy− tvoření nebo odstranění omezení. Existují dva typy fráze CONSTRAINT: • pro vytvoření omezení pro jedno pole • pro vytvoření omezení pro více než jedno pole.
Příklad: CREATE TABLE NováTabulka (Jméno TEXT, Příjmení TEXT, Číslo INTEGER CONSTRAINT Omezení PRIMARY KEY)
Tento příklad vytvoří novou tabulku se dvěma textovými poli a polem typu Integer. Po− le Číslo je primární klíč.
Příkaz CREATE INDEX Příkaz CREATE INDEX vytvoří nový index v existující tabulce. Syntaxe příkazu je následující: CREATE [ UNIQUE ] INDEX index ON tabulka (pole [ASC|DESC][, pole [ASC|DESC], ...]) [WITH { PRIMARY | DISALLOW NULL | IGNORE NULL }]
Z uvedené syntaxe vyplývá, že lze definovat index jedinečný (UNIQUE), primární index (PRIMARY), případně se zakázáním (DISALLOW NULL) nulových hodnot nebo jejich ig− norováním (IGNORE NULL).
Příklad: CREATE UNIQUE INDEX KódZák ON Zákazníci (Kód Zákazníka) WITH DISALLOW NULL
Příklad vytvoří jedinečný index KódZák pro pole Kód zákazníka.
84
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
Příkaz DROP Příkaz DROP odstraní existující tabulku z databáze nebo existující index z definované tabulky.
Příklad: DROP INDEX Indexování ON Dopravci
Příklad odstraní index Indexování z tabulky Dopravci.
Příklad: DROP TABLE Zaměstnanci
Příklad odstraní tabulku Zaměstnanci z aktivní databáze.
Příkaz UPDATE Příkaz UPDATE je ekvivalentem aktualizačního dotazu. Pomocí tohoto příkazu lze měnit hodnoty v polích tabulky.
Příklad: UPDATE Zaměstnanci SET Nadřízený = 5 WHERE Nadřízený = 2
Pole Nadřízený tabulky Zaměstnanci je nastaveno na hodnotu 5 u všech zaměstnanců, u kterých mělo toto pole dosud hodnotu 2.
Příkaz DELETE Příkaz DELETE je ekvivalentem odstraňovacího dotazu, jenž odstraní záznamy z jedné nebo více tabulek. Příkazem DELETE můžete odstranit pouze celé záznamy. Odstranění jednotli− vých polí viz příkaz DROP.
Příklad: DELETE * FROM Zaměstnanci WHERE plat > 20000
Příkaz odstraní z tabulky záznamy všech zaměstnanců, jejichž plat je vyšší než 20 000. Ačkoli výčet příkladů (a dokonce ani příkazů, klauzulí atd.) pro používání jazyka SQL není úplný, je dostatečně názorný a motivující pro to, abyste byli schopni vytvářet a po− užívat nejen jednoduché ale i složitější dotazy.
85
UČEBNICE VISUAL BASICU 6.0
SQL dotaz aplikace z předchozí lekce Nyní již víme, jakým způsobem vytvořit SQL dotaz, pomocí něhož odešleme data do da− tabáze. Pokud ne, vše bude jasné z následujícího kódu připojeného k události OnClick tlačítka „Uložit“ formuláře Form1: Dim strSQL As String strSQL = “INSERT INTO Pracovnik ORDER BY Prijmeni“ strSQL = strSQL & “(Jmeno,Prijmeni,Titul,Plat,Poznamka) VALUES (“ strSQL = strSQL & “‘“ & txtJmeno.Text & “‘, ‘“ strSQL = strSQL & txtPrijmeni.Text & “‘, ‘“ strSQL = strSQL & txtTitul.Text & “‘, “ strSQL = strSQL & txtPlat.Text & “, ‘“ strSQL = strSQL & txtPoznamka.Text & “‘);“ cn.Execute strSQL, rdExecDirect Unload Me
Nejprve je nutné sestavit SQL dotaz uvozený klauzulí INSERT. Tento dotaz se uloží do proměnné strSQL.
TIP: Textové řetězce je v SQL dotazu zapotřebí uzavřít do apostrofů.
Následuje spuštění dotazu metodou Execute objektu rdoConnection. Proměnná strSQL je prvním argumentem metody, konstanta rdExecDirect jako argument druhý zajišťuje oka− mžité spuštění dotazu.
TIP: Tato procedura neobsahuje kód, který by předcházel chybám, které se za běhu procedury mohou vyskytnout. Ošetřením tzv. zachytitelných chyb při běhu programu se bude zabývat až jedna z následujících lekcí.
Příkaz Unload Me zapište i k proceduře OnClick tlačítka Storno. Posledním úkolem naší malé aplikace bude vytvoření a naprogramování formuláře Form2. Tento formulář bude zobrazovat data z databáze a bude pouze pro čtení. Vzhle− dem k tomu, že formulář je ideálním příkladem části aplikace využívající tzv. grid, sezná− míme se s jeho programováním. Gridem rozumíme ovládací prvek pro zobrazování tabulkových dat. Exisuje velké množ− ství těchto ovládacích prvků, z nichž většina není standardně dodávaná s instalací Visu− al Basicu. My pro naše účely použijeme ten nejjednodušší vestavěný ovládací provek tohoto typu – MSFlexGrid. Dříve, než jej přidáme na formulář a budeme programovat, musíme ho přidat do aktuál− ních komponent projektu. Z nabídky Visual Basicu zadejte příkaz Project/Components
86
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU a zaškrtněte na záložce Controls řádek Microsoft FlexGridControl. Po potvrzení se ikona MSFlexGridu přidá do ToolBoxu.
TIP: Pokud je záložka Controls prázdná, zkontrolujte, že není zatržen CheckBox s titulkem Selected Items Only.
Umístěte MSFlexGrid na plochu formuláře Form2 a změňte jeho vlastnost Name na „flxResult“. Bude to jediný ovládací prvek na formuláři – viz obr. 36.
obr. 36 Formulář s vloženým MSFlexGridem Nyní klepněte pravým tlačítkem myši na plochu gridu a z pohotovostní nabídky vyber− te příkaz Properties. V záložce General následně zobazeného dialogového okna nastav− te parametry (viz. obr. 37): • Rows na hodnotu 2 (počet řádek gridu) • Cols na hodnotu 5 (počet sloupců gridu) • Fixed Rows na hodnotu 1 (počet řad záhlaví gridu) • Fixed Cols na hodnotu 0 (počet sloupců záhlaví gridu).
obr. 37 Nastavení vlastností ovládacího prvku MSFlexGrid
87
UČEBNICE VISUAL BASICU 6.0 Do formuláře přidejte tento kód: Private Sub Form_Load() Dim strSQL As String Dim rso As rdoResultset Dim PocetRad As Integer flxResult.TextMatrix(0, 0) = “Titul“ flxResult.TextMatrix(0, 1) = “Jméno“ flxResult.TextMatrix(0, 2) = “Příjmení“ flxResult.TextMatrix(0, 3) = “Plat (Kč)“ flxResult.TextMatrix(0, 4) = “Poznámka“ flxResult.ColWidth(0) = 1000 flxResult.ColWidth(1) = 1500 flxResult.ColWidth(2) = 1500 flxResult.ColWidth(3) = 1000 flxResult.ColWidth(4) = 3300 strSQL = “SELECT * FROM Pracovnik ORDER BY Prijmeni“ Set rso = cn.OpenResultset(strSQL, rdOpenStatic) flxResult.Redraw = False PocetRad = 0 Do While Not rso.EOF flxResult.AddItem ““ flxResult.TextMatrix(flxResult.Rows – 1, 0) = rso!titul flxResult.TextMatrix(flxResult.Rows – 1, 1) = rso!jmeno flxResult.TextMatrix(flxResult.Rows – 1, 2) = rso!prijmeni flxResult.TextMatrix(flxResult.Rows – 1, 3) = rso!plat flxResult.TextMatrix(flxResult.Rows – 1, 4) = rso!poznamka rso.MoveNext PocetRad = PocetRad + 1 Loop If PocetRad > 0 Then flxResult.RemoveItem 1 flxResult.Redraw = True flxResult.Refresh Set rso = Nothing End Sub
První série řádků této procedury formátuje MSFlexGrid. VlastnostTextMatrix určuje titu− lek v jednotlivých buňkách záhlaví. Např. flxResult.TextMatrix(0, 1) = “Jméno“ přiřa− zuje buňky nultého řádku a prvního sloupce text „Jméno“. Pomocí vlastnosti ColWidth s pořadovým číslemn sloupce jako argumentem nastavuje šířku sloupce. Řádek Set rso = cn.OpenResultset(strSQL, rdOpenStatic)
88
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU spouští SQL dotaz uložený v proměnné strSQL. Vzhledem k tomu, že tentokrát je zapo− třebí data z databáze přijmout a nikoli poslat, je nutné spustit dotaz jiným způsobem. Metoda Open Resultset vrátí do proměnné rso (která je datového typu rdoResultset) sa− du záznamů z databáze. Jeden řádek z databáze znamená jeden záznam. Konstanta rdOpenStatic říká, že záznamy je možné pomocí proměnné rso pouze číst a nikoli upra− vovat. Smyčka Do While Not rso.EOF
bude postupně procházet celý Resultset připojený k proměnné rso, dokud se nedostane na konec.
TIP: Vlastnost EOF (End of File) nabývá hodnoty True, pokud je aktuální pozice v Resultsetu nastavena za poslední záznam.
Ve smyčce se nejprve vloží prázdný řádek do MSFlexGridu a naplní se texty obsažený− mi v Resultsetu. Metoda MoveNext nastaví aktuální pozici v Resultsetu na následující záznam. Po ukončení smyčky je zapotřebí odstranit z gridu jeden prázdný řádek (ovšem jen v pří− padě, že se z databáze opravdu vrátila nějaká data, tj. proměnná PocetRad > 0). Na zá− věr se musí uvolnit paměť, kterou zabíral Resultset, příkazem Set rso = Nothing.
TIP: Aby se zabránilo problikávání změn v gridu při jeho naplňování, je před provedením změn zakázáno jejich zobrazování (flxResult.Redraw = False) a po jeho naplnění se změny teprve zobrazí (flxResult.Redraw = True flxResult.Refresh)
obr. 37a Formulář Form2 se zobrazenými daty z databáze o dvou pracovnících
89
UČEBNICE VISUAL BASICU 6.0
DSN-less Pojem DSN−less znamená, že připojení do databáze je možné založit i bez definice DSN, které jsme v předcházejícím příkladu použili (viz klauzule dsName:=“NovaDatabaze“ v pro− ceduře Main). Výhodou použití DSN je trochu vyšší rychlost spojení. Zato je však nutné na každém počítači, který bude technologií DSN přistupovat do databáze, korektně toto DSN definovat. Naproti tomu DSN−less technika umožní distribuci programu bez toho, že by bylo nutné ručně na každém počítači definovat Data Source Name. Úprava našeho příkladu na ten− to typ spojení bude velice jednoduchý: Sub main() Dim stCon As String stCon = “DRIVER={Microsoft Access Driver (*.mdb)};dbq= c:\databaze\db1.mdb“ Set cn = rdoEnvironments(0).OpenConnection(““, rdDriverNoPrompt, False, stCon) FormMain.Show End Sub
Jak vidíte, jde vlastně o to, že údaje, které se jinak zadávají při definici DSN (tj. název ovladače a cesta k databázi), je nutné nyní zapsat přímo do programového kódu. Vše− chen ostatní programový kód zůstává beze změn v platnosti.
Ovládací prvek Data Pro ty z vás, kterým se přistupování do databáze pomocí ODBC nebo programování DAO zdá příliš složité, existuje jedna pohodlná alternativa. Existuje ovládací prvek Da− ta, který dokáže přistoupit k databázi zcela jednoduše a bez jakéhokoli psaní programo− vého kódu. Na obr. 38 vidíte hotový formulář, který je navržen pro editování dat ze stan− dardní databáze Bibio.mdb, která je součástí instalace Accessu. Tento ovládací prvek je umístěn na formuláři a vypadá podobně jako navigační tlačítka v tabulce záznamů sa− motného Accessu. Pod tímto prvkem jsou již pouze klasické TextBoxy určené pro zob− razení dat. Přenos a veškerá manipulace s daty se děje prostřednictvím databázového stroje Microsoft Jet a je dostupná bez jakéhokoli programování pouhým nastavením vlast− ností ovládacích prvků, které vidíte na formuláři.
90
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
obr. 38 Formulář s ovládacím prvkem Data Ovládací prvek Data má několik důležitých vlastností, které je třeba správně nastavit již v době návrhu formuláře v okně vlastností tohoto ovládacího prvku: • Connect – tato vlastnost musí být nastavena na vestavěný databázový ovladač. Hodnotu si tedy nemůžete napsat libovolnou, ale musíte ji vybrat z ComboBoxu, který je k vlastnosti přidružen. V našem případě je zvolena hodnota „Access“, která indikuje použití ovladače pro Microsoft Accees. • DatabaseName – zde musí být uveden název databázového souboru MDB včet− ně cesty k tomuto souboru. • DefaultType – zde zvolíte, jestli má být připojení k databázi realizováno pomocí technologie Jet nebo ODBC. Zvolte Jet. • ReadOnly – tato vlastnost typu Boolean říká, jestli data z databáze editovaná bu− dou jen pro čtení (hodnota True) nebo zda je bude možné měnit (False).
TIP: Vlastnost ReadOnly patří ovládacímu prvku Data, a proto se vztahuje pouze na připojení k databázi. Samotná data budou zobrazována v TextBoxech, kde změny mohou být povoleny (viz vlastnost Enabled). Pokud však bude vlastnost ReadOnly nastavena na hodnotu True, nebudou se žádné změny provedené v TextBoxech ukládat do databáze.
• RecordsetType – typ recordsetu, který bude objekt Data vracet z databáze. Ve vět− šině případů vystačíte s hodnotou 0, tedy typem „Table“. • RecordSource – Zdroj záznamů recordsetu. V našem případě hodnotou této vlast− nosti musí být platný název tabulky nebo dotazu databáze MDB. TextBoxy obsažené na formuláři musejí mít správně nastaveny další dvě vlastnosti, se kterými jsme se zatím nesetkali:
91
UČEBNICE VISUAL BASICU 6.0 • DataSource – tato vlastnost musí být nastavena na hodnotu vlastnosti Name ovládacího prvku Data. (Název tohoto prvku, který zajišťuje spojení s databázi je tedy „zdrojem“ dat). • DataField – Název sloupce z tabulky databáze, který se má v příslušném TextBo− xu zobrazovat.
Otázky a úkoly: 1) Doprogramujte aplikaci pro správu zaměstnanců tak, abyste dokázali z aplikačního formuláře záznamy také aktualizovat. 2) Naprogramujte aplikaci pro správu zaměstnanců tak, aby bylo možné řadit zobraze− ná databázová data podle jména nebo příjmení, a to vzestupně i sestupně.
92
Lekce 10
Tvorba uživatelsky příjemných aplikací Cíle lekce: Naučit se vytvářet uživatelsky příjemné aplikace programováním Menu, ovláda− cích prvků Toolbar, StatusBar apod. To, aby aplikace byla uživatelsky příjemná, je dnes jedním ze základních předpokladů toho, aby byla také úspěšná. O úspěchu nebo neúspěchu programové aplikace často roz− hoduje její obliba nebo neobliba u uživatelů. A obliba zase závisí na tom, jak jednoduché a intuitivní bude ovládání – žádný uživatel se nechce dlouho učit ovládat program a vy− žaduje funkce, na něž je zvyklý z jiných programů. Aby s uživatelským rozhraním vašich programů byli uživatelé spokojeni, naučíme se ny− ní používat některé ovládací prvky určené k ovládání aplikace.
Menu Základním ovládacím prvkem, který by neměl chybět na žádném úvodním formuláři vět− ší aplikace je Menu.
TIP: Menu (používá se také čeký výraz Nabídka), je ve všech známých programech Windows. Např.: menu Microsoft Word začíná položkami Soubor, Úpravy atd. Stejné menu lze přidat i do formulářů Visual Basicu.
Založte tedy nový formulář a klepněte pravým tlačítkem myši na plochu tohoto formu− láře. Z pohotovostního menu zvolte příkaz Menu Editor (viz obr. 39).
obr. 39 Jak zobrazit dialog pro tvorbu Menu Samotný dialog pro tvorbu menu vidíte na obr. 40. Horní část dialogu je určena pro zob− razení a určování vlastností té položky menu, která je prosvícena v dolní části.
93
UČEBNICE VISUAL BASICU 6.0
obr. 40 Dialog pro tvorbu Menu Dialog pro tvorbu menu s vyplněnými položkami je na obr. 41.
obr. 41 Vyplněný dialog pro tvorbu Menu Na obr. 41 je dobře vidět, které položky menu jsou v hierarchii na prvním, druhém a dal− ších místech. Na prvním místě jsou Aplikace, Nástroje, Nápověda. Položka Zabezpečení je již vnořena pod položku Nástroje atd.
TIP: Pokud máte zvolenou (prosvícenou) položku menu, můžete její pořadí mezi položkami i úroveň zanoření ovládat černými šipkami umístěnými v dialogu. Stejně tak pokud zadáváte položku novou, upravte šipkami vlevo a vpravo úroveň jejího zanoření.
94
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Na obrázku 42 vidíte menu s rozbalenou položkou Nástroje.
obr. 42 Hotové menu s rozbalenou položkou Nástroje Zatím jsem však pouze přidali menu do formuláře. Stále je ještě nutné naprogramovat je− ho chování. To se již dělá standardním způsobem za pomoci událostních procedur. Po− kud se např. některá z vnořených položek jmenuje mnuDelete, naprogramujte její cho− vání v proceduře Private Sub mnuDelete_Click(), stejně jako se programuje chování tře− ba příkazových tlačítek.
Kontextové menu Kontextové, pohotovostní (anglicky PopUp) menu je dalším výhodným prvkem pro uži− vatelsky příjemné ovládání aplikací. Pokud uživatel klikne pravým tlačítkem myši na ně− který ovládací prvek na formuláři, může si z kontextového menu vybrat, jakou akci chce s daným prvkem uskutečnit. Pro naše demonstrační účely vytvoříme kontextové menu na prázdném formuláři. Naše menu bude mít pouze dvě položky: • zavřít formulář • změnit nadpis formuláře Vytvořte tedy v projektu prázdný formulář a výše zmíněným způsobem zobrazte dialog pro zadávání položek menu. Do menu vložte následující položky (viz obr. 43): • mnuPop – položka menu na nejvyšší úrovni. U této položky zrušte zaškrtnutí u vlastnosti Visible, protože nechceme, aby se tato položka objevila v hlavním menu hned po zobrazení formuláře • mnuClose – položka menu pro zavření formuláře • mnuCaption – položka menu pro změnu nadpisu formuláře. Poslední dvě položky již nadefinujte jako viditelné (pole vlastnosti Visible nechte za− škrtnuté).
95
UČEBNICE VISUAL BASICU 6.0
obr. 43 Definice kontextového menu K ovládání menu naprogramujeme událostní proceduru Form_MouseDown. Kód této procedury se provede vždy, když uživatel stiskne jakékoli tlačítko myši ve chvíli, kdy ukazatel myši je nad formulářem mimo další ovládací prvky. Procedura Form_MouseDown má několik vstupních parametrů: • Button – parametr určuje, které tlačítko myši bylo stisknuto. Při provádění proce− dury má tento parametr jednu ze tří hodnot: • vbLeftButton
(hodnota 1)
Bylo stisknuto levé tlačítko
• vbRightButton
(hodnota 2)
Bylo stisknuto pravé tlačítko
• vbMiddleButton (hodnota 4)
Bylo stisknuto prostřední tlačítko
• Shift – tento parametr určuje, zda spolu s tlačítkem myši byla stisknuta také ně− která z přepínacích kláves. Při provádění procedury má tento parametr jednu z hodnot: • vbShiftMask
(hodnota 1)
Byla stisknuta klávesa SHIFT
• vbCtrlMask
(hodnota 2)
Byla stisknuta klávesa CTRL
• vbAltMask
(hodnota 4)
Byla stisknuta klávesa ALT
• hodnota 0
Nebyla stisknuta žádná z uvedených kláves.
• X, Y – udávají pozici na formuláři, kde se v okamžiku stlačení tlačítka právě na− cházel kurzor.
TIP: Hodnota parametru Shift může nabývat i jiných hodnot než pouze uvedených čtyř. V případě, že je stisknuto více kláves najednou, jejich hodnoty se sčítají. Tj. pokud jsou stisknuty najednou klávesy SHIFT a CTRL, bude parametr Shift mít hodnotu 3.
96
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Veškerý programový kód našeho formuláře bude vypadat takto: Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single,_ Y As Single) If Button = vbRightButton Then Me.PopupMenu mnuPop End If End Sub Private Sub mnuCaption_Click() Me.Caption = InputBox(“Zadej nový titulek formuláře:“, “Nový titulek“) End Sub Private Sub mnuClose_Click() Unload Me End Sub
V proceduře Form_MouseDown se vyvolá metoda PopupMenu, jejímž parametrem je ná− zev hlavní položky kontextového menu. Pokud v kontextovém menu uživatel klepne na položku „Změnit nadpis formuláře“, za− čne se vykonávat procedura mnuCaption_Click. Tato procedura používá vestavěnou funkci InputBox, která zobrazí jednoduchý dialog pro zadání vstupu uživatele (viz obr. 44).
obr. 44 InputBox
StatusBar StatusBar je ovládací prvek, který obvykle najdete u spodního okraje většiny aplikačních oken ve Windows. Tento řádek slouží k zobrazování aktuálních informací o stavu apli− kace, chybových hlášeních, času, datu atp.
TIP: Pro to, abyste mohli vložit ovládací prvek StatusBar na plochu formuláře, musíte nejprve přidat do projektu komponentu Microsoft Windows Common Controls. (Příkaz nabídky Project/Components/Controls.)
97
UČEBNICE VISUAL BASICU 6.0
obr. 45 Návrh formuláře se zabudovaným ovládacím prvkem StatusBar StatusBar má několik důležitých vlastností. Jejich hodnoty lze nastavit již při návrhu for− mulářů zadáním v dialogovém okně Properties, které vidíte na obr. 46.
obr. 46 Vlastnosti ovládacího prvku StatusBar První vlastností je Style. Tato vlastnost může nabývat buď hodnoty 0 (konstanta sbrNor− mal) nebo 1 (sbrSimple). Hodnota 0 je implicitní a znamená, že prvek StatusBar může být rozdělen na několik ne− závislých panelů, z nichž každý může zobrazovat jiné informace. Protože tento způsob dělení ovládacího prvku StatusBar je nejčastější, začneme nejdříve s ním. Na obr. 47 je zobrazena záložka Panels okna vlastností prvku StatusBar, v níž se definují jednotlivé pa− nely.
98
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
obr. 47 Definice panelu ovládacího prvku StatusBar U každého panelu lze nastavit několik vlastností. Obraťme pozornost na ty nejdůležitější: • Index – každému panelu je přiřazen index. Slouží k rozlišení jednotlivých pane− lů. • Text – vlastnost obsahující textový řetězec, který bude v panelu zobrazen v pří− padě, že vlastnost Style je nastavena na hodnotu sbrText. • Style – určuje druh informace, kterou bude daný panel zobrazovat. Kromě výše zmíněné implicitní hodnoty sbrText můžete zvolit např. sbrTime – v tom případě bude daný panel zobrazovat aktuální čas počítače, na němž bude aplikace spuš− těna. • Minimum Width – Minimální šířka panelu. Uvedeným vlastnostem je možné jejich hodnoty přiřazovat také programovým kódem. Např. pokud máte na formuláři StatusBar s názvem stb1, můžete jej ovládat třeba takto: Private Sub Form_Load() Dim i As Integer Dim pan As panel Me.sbr1.Style = sbrNormal For i = 2 To Me.sbr1.Panels.Count Me.sbr1.Panels.Remove 2 Next i Me.sbr1.Panels.Add , , , sbrDate Me.sbr1.Panels.Add , , , sbrTime For Each pan In Me.sbr1.Panels pan.AutoSize = sbrSpring Next
99
UČEBNICE VISUAL BASICU 6.0 Me.sbr1.Panels(1).MinWidth = 3000 Me.sbr1.Panels(2).MinWidth = 1400 Me.sbr1.Panels(3).MinWidth = 1400 End Sub
V prvním kroku je nejprve nastaven style ovládacího prvku sbr1 jako celku na hodnotu sbrNormal (bude tedy možné definovat panely). Poté jsou z kolekce Panels odebrány všechny panely, které tam mohly být a je zachován panel jediný.
TIP: Alespoň jeden panel musí prvek typu StatusBar vždy obsahovat. Při pokusu o odstranění všech panelů nastane běhová chyba.
Dále jsou do kolekce Panels přidány panely, jejichž vlastnost Style je nastavena na hod− noty sbrDate, resp. sbrTime. Všem třem panelům je potom vlastnost AutoSize nastavena na hodnotu sbrSpring, tj.tak že velikost panelů se bude dynamicky měnit podle velikos− ti formuláře. Na závěr je nastavena minimální šířka jednotlivých panelů. Pokud uvedený příklad spustíte, bude formulář vypadat podobně jako na obr. 48.
obr. 48 Formulář s nadefinovaným prvkem StatusBar Vraťme se nyní k vlastnosti Style prvku StatusBar jako celku. Pokud tuto vlastnost nasta− víte na hodnotu sbrSimple, nebude možné pracovat s panely. Panel bude v tomto přípa− dě jediný – svou šířkou stejný jako celý prvek – a text v panelu zobrazený se bude ovlá− dat pomocí vlastosti SimpleText.
TIP: Nezaměňujte vlastnost Style panelu (např. sbr1.Panels(1).Style) a ovládacího prvku jako celku (např. sbr1.Style). První určuje, jaký druh informací bude panel zobrazovat. Druhá, jestli prvek bude zobrazovat panely nebo bude v režimu Simple.
100
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
ToolBar ToolBar (panel nástrojů) má podobnou funkci jako horizontální menu (nabídka). Často používané funkce menu (nebo i jiné, které v menu obsažené nejsou) je vhodné umístit na panel nástrojů. Microsoft Word používá několik panelů nástrojů. Ve standardním jsou ikony např.: pro založení nového, otevření existujícího nebo uložení otevřeného doku− mentu atd. Přístup uživatele k těmto funkcím se velmi urychlí.
TIP: K tomu, abyste mohli do formuláře přidat ovládací prvek ToolBar je nutné, stejně jako u prvku StatusBar, nejprve zaregistrovat komponentu Microsoft Windows Common Controls. (Příkaz nabídky Project/Components/Controls.)
Podobným způsobem, jakým jsme přidávali panely do prvku StatusBar, lze přidávat ta− ké tlačítka do kolekce Buttons ovládacího prvku ToolBar. Pro přidávání tlačítek slouží záložka Buttons na obr. 49.
Obr. 49 Přidávání tlačítek do panelu nástrojů Opět si popišme důležité vlastnosti tlačítek: • Index – opět identifikace tlačítka, která je mu přidělena • Caption – k tlačítku lze přiřadit obrázek nebo textový popis. Pokud chcete mít na tlačítku text, vepište jej do této vlastnosti • Key – klíč, který můžete definovat, ale nemusíte. Jedná se o doplňkovou identifi− kaci tlačítka. • Style – zde se určuje chování a vzhled tlačítka. K dispozici je několik hodnot té− to vlastnosti: • tbrDefault – jedná se o standardní tlačítko se stejným chováním, jaké má na− př. CommandButton • tbrCheck – tlačítko se může nacházet ve dvou stavech – stisknutém (vlastnost Value má v tom případě hodnotu tbrPressed) a nestisknutém (vlastnost Value
101
UČEBNICE VISUAL BASICU 6.0 má v tom případě hodnotu tbrUnPressed). Vhodné pro volbu jedné ze dvou možností. • tbrButtonGroup – tlačítko je zařazeno do skupiny. Tlačítko zůstává po klep− nutí myší stisknuto, dokud uživatel neklepne na jiné tlačítko skupiny. Ze sku− piny (tj. z tlačítek s hodnotou tbrButtonGroup vlastnosti Style) může být stisk− nuto nejvýše jedno. Vhodné pro volbu jedné z mnoha možností • tbrSeparator – tlačítko slouží jako oddělovač tlačítek nebo jejich skupin o šíř− ce 8 pixelů. Nemá žádnou další funkci. • tbrPlaceholder – stejná funkce jako tbrSeparator s tím, že je nastavitelná šířka. V případě, že chcete tlačítkům přiřadit obrázkové ikony, musíte mít tyto ikony uloženy v ovládacím prvku ImageList. ImageList je ovládací prvek, který také patří do Microsoft Windows Common Controls. Jeho okno vlastností vidíte na obr. 50.
obr. 50 ListImage obsahující obrázky
TIP: Obrázky, které hodláte umístit do ImageListu musíte mít nejprve uloženy na disku, odkud se vkládají do ImageListu. Po vložení do ImageListu se pracuje s kopií obrázku uloženou v aplikaci (tj.bez ohledu na to, zda je nebo není obrázek dostupný na disku).
Obrázek se vkládá tlačítkem Insert Picture (viz obr. 50) a k jeho odstranění slouží Remo− ve Picture. Každý obrázek (uložený v kolekci Images ovládacího prvku) má svůj Index a Key, což jsou nejdůležitější vlastnosti pro jeho ovládání.
102
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Když chcete přiřadit obrázky tlačítkům ToolBaru, musíte nejprve umístit na formulář ovládací prvek ImageList, naplnit jej obrázky, a potom přiřadit odkaz na ovládací prvek ImageList do vlastnosti s názvem ImageList ToolBaru. Viz následující příklad: Private Sub Form_Load() Set Me.tlb1.ImageList = Me.ImageList1 AddImagesToToolbar End Sub Private Sub AddImagesToToolbar() Dim btn As Button For Each btn In Me.tlb1.Buttons If btn.Key <> ““ Then btn.Image = btn.Key End If Next End Sub
Uvedený kód předpokládá, že jste nejprve založili ToolBar s názvem tlb1 a umístili na něj (viz obr. 49) libovolné množství tlačítek. U těch tlačitek, kterým má být přiřazena ob− rázková ikona jste definovali vlastnost Key. Všechna zbylá tlačítka mají jako hodnotu vlastnosti Key prázdný řetězec. Potom jste umístili na plochu formuláře ovládací prvek ImageList s názvem ImageList1. ImageList jste naplnili obrázky (viz obr. 50) s tím, že ikony, které mají být zobrazeny na tlačítcích ToolBaru mají hodnotu Key stejnou jako je hodnota této vlastnosti u příslušné− ho tlačítka. Tedy pokud chcete, aby tlačítko neslo obrázek nového dokumentu, musí mít toto tlačít− ko i obrázek v ImageListu stejnou hodnotu vlastnosti Key. Pokud jsou všechny tyto podmínky splněny, můžete spustit kód. Výsledkem bude for− mulář s naplněným ToolBarem.
obr. 51 Formulář obsahující ovládací prvky StatusBar a ToolBar.
103
UČEBNICE VISUAL BASICU 6.0
TIP: V jediném formuláři můžete mít i více než pouze jeden ToolBar.
A jakým způsobem dále naprogramovat chování aplikace při klepnutí na některé tlačít− ko ToolBaru? Slouží k tomu událostní procedura tlb1_ButtonClick. Kód této procedury by mohl vypadat nějak takto: Public Sub tlb1_ButtonClick(ByVal Button As ComctlLib.Button) Select Case Button.Key Case “New“ ‘/// ošetření nové položky Case “Print“ ‘/// ošetření tisku Case “Preview“ ‘/// ošetření náhledu End Select End Sub
V proceduře je třeba zajistit, aby bylo rozeznáno tlačítko, na které uživatel klepnul. V na− šem případě je použita jednoznačná identifikace podle hodnoty vlastnosti Key tlačítka. Objekt Button odkazující na tlačítko, které bylo stisknuto, je vstupním parametrem této událostní procedury.
Další tipy pro tvorbu user friendly aplikací TIP: Používejte vlastnost ToolTipText. Většina viditelných ovládacích prvků na formuláři má vlastnost ToolTipText, které lze přiřadit libovolnou hodnotou typu String. Tento text se potom objeví jako kontextová nápověda vždy ve chvíli, kdy uživatel umístí kurzor myši nad tento ovládací prvek. ToolTipText může obsahovat doplňující informace, které nelze zanést kvůli velikosti prvku např. do jeho vlastnosti Caption.
TIP: Používejte korektně Z-Order. Ačkoli uživatelé budou vždy při ovládání aplikace používat myš, měla by být aplikace plně ovladatelná i bez myši (stejně jako např. systém Windows). K přenášení fokusu (zaměření) mezi jednotlivými prvky v tom případě slouží klávesa TAB. To, v jakém pořadí jsou při opakovaném stisku této klávesy ovládací prvky formuláře zaměřovány, se nazývá Z-order. Každý viditelný prvek formuláře má vlastnosti TabStop a TabIndex. Hodnota vlastnosti TabStop je Boolean, přičemž True znamená, že objekt je zařazen mezi objekty, na které se přenáší fokus při opakovaném stisku klávesy TAB. Hodnota False jej z těchto prvků vylučuje. Vlastnost TabIndex je číselná a znamená pořadové číslo v kolekci Z-Order, tj. jako kolikátý získá prvek fokus. Po natažení a aktivaci formuláře je vždy zaměřen prvek s hodnotou 0 vlastnosti TabIndex. (Pokud takový prvek neexistuje, je zaměřen prvek s nejnižší hodnotou).
104
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Pokud chcete, aby hned po zobrazení formuláře byl zaměřen jiný ovládací prvek než ten s nejnižší hodnotou TabIndex, můžete to zajistit naprogramováním událostní procedury Form_Activate, která bude obsahovat kód Nazevprvku.SetFocus. Metodu SetFocus mají všechny viditelné ovládací prvky. Není možné volat metodu SetFocus v proceduře Form_Load, protože v té chvíli nejsou ještě ovládací prvky nataženy v paměti počítače.
TIP: Používejte klávesové zkratky. Položky menu mohou být dostupné klávesovými zkratkami (Shortcut), které lze pro každou položku menu definovat v okně vlastností.
Otázky a úkoly: 1) Jaké další uživatelsky příjemné funkce znáte z komerčních aplikací? 2) K čemu by se dal ještě použít ovládací prvek ImageList? 3) Zkuste do ToolBaru přidat i jiné ovládací prvky než pouze tlačítka a naprogramujte jejich funkčnost.
105
Lekce 11
Tisk a ovládání tiskáren Cíle lekce: Zvládnout jednoduché formátování texto− vých stran pro tiskárnu a zajistit jejich tisk na zvolené tiskárně. Tisk z aplikací Visual Basicu je jednou z častých a ne zrovna jednoduchých programá− torských úloh. Tisky složitých grafických výstupů v této lekci pomineme a zaměříme se na jednoduššími prostředky řešitelné tisky textových stran. Vytvořme tedy aplikaci, která sama vyhledá tiskárny nainstalované v systému Windows, nabídne jejich seznam a zajistí tisk textového dokumentu na vybrané tiskárně. Založte te− dy nový formulář a vytvořte na něm ComboBox s názvem comTiskárna a její vlastnost Style nastavte na hodnotu 2. Dále vytvořte TextBoxy s názvem txtNadpis a txtText. Vlast− nost MultiLine u prvku txtText nastavte na hodnotu True. Posledním ovládacím prvkem bude CommandButton s názvem cmdTisk.
obr. 52 Formulář pro tisk V první proceduře se pouze naplní ComboBox comTiskarna názvy všech tiskáren, které jsou nainstalovány v systému Windows (viz obr. 53).
obr. 53 Nainstalované tiskárny ve Windows
107
UČEBNICE VISUAL BASICU 6.0 K tomu se používá kolekce Printers, která sama zjistí údaje o všech tiskárnách, které jsou právě nainstalovány. Private Sub Form_Load() Dim i As Integer If Printers.Count > 0 Then For i = 0 To Printers.Count – 1 comTiskarna.AddItem Printers(i).DeviceName comTiskarna.ItemData(comTiskarna.NewIndex) = i Next i comTiskarna.ListIndex = 0 Else MsgBox Prompt:=“Aplikace nenašla žádnou připojenou tiskárnu. “ & _ “ Nainstalujte alespoň jednu tiskárnu a spuskte program znovu.“, _ Buttons:=vbCritical + vbOKOnly, Title:=“Chyba“ Unload Me End If End Sub
Pokud není nainstalována žádná tiskárna, aplikace vypíše chybové hlášení a sama se ukončí.
TIP: Pokud si chcete vyzkoušet běh programu včetně tisku a nemáte žádnou tiskárnu, kterou byste mohli k počítači připojit, nainstalujte ji nikoli na paralelní port LPT1, ale na FILE (tisk do souboru) – viz obr. 54. Při tisku budete vyzváni k zadání názvu souboru, kam se tisk uloží.
obr. 54 Instalace tiskárny na FILE Potom již zbývá pouze zajistit vytištění údajů v proceduře cmdTisk_Click. Do této pro− cedury vložte následující text.
108
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Private Sub cmdTisk_Click() On Error Resume Next Set Printer = Printers(comTiskarna.ListIndex) Printer.Copies = 1 Printer.PaperSize = vbPRPSA4 Printer.Orientation = vbPRORPortrait Printer.CurrentX = 0 Printer.CurrentY = 720 Printer.FontSize = 14 Printer.Print txtNazev.Text Printer.CurrentX = 0 Printer.CurrentY = 1125 Printer.FontSize = 10 Printer.Print txtText.Text Printer.EndDoc End Sub
Nejprve jako aktivní tiskárnu nastavte tu, která je zvolena v ComboBoxu comTiskarna. dále se nastavují vlastnosti tisku: • Printer.PaperSize = vbPRPSA4 velikost papíru A4 • Printer.Orientation = vbPRORPortrait Orientace papíru na výšku • Printer.CurrentX = 0 Tisková pozice prvního písmene v horizontálním směru • Printer.CurrentY = 720 Tisková pozice prvního písmene ve vertikálním směru • Printer.FontSize = 14 Velikost písma Příkazem Printer.Print se plní buffer (vyrovnávací paměť) naformátovaným textem ur− čeným pro tisk. Teprve příkaz Printer.EndDoc odešle celý buffer na tiskárnu.
TIP: Všimněte si, že při tisku textu příkazem Printer.Print txtText.Text se vytiskne na jediný řádek papíru celý text až do jeho odřádkování. Proto je nutné dlouhé texty explicitně odřádkovat vložením znaku Chr(13) za každý např. 60. znak v závislosti na velikosti fontu.
109
UČEBNICE VISUAL BASICU 6.0
TIP: Můžete také explicitně poslat na tiskárnu příkaz, aby následující řádek byl vytištěn již na nové stránce. Tímto příkazem je Printer.NewPage.
TIP: Ze zkušenosti víte, že tiskárnu lze nastavit zadáním mnohem většího počtu vlastností. Počet těchto vlastností se však liší v závislosti na použitém ovladači tiskárny. Ovladače starších tiskáren nepodporují některé vlastnosti, a proto při pokusu o jejich nastavení vznikne běhová chyba programu. Je tedy důležité mít na začátku rutiny příkaz On Error Resume Next, který tento nedostatek odchytí. O ošetřování chyb se více dozvíte v jedné z následujících lekcí.
TIP: Pro vytištění grafiky můžete moužít metody Circle, Line a PaintPicture.
Jak vidíte, tisk tímto způsobem skutečně není příliš příjemný.
CommonDialog Nastavení tiskárny vám zpříjemní ovládací prvek CommonDialog. Abyste jej mohli umís− tit na formulář, je nutné zaregistrovat komponentu Microsoft Common Dialog Control. Pokud tuto komponentu umístíte na formulář, můžete výhodně používat množství obec− ných dialogových oken, které jsou velice podobné těm v systému Windows. Ovládací prvek CommonDialog má několik metod vyvolávajících různá dialogová okna: • ShowOpen
(viz obr. 55)
• ShowSave
(viz obr. 56)
• ShowColor
(viz obr. 57)
• ShowFont
(viz obr. 58)
• ShowPrinter
(viz obr. 59)
• ShowHelp
(viz obr. 60)
110 obr. 55 ShowOpen
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
obr. 56 ShowSave
obr. 57 ShowColor
obr. 58 ShowFont
111
UČEBNICE VISUAL BASICU 6.0
obr. 59 ShowPrinter
obr. 60 ShowHelp Hodnoty nastavené v jednotlivých dialozích jsou zaneseny do vlastností ovládacího prvku CommonDialog. Zkuste si například: Me.CommonDialog1.ShowPrinter Printer.Copies = CommonDialog1.Copies
Otázky a úkoly: 1) Vyzkoušejte si použití metod pro tisk grafických objektů Circle, Line a PaintPicture. Jaké další problémy s formátováním použití těchto metod přináší? 2) Jaké další (v lekci neuvedené) metody a vlastnosti objektu Printer můžete využít ve Visual Basicu? 3) Použijte CommonDialog pro otevření textového souboru a načtení dat.
112
Lekce 12
Chyby a jejich ošetření Cíle lekce: naučit se zpracovávat běhové chyby pro− gramu. Dobrá aplikace musí fungovat vždy a za všech okolností. Proto musí programátor při své práci předvídat, k jakým problémům může při jejím používání dojít. Všechny potenciál− ní chyby jistě nelze do detailů předvídat, ale je možné ošetřit tyto nečekané události ale− spoň tak, že v případě jejich výskytu se aplikace nezhroutí, ale zakáže příslušnou akci a vypíše o tom zprávu na monitoru počítače. Slovo Error (které v překladu znamená „chyba“) představuje v jazyce Visual Basic funkci, objekt, příkaz nebo událost. Každý z těchto významů slova Error se od ostatních liší, a proto má i odlišné použití. Mají však jedno společné – slovo Error je vždy spoje− no s chybou běhu aplikace. Zaměřme se nejprve na chybové události, jejichž ošetření je možné připojením událost− ní procedury připojené k události Error formuláře nebo sestavy. Událost Error se vzta− huje spíše na chyby komunikace aplikace s ostatními součástmi operačního systému Windows přes svá rozhraní nebo na komunikaci se vzdáleným zdrojem dat. Nevztahuje se tedy na chyby samotného kódu Visual Basicu.
TIP: Událost Error může nastat při chybném přístupu k datům v době, kdy není spuštěn programátorem vytvořený kód Visual Basicu.
Vykonáním událostní procedury při výskytu události Error můžete odchytit chybovou zprávu programu Visual Basic a zobrazit vlastní zprávu, která bude lépe vyhovovat vaší aplikaci, případně se pokusit chybu napravit. Událostní procedura má dva argumenty: • DataErr – chybový kód vrácený objektem Err (jeho vlastností Number) v přípa− dě, že dojde k chybě. Vlastnost Description tohoto objektu obsahuje stručný popis chyby. Pomocí argumentu DataErr procedury Error můžete zjistit, jaká chyba se v aplikaci vyskytla. • Response − vnitřní konstanta určující, zda bude či nebude zobrazena chybová zpráva. Možnosti nastavení argumentu Response jsou následující konstanty: 1. konstanta vbDataErrContinue znamená ignorovat chybu a pokračovat bez zobrazení výchozí chybové zprávy programu Visual Basic. Místo výchozí chybové zprávy můžete poskytnout vlastní chybovou zprávu. 2. konstanta vbDataErrDisplay je výchozí hodnotou argumentu Response a zna− mená zobrazení implicitně definované chybové zprávy.
113
UČEBNICE VISUAL BASICU 6.0 Nabízíme zde pro lepší orientaci přehled zachytitelných chyb s jejich stručným popisem tak, jak budou kódy chyb a kontextový popis obsahovat vlastnosti Number a Descrip− tion objektu Err.
TIP: Kódy chyb platí nejen pro chybové události, ale i pro chyby Visual Basicu, které se pomocí událostní procedury Error ošetřit nedají.
114
Kód
Událost
3
Použití Return bez příkazu GoSub
5
Chybné volání procedury
6
Přetečení
7
Nedostatek paměti
9
Index mimo rozsah
10
Pole je pevné nebo dočasně zamknuté.
11
Dělení nulou
13
Typ nesouhlasí
14
Nedostatek místa v řetězci
16
Příliš složitý výraz
17
Požadovanou operaci nelze provést
18
Přerušeno uživatelem
20
Použití Resume bez chyby
28
Nedostatek místa na zásobníku
35
Podprogram, funkce nebo vlastnost není definována
47
Knihovnu DLL využívá příliš mnoho aplikací
48
Chyba při načítání knihovny DLL
49
Chybná konvence volání knihovny DLL
51
Vnitřní chyba
52
Špatný název nebo číslo souboru
53
Soubor nebyl nalezen
54
Špatný režim souboru
55
Soubor je již otevřen
57
Vstupně−výstupní chyba zařízení
58
Soubor již existuje
59
Chybná délka záznamu
61
Plný disk
62
Vstup za koncem souboru
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU 63
Chybné číslo záznamu
67
Příliš mnoho souborů
68
Zařízení není dostupné
70
Přístup odmítnut
71
Disk není připraven
74
Nelze přesunout na jinou jednotku
75
Chyba v přístupu k souboru nebo k cestě
76
Cesta nenalezena
91
Není nastavena objektová proměnná nebo proměnná bloku With
92
Neinicializovaná smyčka For
93
Chybný řetězec vzorku
94
Chybné použití Null
444
Metoda se nedá použít v tomto kontextu.
452
Chybné číslo procedury DLL
453
DLL funkce nenalezena
457
Klíč je již použit (zakázaná duplicita klíče)
460
Chybný formát schránky (Clipboard)
461
Specifikovaný formát dat není kompatibilní se spouštěnou metodou
480
Visual Basic nemůže vytvořit rastrový obrázek pro funkci automatického překreslování
481
Chybný obrázek
482
Chyba tiskárny
483
Ovladač tiskárny nepodporuje uvedenou vlastnost
484
Problémy při získávání tiskových informací ze systému. Ujistěte se, že tis− kárna je nastavena správně.
485
Chybný typ obrázku
520
Nelze vymazat schránku (Clipboard)
521
Nelze otevřít schránku (Clipboard)
Podrobnější popis chyb naleznete v elektronické nápovědě programu Visual Basic. Pří− kladem událostní procedury, která zobrazí vlastní chybové hlášení v situaci, kdy pro dal− ší běh aplikace (resp. požadovanou operaci) není dostatek paměti RAM zakončeme vý− klad týkající se klíčového slova Error ve smyslu události: Private Sub Form_Error(DataErr As Integer, Response As Integer) If DataErr = 7 Then MsgBox “Nedostatek paměti. Operace bude zrušena.“, vbExclamation Response = vbDataErrContinue End If End Sub
115
UČEBNICE VISUAL BASICU 6.0
Použití příkazu On Error Nyní se zaměřme na zachytávání a odstraňování chyb generovaných při běhu programo− vého kódu Visual Basic. K tomu slouží příkaz Visual Basicu On Error. S příkazem On Error jsme se již setkali v úvodní kapitole při vytváření příkladu prohlížeče obrázků. Ny− ní si tedy programovou konstrukci zachytávání chyb popišme detailněji. Existuje trojí možná syntaxe tohoto příkazu: 1. On Error Resume Next Při výskytu chyby při běhu programu se řízení předá pří− kazu, který bezprostředně následuje za příkazem, u kterého se chyba vyskytla; zpra− cování pokračuje bez skoku. 2. On Error GoTo 0 Vypíná libovolnou rutinu pro obsluhu chyby v dané procedu− ře, pokud byla zapnuta. Bez použití příkazu On Error GoTo 0 je rutina pro obsluhu chyb vypnuta automaticky při opuštění procedury. 3. On Error GoTo řádek Tento příkaz zapíná rutinu pro obsluhu chyby, jejíž začá− tek je určen parametrem řádek, kde řádek je libovolné návěští řádku nebo číslo řád− ku. Při výskytu chyby při běhu programu se řízení předá rutině pro obsluhu chyby určené parametrem řádek. Řádek určený parametrem řádek musí být součástí stejné procedury jako je příkaz On Error; v opačném případě vznikne chyba při překladu. Nejtypičtější příklad použití příkazu On Error je v obecné podobě popsán na následu− jících řádcích: Sub MojeProc() On Error GoTo Chyba sekce deklarací proměnných procedury tělo procedury Konec: Exit Sub Chyba: MsgBox Err.Description Resume Konec End Sub Pokud v proceduře při provádění nedojde k běhové chybě, provede se celé tělo proce− dury až k příkazu Exit Sub, kde se provádění procedury ukončí. Pokud však kdekoli v proceduře dojde k běhové chybě, řízení programu bude předáno na řádek uvozený návěštím Chyba. Za tímto návěštím následuje kód ošetření chyby. V našem případě pří− kaz MsgBox vytiskne chybové hlášení uložené ve vlastnosti Description objektu Err a příkaz Resume pak přenese řízení na řádek s návěštím Konec. Pak už bude procedu− ra ukončena. Pokud se vyskytne běhová chyba v proceduře, která neobsahuje jejich ošetření, aplikace se zastaví a nebude možné pokračovat v práci.
116
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: V některých případech lze možné výskyty běhových chyb předvídat a ošetřit je tak precizněji než pouhým ukončením běhu procedury. Např. před načítáním souboru z disku je vhodné ověřit, zda soubor zadaného jména existuje či nikoli. To lze jednoduše provést voláním následující procedury: Function FileExists (ByVal strFileName As String) As Boolean FileExists = (Dir(strFileName) <> ““) End Function
Funkce Dir vrací první soubor, který vyhovuje názvu souboru uvedeném v argumentu funkce. Pokud takový soubor nenalezne, vrací funkce řetězec nulové délky. Procedura FileExists tedy vrací hodnotu True, pokud soubor (jehož název se předává do proměn− né strFileName) existuje a hodnotu False, pokud neexistuje. I v této proceduře se však mohou vyskytnout běhové chyby, které je nutné ošetřit. A to konkrétně chyba č. 71 – disk není připraven, pokud se soubor má hledat na disketě, je− jíž mechanika je prázdná nebo chyba č. 68 – zařízení není dostupné, pokud je za− dáno písmeno, kterému není přiřazen žádný disk. Použití příkazu On Error doplněného do procedury FileExists by v tomto případě mo− hlo vypadat takto (je uveden pouze kód ošetření chyby č. 71): If (Err.Number = 71) Then If MsgBox(“Vložte disketu. Hotovo?“, vbExclamation + vbYesNo) =vbYes Then Resume Else Resume Next End If End If
Příkaz Resume stojící samostatně vrací řízení procedury na příkaz, který chybu vyvolal. Příkaz Resume Next vrací řízení procedury na příkaz bezprostředně následující za pří− kazem, který chybu vyvolal.
TIP: Syntaxe příkazu Resume ukončujícím chybovou rutinu má – stejně jako příkaz On Error – tři možné podoby.
Ošetření chyby č. 68 by vypadalo podobně.
TIP: Při ladění programu může být užitečné zjistit chování vaší aplikace při výskytu některých konkrétních chyb. Možností, jak to udělat, je příkaz Error stojící samostatně. Tento příkaz vygeneruje chybovou zprávu, která odpovídá danému číslu chyby. Syntaxe: Error[(číslo chyby)]. Tato syntaxe představuje další význam slova Error při vytváření aplikací.
117
UČEBNICE VISUAL BASICU 6.0
TIP: Údaje o chybách vygenerovaných při běhu programu se ukládají do vlastností objektu Err.
Existuje ještě jeden prostředek, který programátorovi pomáhá řešit chybové situace – ob− jekt Err. I s tímto objektem jsme se již v dřívějším textu setkali a nyní se u něho zasta− víme podrobněji. Objekt Err obsahuje informace o chybách vzniklých za běhu progra− mu. Dovoluje použití metod Raise a Clear pro generování a mazání chyb vzniklých za běhu programu. Syntaxe: Err[.{vlastnost | metoda}] S některými vlastnostmi objektu Err jsme se již setkali, jiné jsou pro nás nové • Number Hodnota určená jako argument v příkazu Error. Může být libovolné platné číslo chyby. • Source
Název současného projektu (sady modulů) v jazyce Visual Basic.
• Description Řetězec, který vrací funkce Error pro určenou hodnotu Num− ber, pokud takový řetězec existuje. Neexistuje−li tento řetězec, obsahuje hodnota vlastnosti Description text „Chyba způsobená aplikací nebo objektem.“ • HelpFile Určuje diskovou jednotku, úplnou cestu a soubor obsahující nápově− du programu Visual Basic. • HelpContext Identifikátor kontextu v souboru nápovědy programu Visual Ba− sic Help pro chybu, která odpovídá vlastnosti Number. • LastDLLError Vyskytuje se pouze u 32−bitových operačních systémů Microsoft Windows. Obsahuje kód systémové chyby naposledy volané dynamické knihov− ny (DLL). Vlastnost LastDLLError je pouze pro čtení. Metody objektu Err: • Raise
Generuje chybu při běhu programu.
• Clear Metoda Clear se používá pro explicitní vynulování objektu Err poté, co byla chyba obsloužena. Program Visual Basic sám vyvolá metodu Clear vždy, když je proveden některý z uve− dených příkazů: • libovolný příkaz Resume • Exit Sub, Exit Function, Exit Property.
TIP: Programátor může definovat své vlastní chyby funkcí CVErr. Jejich čísla mohou být v rozsahu 0 – 65535, ale nesmějí se dostat do konfliktu s čísly chyb definovanými systémem Microsoft Access. Příkladem situace, kdy se může vygenerovat uživatelská chyba, je následující procedura: Function Mocnina(Number) If IsNumeric(Number) Then
118
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Mocnina = Number * Number
‘ Návratová hodnota.
Else Mocnina = CVErr(65000) End If
‘ Návrat uživatelem definovaného ‘ čísla chyby.
End Function
Pokud předaný argument Number (typu Variant) není číselného typu, funkce Mocnina vrátí chybový kód číslo 65000. Procedura, která volá funkci Mocnina, pak pomocí funkce IsError pozná, zda vrácená hodnota je návratovou hodnotou procedury nebo číslem chyby. Konstrukce volání procedury If IsError(Mocnina(Number)) Then [příkazy] End If
Otázky a úkoly: 1) Co jsou to zachytitelné chyby? 2) Projděte pečlivě všechny programy předcházejících lekcí této knihy a doplňte je o kód ošetřující běhové chyby aplikací. 3) Vylepšete kód ošetřující běhové chyby aplikací tak, že každou chybu zapíše do tzv. LOG souboru – textového souboru, kde se zaznamená vždy datum a čas výskytu chyby a její popis.
119
Lekce 13
Ladění programového kódu Cíle lekce: Naučit se efektivně ladit programový kód Ladění napsaného programového kódu je – zvláště u rozsáhlejších aplikací – naprosto nezbytnou součástí práce programátora. Pojem „ladění“ v sobě zahrnuje veškeré úpravy a analyzování aplikace od prvního napsání programového kódu až k jeho konečné po− době. Každý, kdo někdy zkusil programovat v kterémkoli programovacím jazyce, zjistil, že zápisem programového kódu práce na programu zdaleka nekončí. První tzv. vyšší programovací jazyky nabízely jako prostředek pro ladění pouze jednoduchý editor. S po− stupujícím časem se rozvíjela i nabídka ladících nástrojů, které dovolují nejen editovat zdrojový text programu a opravovat chyby, ale především analyzovat program. Tyto ná− stroje tak pomáhají nejen při odhalování vašich vlastních chyb, kterých se při psaní pro− gramů dopustíte, ale také usnadňují modifikaci programů a slouží i ke snadnějšímu po− chopení principu činnosti aplikací vytvářených jiným programátorem.
TIP: Při psaní programového kódu vždy počítejte s tím, že program bude jednou třeba upravit a že tuto činnost již nemusíte provádět vy. Proto se snažte vytvářet programový text graficky i funkčně přehledný a nešetřete v něm komentáři. Může vám to později ušetřit mnoho času.
Při ladění kódu se budete setkávat se třemi druhy chyb: 1. První skupinu chyb tvoří chybný syntaktický zápis příkazů. Bez odstranění těchto chyb není možné program zkompilovat a tudíž ani spustit. Kontrola syntaxe vkláda− ných klíčových slov je prováděna již při vkládání kódu do okna Module. Při pře− chodu na další řádek pomocí klávesy ENTER se automaticky zkontroluje syntaxe příkazů právě vloženého řádku. Pokud je syntaxe chybná, Visual Basic vás na to upozorní a text tohoto řádku zčervená. Při samotném zápisu kódu tak odhalíte vět− šinu syntaktických chyb a následná kompilace pak již proběhne poměrně hladce.
TIP: Automatickou kontrolu syntaxe při zápisu kódu lze zakázat. Dosáhnete toho zrušením zaškrtnutí pole Auto Syntax Check (Automatická kontrola syntaxe) na kartě Module dialogového okna Options. Okno zobrazíte příkazem Tools/Options z horizontálního menu.
2. Dalším druhem chyb jsou chyby, které vznikají při běhu programu (Runtime Errors). Tyto chyby vzniknou při provádění programu ve chvíli, kdy se program po− kouší provést nemožnou operaci. Nemožná operace může být např. dělení nulou, snaha o zápis souboru dat do neexistujícího adresáře apod.
121
UČEBNICE VISUAL BASICU 6.0 3. Poslední skupinou chyb, které se detekují většinou nejhůře, jsou chyby sémantické. Program funguje navenek normálně, neobjevují se žádná chybová hlášení, ale výstu− py neodpovídají vašim očekáváním. Jinak řečeno, program dělá něco jiného, než jste po něm chtěli. V takovém případě nezbývá, než se prokousávat postupně jednotlivý− mi částmi programu (trasovat ho) a hledat, kde se ještě program chová „normálně“ a kde už sešel z cesty, kterou jste mu vyznačili. Pro trasování má naštěstí Visual Ba− sic velkou sadu pomocných nástrojů, které tuto část ladění programu velmi usnadní. Aby bylo možné plně využít ladící nástroje Visual Basicu, je nutné v kritických momen− tech přerušit provádění kódu. Aktivním oknem se pak stane ladící okno. V ladícím okně pak můžete kontrolovat a nastavovat okamžité hodnoty výrazů a proměnných, vlastnos− tí jednotlivých objektů atd. Přerušení programu je možné docílit několika způsoby: Nastavením zarážky na řádek, kde chcete, aby se program zastavil. Umístěte kurzor do okna Module na řádek, kde ještě není umístěna zarážka a pak klikněte na tlačítko „Bre− akpoint“ (zarážka) v panelu nástrojů. Můžete použít i příkaz Run/Toggle Breakpoint z ho− rizontálního menu, příp. klávesovou zkratku F9. Řádek se zarážkou bude v okně Modu− le (které zobrazuje prováděný kód) prosvícen. Zrušení zarážky se provádí stejnými příkazy jako její nastavení, pokud je kurzor v okně Module umístěn na řádek s nastavenou zarážkou. Pokud máte nastaveny zarážky, program se na nich při provádění kódu vždy zastaví. Po doladění programu je tedy třeba všechny zarážky vymazat. Všechny nastavené zarážky vy− mažete příkazem Run/Clear All Brekpoints, resp. klávesovou zkratkou CTRL+SHIFT+F9. Všechny nastavené zarážky se samy automaticky smažou při zavření programu Visual Ba− sic, ve kterém své aplikace vytváříte. Trvalé zarážky se dají nastavit příkazem Stop – viz dále. Při zastavení běhu programu na zarážce zobrazí Visual Basic okno Module, ve kterém je aktuální příkaz (právě prováděný) zobrazen v rámečku. Od tohoto okamžiku lze pro− gram trasovat, a to dvojím způsobem: jednak příkazem Run/Step Into (klávesová zkrat− ka F8), jednak příkazem Run/Step Over (klávesová zkratka SHIFT+F8). Ikona „Step Into“ (krok do) a ikona „Step Over“ (krok přes) panelu nástrojů. Příkazem Step Into se nejprve vykoná aktuální příkaz, a pak se automaticky pokračuje následujícím příkazem. Postupně se tedy trasuje veškerý programový kód včetně proce− dur a funkcí volaných z procedury, odkud trasujete. Naproti tomu Step Over se používá u programů, kde tyto volané procedury jsou již odladěny a jejich trasování proto není žádoucí – aktuální řádek tak stále zůstává v původní proceduře. Volaná procedura se při tomto typu trasování provede jako jeden celek. Existuje ještě mnoho ladících fines, které vám mohou být při práci ve Visual Basicu uži− tečné. Uveďme nyní některé formou tipů:
122
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Není nutné vykonávat všechny příkazy postupně. Příkaz Run/Set Next Statement z horizontálního menu (který je dostupný při přerušení běhu programu) nastaví jako aktivní příkaz ten, na kterém je právě umístěn kurzor. Další krokování pak probíhá od tohoto příkazu.
TIP: V okně Module je možné na libovolné místo programu umístit kurzor a použít příkaz Run/Step to Cursor, klávesová zkratka CTRL+F8.
Další možností, jak přerušit provádění kódu je umístění příkazu Stop na příslušné místo zdrojového textu. Příkaz Stop působí naprosto identicky jako zarážka, s jednou výjim− kou. Po zavření a následném otevření příslušné aplikace zůstává příkaz Stop (na rozdíl od klasických zarážek) na svém místě. Pomocí tohoto příkazu nastavíte zarážky trvale.
TIP: Příkaz Stop představuje nastavení trvalých zarážek do programu, a proto musíte všechny jeho výskyty v konečné fázi úprav z aplikace vypustit.
Třetí možností, jak přerušit činnost programu je je použití kombinace kláves CTRL+BREAK.
Ladicí okno Nyní je čas k podrobnému popisu ladicího okna jako hlavního nástroje k odhalování a odstraňování chyb v programech Visual Basic. Okno Ladění se skládá ze dvou částí: • z příkazového podokna, ve kterém lze sledovat hodnoty ovládacích prvků, polí, vlastností, vyhodnocovat výrazy, tisknout výsledky atd. • z části Watch (používá se neobratný překlad kukáto), kde se sleduje hodnota konkrétních proměnných pomocí výrazu kukátka. Pomocí výrazu kukátka lze ta− ké nastavit přerušení běžícího programu (podobně jako to dělají zarážky nebo příkaz Stop). Program se v tomto případě nepřeruší na konkrétním řádku, jako je tomu u zarážek, ale ve chvíli, kdy se např. změní hodnota některé proměnné nebo tato hodnota dosáhne určité hodnoty. Výrazy kukátka lze do okna Ladění přidat buď před spuštěním programu nebo při jeho přerušení. Slouží k tomu dialogové okno „Add Watch“ (Přidat kukátko) (viz obr. 24) které zobrazíte příkazem Tools/Add Watch z horizontálního menu.
123
UČEBNICE VISUAL BASICU 6.0
Obr. 61 Dialogové okno Add Watch (Přidat kukátko), kde se definují výrazy pro sledová− ní okamžitých hodnot. Spodní rámeček v okně Přidat kukátko se nastavuje způsob vyhodnocení výrazu kukát− ka. Výraz může tvořit samostatný identifikátor proměnné nebo složitý výraz s množstvím operátorů. Pokud nastavíte Typ kukátka na hodnotu Přerušit při pravdivosti výrazu ne− bo Přerušit při změně výrazu, bude mít hodnota výrazu kukátka význam zarážky při bě− hu programového kódu ve smyslu, který byl popsán v předcházejících řádcích. V podok− ně kukátka ladícího okna se vlevo od každého definovaného výrazu kukátka zobrazí ta− ké grafická ikona jeho typu. Zde jsou tyto ikony: • Přerušit při pravdivosti výrazu (Break When Value Is True), • Přerušit při změně výrazu (Break When Value Changes), • Výraz kukátka (Watch Expression) . Rámeček Context slouží k omezení oboru, který bude použit pro sledování proměnných. Visual Basic provede vyhodnocení výrazu rychleji ve zúženém kontextu. Kromě podokna kukátka v ladícím okně můžete využít i další nástroj pro sledování hod− not výrazů. Tlačítkem „Instant Watch“ (okamžité kukátko) z panelu nástrojů (resp. pří− kazem Tools/Instant Watch nebo klávesovou zkratkou SHIFT+F9) můžete zobrazit libo− volný výraz, který při přerušení běhu programu zvýrazníte v okně Module. Druhým podoknem ladícího okna je příkazové podokno. Příkazové podokno je schop− né vyhodnotit jakýkoli platný výraz včetně volání procedur Sub a Function. Hodnoty se v příkazovém podokně zobrazují metodou Print objektu Debug. Tuto metodu lze volat jednak z programového kódu nebo ji zapsat rovnou do příkazového podokna. Pokud zapisujete výraz přímo do příkazového podokna, lze to udělat tímto způsobem: Debug.Print výraz
TIP: Není-li příkazové podokno otevřeno před spuštěním běhu programu, samotné vykonání příkazu Debug.Print ho nezobrazí. Výstup sice bude směřován do tohoto okna, ale zobrazené hodnoty si budete moci prohlédnout až po přerušení běhu aplikace, kdy bude možné toto podokno zobrazit.
124
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU
TIP: Příkazové podokno lze používat nejen ke zjišťování hodnot výrazů, ale také k přiřazení hodnot vlastnostem a proměnným. Syntaxe je v tomto případě zcela stejná jako při přiřazování hodnot v programovém kódu procedur.
TIP: Pokud máte v příkazovém podokně zapsaný příkaz, který chcete provést znovu, nemusíte jej již vypisovat. Stačí na příslušný řádek umístit kurzor a stisknout klávesu ENTER. Příkaz se znovu vyhodnotí.
Při tvorbě aplikací se dá využít příkazů Visual Basicu, které neřídí aplikaci přímo při je− jím běhu, ale zprostředkovaně tím, že ovládají kompilátor systému Visual Basic – jsou to příkazy kompilátoru, které jsou oproti „klasickým příkazům uvozeny znakem dvojitého kříže (#). Podmíněná kompilace kódu se dá použít pro zahrnutí nebo vyřazení kódu, který se liší pro různé mutace vytvářené aplikace. Podmíněná kompilace představuje poslední ze základních ladicích nástrojů, které si v na− ší učebnici popíšeme. Pro podmíněnou kompilaci se využívají příkazy kompilátoru #If...Then a #End If.
TIP: Od příkazů Visual Basicu se příkazy kompilátoru liší pouze symbolem dvojitého kříže (#) a i syntaxe obou konstrukcí je shodná.
Je−li výraz typu Boolean umístěný mezi klíčovými slovy If a Then pravdivý, pak je kód, který následuje, zahrnut do kompilace.
TIP: Na řádku s příkazem pro podmíněnou kompilaci nesmí být uveden žádný jiný příkaz. Není zde tedy možné použít oddělení příkazů dvojtečkami.
TIP: Pro podmíněnou kompilaci lze předdefinovat argumenty, jimž přiřadíte hodnoty v poli Conditional Compilation Arguments (Argumenty podmíněné kompilace) karty Advanced dialogového okna Options (příkaz Tools/Options). Je možná i explicitní deklarace konstant určených pro podmíněnou kompilaci pomocí klíčového slova #Const. Konstanty definované tímto způsobem nejsou dostupné v programovém kódu při běhu programu.
125
UČEBNICE VISUAL BASICU 6.0
Otázky a úkoly: 1) Jaké možnosti ladění má Visual Basic? Srovnejte je s možnostmi vývojových prostře− dí jiných programovacích jazyků. 2) Jaké jsou možnosti zjistit aktuální hodnotu proměnných při pozastaveném běhu programu? 3) Je možné při pozastaveném běhu programu definovat hodnotu proměnných? Jak? (Použijte Immediate Window).
126
Lekce 14
MDI formuláře Cíle lekce: Pochopit význam MDI formulářů ve srov− nání s klasickými formuláři a naučit se MDI formuláře využívat všude tam, kde je jejich použití výhodnější ve srovnání s kla− sickými formuláři. Přibližme si nyní termín, se kterým jsme se zatím ve výkladu nesetkali – MDIForm. Již název MDI (multiple document interface, tedy vídedokumentové nebo spíš víceformulá− řové rozhraní) napovídá, že pomocí MDI formuláře bude možné spolu propojit více for− mulářů. Skutečně – jedná se o běžný formulář, na který však může být navázáno mnoho jiných formulářů. Vlastnosti těchto „vnořených“ formulářů stejně jako jejich ovládacích prvků jsou dostupné z jejich rodičovského MDI formuláře. Tento způsob ovládání aplikace je vhodný tam, kde je nutné, aby uživatel měl otevřena různá aplikační okna, přičemž charakter jejich obsahu je podobný a tudíž mají stejné ne− bo podobné ovládání.
TIP: Uvědomte si, že například aplikace Microsoft Office umožňují v jedné instanci programu otevřít více dokumentů – ve Wordu více dokumentů DOC, v Excelu více tabulek atd. Tyto aplikace jsou tedy také příkladem použití technologie MDI.
V krátkosti řečeno techologie MDI představuje programovací techniku, pomocí níž mů− že programátor otevírat nebo zavírat formuláře vnořené do jednoho rodičovského okna, specifikovat nebo zjišťovat, který z vnořených formulářů je aktivní a tento aktivní formu− lář následně ovládat nebo z něho přebírat informace. Abychom si názorně přiblížili funkci MDI formulářů, vytvoříme vzorovou aplikaci pro vy− tváření a editování textových dokumentů. Cílem je, aby uživatel v aplikaci mohl praco− vat s více textovými dokumenty najednou. Dostupné funkce budou • Založení nového dokumentu, • používání funkcí schránky – Kopírovat a Vložit. Při vytváření aplikace postupujte podle následujícího návodu: Otevřete Visual Basic a vytvořte nový standardní projekt Příkazem nabídky Project/Add MDIForm přidejte do projektu nový MDI formulář. V této chvíli tedy projekt obsahuje dva zatím nezávislé formuláře – MDIForm1 a standardní Form1. Ve formuláři Form1 vytvořte textbox s názvem Text1 tak, aby zabíral celou plochu for− muláře. Formulář Form1 bude sloužit jako šablona nově vytvářených dokumentů.
127
UČEBNICE VISUAL BASICU 6.0 Vložte do projektu standardní modul (Module1) a umístěte do něho následující kód Sub FileNew Dim NewDoc As New Form1 ‘ Vytvoř novou instanci Form1 NewDoc.Show End Sub
Nastavte následující vlastnosti objektů:
TIP: Nastavením vlastnosti MDIChild formuláře Form1 na hodnotu True určujeme, že tento formulář bude vnořen do rodičovského okna MDIForm1. Vzhledem k tomu, že nikde nedefinujeme, na které rodičovské okno má být Form1 navázán, je zřejmé, že každý projekt ve Visaul Basicu může obsahovat nejvýše jeden MDI formulář.
Ve formuláři MDIForm1 vytvořte menu tak, aby mělo jednu rozbalovací položku Soubor nazvanou mnuFile a vnořené příkazy Nový (s názvem mnuFileNew) a Konec (s názvem mnuFileExit). Menu vytvořte i ve formuláři Form1 – bude mít rozbalovací položku Soubor nazvanou mnuFile a vnořené příkazy Nový (s názvem mnuFileNew), Zavřít (mnuFileClose) a Ko− nec (s názvem mnuFileExit). Příkazy se až na „Zavřít“ shodují s příkazy menu rodičov− ského formuláře. Dále vytvořte ve formuláři Form1 rozbalovací položku Úpravy (mnuEdit) s vnořenými příkazy Kopírovat (mnuCopy) a Vložit (mnuPaste). Nyní přidáme do formulářů programový kód. První bude kód k formuláři Form1. Tento kód zabezpečí, že i po změně velikosti formuláře zůstane textové pole roztažené po ce− lé ploše formuláře: Private Sub Form_Resize () ‘ Roztažení textového pole Text1.Height = ScaleHeight Text1.Width = ScaleWidth End Sub
TIP: V textu je záměrně použit odkaz Text1.Height namísto Form1.Text1.Height. V uvedeném případě se bude odkaz vztahovat vždy k aktivnímu oknu, ačkoli otevřených dokumentů může být v aplikaci více.
Další procedury ve formuláři Form1 budou definovány takto: Sub mnuFileClose_Click() ‘ Zavřít tento formulář.
128
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Unload Me End Sub Private Sub mnuFileExit_Click() ‘ Zavřít rodičovský formulář Unload MDIForm1 End Sub Private Sub mnuFileNew_Click() ‘ Vytvoření nového dokumentu FileNew End Sub Private Sub mnuCopy_Click() Clipboard.SetText MDIForm1.ActiveForm.ActiveControl.SelText End Sub Private Sub mnuPaste_Click() MDIForm1.ActiveForm.ActiveControl.SelText = Clipboard.GetText() End Sub
Výše uvedené dvě procedury používají schránku k přenášení textu mezi dokumenty.
TIP: Zavření MDI formuláře vyvolá událost QueryUnload pro každý vnořený formulář a posléze i pro MDI formulář. Nastavení argumentu Cancel na hodnotu True v kterékoli událostní proceduře QueryUnload zruší zavírání aplikace.
Do formuláře MDIForm1 vepište pouze tento kód: Private Sub mnuFileExit_Click() ‘ Zavřít rodičovský formulář Unload MDIForm1 End Sub Private Sub mnuFileNew_Click() ‘ Vytvoření nového dokumentu FileNew End Sub
Tím je celá aplikace hotová a můžete ji vyzkoušet.
129
UČEBNICE VISUAL BASICU 6.0
Otázky a úkoly: 1. Jaký je základní rozdíl mezi běžným formulářem a formulářem MDI? 2. V příkladu uvedeném v této kapitole si všimněte používání menu. Proč je nutné položky Zavřít a Konec definovat v obou formulářích (rodičovském i vnořeném)? 3. Rozšiřte uvedený příklad tak, aby kromě funkcí schránky Kopírovat a Vložit obsa− hoval i funkci Vyjmout. 4. Rozšiřte uvedený příklad o možnost formátování textu (velikost a formát písma, za− rovnání atd.) Pro definici formátování vytvořte panel nástrojů. 5. Rozšiřte uvedený příklad o možnost otvírání a ukládání textových souborů. Pokud si nebudete s některými úkoly vědět rady, podívejte se do vzorového příkladu Mdinote.vbp, který je součástí instalace Visual Basicu a je umístěn ve složce /sam− ples/PGuide/MDI.
Otázky a úkoly: 1) Jaký je rozdíl mezi MDI formulářem a obyčejným formulářem? 2) Kdy je vhodné využít MDI formulář? 3) Rozšiřte program uvedený v této lekci tak, aby text jednotlivých oken mohl být ukládán do textových souborů a zase z těchto souborů editován.
130
Lekce 15
Vytváření DLL knihoven Cíle lekce: Pochopit význam DLL knihoven a naučit se pracovat s projektem Visual Basicu tak, aby bylo možné vytvářené DLL knihovny testo− vat přímo ve vývojovém prostředí Visual Basicu. Zatím jsme se setkávali pouze s projekty typu Standard EXE – tedy se spustitelnými pro− jekty. Po kompilaci se z těchto projektů stanou klasické spustitelné EXE soubory. Ve Vi− sual Basicu však můžete tvořit i aplikace, které jsou svým charakterem jiné – ActiveX ne− bo DLL projekty. DLL knihovna funkcí je soubor s příponou DLL, který umí provádět operace, které se běžně provádějí v mnoha různých aplikacích. Pokud budete vytvářet aplikaci, která uni− verzálně řeší některý např. početní problém, vyplatí se ji naprogramovat jako DLL knihovnu. DLL knihovně lze definovat vlastnosti a metody, jako má kterýkoli jiný objekt. Nad DLL knihovnou potom lze naprogramovat řadu aplikací, které si vytvoří vlastní in− stanci DLL knihovny, naplní vstupní vlastnosti knihovny a zavolá metody knihovny re− prezentující její funkce. Tyto funkce naplní hodnotami soubor výstupních vlastností, které si nadřazená aplikace vezme k dalšímu zpracování nebo vizualizaci. Mějme aplikaci, která se bude spouštět ve vícejazyčném módu – to znamená, že všech− ny popisky k aplikaci budou uloženy v databázi a podle toho, v jakém jazykovém mó− du je aplikace spuštěna, se musejí zobrazit i popisky. Např. Pokud si aplikaci spustí Čech, bude např. titulek na tlačítku ukončujícím běh aplikace „Konec“, v německé mutaci bu− de nápis „Beenden“ a v anglické „Quit“. Nejprve tedy vytvoříme databázi Microsoft Access, která bude mít jedinou tabulku s ná− zvem „JazykTable“ a čtyřmi sloupci – „ID“ (identifikační číslo záznamu a primární klíč), „CZ“, „DE“ a „EN“ – pole typu TEXT, v nichž budou uloženy popisky. Za účelem výběru textu vytvoříme DLL knihovnu, jejímž vstupem bude jazyk (hodnoty CZ, DE nebo EN) a primární klíč položky v databázi. Výstupem bude textový řetězec v příslušném jazyce. Jakým způsobem tedy vytvořit DLL knihovnu a zkoušet její funkce? Založte nejprve nový projekt Visual Basicu, ovšem tentokrát nikoli Standard Exe, ale Acti− veX DLL. Do projektu bude automaticky vložen modul třídy (Class module), který pře− jmenujte na „Language“, samotný projekt přejmenujte na „LanguageServer“. Dále založte v projektu nový BAS modul a pojmenujte jej „StartUp“. Nyní by okno projektu mělo vy− padat podle obr. 62.
131
UČEBNICE VISUAL BASICU 6.0
obr. 62 Okno Projektu se dvěma založenými moduly. Nyní můžeme přistoupit k definici vlastností a metod knihovny DLL.
TIP: Zapamatujte si: všechny proměnné, resp. funkce a procedury, které jsou v deklaraci uvozeny klíčovým slovem Public, jsou přístupné z vnějšku DLL knihovny a jeví se tedy jako vlastnosti, resp. metody knihovny jako celku.
Nejprve budeme potřebovat nadefinovat vstupní vlastnosti knihovny – jazyk a ID zázna− mu. V deklarační sekci modulu třídy nadefinujte: Private m_Jazyk As String Private m_ID As Long Private m_Text As String Public Connection As rdoConnection
dále zadejte příkaz nabídky Tools/Add Procedure. Otevře se dialog, který je zachycen na obr. 63. V References projektu LanguageServer musí být zatrženo Microsoft Remote Da− ta Object.
obr. 63 Dialog pro zakládání metod a vlastností knihovny. Vyplňte dialog podle obr. 63 a klepněte na tlačítko OK. V projektu se objeví následující kód: Public Property Get Jazyk() As Variant End Property
132
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU Public Property Let Jazyk(ByVal vNewValue As Variant) End Property
Tímto způsobem je nadefinovaná vlastnost Jazyk. Procedura Get se spustí ve chvíli, kdy aplikace nadřazená naší DLL knihovně bude číst hodnotu vlastnosti. Procedura Let bude spuštěna při definování vlastnosti nadřazenou aplikací. Vzhledem k tomu, že chceme, aby vlastnost byla pouze vstupní a nikoli výstupní, celou proceduru Get sma− žeme a do procedury Let přidáme následující kód: Public Property Let Jazyk(ByVal vNewValue As Variant) m_Jazyk = vNewValue End Property
Stejným způsobem založíme i vlastnost ID, která bude také pouze vstupní: Public Property Let ID(ByVal vNewValue As Variant) m_ID = vNewValue End Property
Poslední vlastností bude Text, která bude jen pro čtení (výstupní vlastnost): Public Property Get Text() As Variant Text = m_Text End Property
Nyní přistoupíme k naprogramování metody GetText, která bude přiřazovat do proměn− né m_Text textový řetězec z databáze podle zadaného jazyka. Příkazem Tools/Add Pro− cedure založíme veřejnou proceduru (Sub) s názvem GetText: Public Sub GetText() Dim rst As rdoResultset Dim strSQL As String strSQL = “SELECT “ & m_Jazyk & “AS txt FROM JazykTable WHERE ID=“ _ & m_ID Set rst = Connection.OpenResultset(strSQL, rdOpenDynamic, rdConcurRowVer) If Not rst.EOF Then m_Text = rst!txt End Sub
TIP: Metoda GetText předpokládá, že vstupní parametry jsou zadány správně a neošetřuje běhové chyby, které se mohou vyskytnout na základě špatného zadání vstupních vlastností.
133
UČEBNICE VISUAL BASICU 6.0 Nyní již zbývá pouze přidat do projektu proceduru Main. Tu přidáme do BAS modulu, který jsme nazvali StartUp: Sub main() ‘Inicializace proměnných End Sub
Tato procedura se má spustit při založení instance DLL knihovny volající aplikací. Zde nemá příliš význam, ale ve složitějších příkladech ji lze použít pro přiřazení implicitních hodnot globálním proměnným. K tomu, aby se procedura při založení skutečně spusti− la, je zapotřebí ji nadefinovat jako StartUp objekt v dialogu podle obr. 64.
obr. 64 Okno vlastností projektu. Nyní je projekt DLL knihovny hotový a zbývá vytvořit volající aplikaci, která bude s DLL knihovnou pracovat. Zadejte příkaz nabídky File/Add Project a založte nový projekt Stan− dard EXE. V Okně projektu na něj klepněte pravým tlačítkem myši a z pohotovostního menu zvolte „Set as Start Up“ – tím zařídíte, aby se Standard EXE projekt spouštěl vždy jako první. Okno projektu nyní bude vypadat tak jako na obr. 65.
Obr. 65 Okno projektu
134
ČÁST 2 – PROGRAMOVÁNÍ VE VISUAL BASICU V Referencích projektu Standard EXE je zapotřebí zatrhnout Microsoft Remote Data Object a LanguageServer, který se v okně referencí automaticky objeví (viz obr. 66).
obr. 66 Reference Projektu Standard EXE Zbývá přidat do projektu následující testovací kód: Dim m_con As rdoResultset Dim txt As String Private Sub Form_Load() Dim LangSvr As Object Set LangSvr = CreateObject(“LanguageServer.Language“) LangSvr.Jazyk = “CZ“ LangSvr.ID = 10 Set LangSvr.Connection = m_con LangSvr.GetText txt = LangSvr.Text Set LangSvr = Nothing End Sub
TIP: Pozor: před spuštěním tohoto kódu je nutné nejprve do proměnné m_con přiřadit platné spojení s databází tak, jak jsme se to naučili v lekci věnované přístupu k datům. Jinak program nebude fungovat.
135
UČEBNICE VISUAL BASICU 6.0
Otázky a úkoly: 1) Doplňte metodu GetText o kód, který ošetřuje chybné zadání vstupních parametrů Connection, m_ID a m_Jazyk. 2) Zkompilujte DLL knihovnu LanguageServer a použijte ji v projektu Standard EXE v již zkompilovaném tvaru. 3) Pokuste se vytvořit ActiveX EXE projekt. Jak se liší od ActiveX DLL? 4) V projektech ActiveX DLL je možné definovat také události (Events – viz obr. 63). Jaký mají význam a k čemu je možné je využít?
136
Přehled klíčových slov Visual Basic for Application Direktivy překladače Direktivy překladače jsou specifické příkazy, které využívá kompilátor jazyka Visual Ba− sic pro podmíněnou kompilaci zdrojového textu. #Const
Používá se pro definici konstant pro podmíněný překlad v programu Visual Basic.
#If...Then, #ElseIf, #Else, #End If Označení části programu v jazyce Visual Basic pro podmíněný překlad. Syntaxe: #If expression Then statements [#ElseIf expression−n Then [elseifstatements]] [#Else [elsestatements]] #End If
Funkce Abs
Vrací absolutní hodnotu čísla. Syntaxe: Abs(číslo)
Array
Vrací proměnnou typu Variant obsahující pole Syntaxe: Array(seznamagrumentů). Seznam argumentů definuje členy nově vzniklého pole.
Asc
Vrací kód prvního znaku v řetězci, kteý je argumentem funkce.
Atn
Vrací funkční hodnotu funkce arkustangens v bodě určeném argu− mentem. Vrácená hodnota úhlu je v radiánech. Syntaxe: Atn(číslo)
CBool
Konvertuje argument na typ Boolean. Argumentem je libovolný plat− ný numerický nebo řetězcový výraz. Je−li výraz roven nule, Cbool vrací False; jinak vrací True.
CByte
Konvertuje argument na typ Byte. Tato funkce správně rozpoznává oddělovače desetinné části, případně tisíců, podle nastavení v systému.
CCur
Konvertuje argument na typ Currency. Tato funkce správně rozpo− znává různé formáty měn, oddělovače desetinné části, případně tisíců, podle nastavení v systému.
Syntaxe: Asc(řetězec)
137
UČEBNICE VISUAL BASICU 6.0 CDate
Konvertuje argument na typ Date. Funkce CDate rozlišuje formáty da− ta podle místního nastavení.
CDbl
Konvertuje argument na typ Double. Tato funkce správně rozpoznává oddělovače desetinné části, případně tisíců, podle nastavení v systému.
Choose
Vybere a vrátí hodnotu ze seznamu argumentů, jejíž pořadí v sezna− mu určuje index. Syntaxe: Choose(index, volba−1[, volba−2, ... [, vol− ba−n]]) Funkce se používá v případech, kdy index představuje hodno− tu společnou pro určitou skupinu.
Chr
Vrací znak se specifickým kódem. Syntax: Chr(kód znaku). Například Chr(10) vrací znak pro přesun na další řádek (linefeed).
CInt
Konvertuje argument na typ Integer. Funkce CInt rozlišuje formáty data podle místního nastavení. Tato funkce správně rozpoznává oddě− lovače desetinné části, případně tisíců, podle nastavení v systému.
CLng
Konvertuje argument na typ Long. Funkce CLng rozlišuje formáty da− ta podle místního nastavení. Tato funkce správně rozpoznává oddělo− vače desetinné části, případně tisíců, podle nastavení v systému.
Cos
Vrací funkční hodnotu funkce kosinus pro úhel určený zadaným argu− mentem v radiánech.
CreateDatabase Vytvoří novou databázi. Tento identifikátor je však výhodnější použí− vat jako metodu objektu Workspace.
138
CreateObject
Vytvoří objektové propojení OLE s objektem mechanismu. Argumen− tem funkce je třída objektu. Proměnná třída používá syntaxi: „jmé− no_apl.typ_objektu“.
CSng
Konvertuje argument na typ Single. Funkce CSng rozlišuje formáty da− ta podle místního nastavení. Tato funkce správně rozpoznává oddělo− vače desetinné části, případně tisíců, podle nastavení v systému.
CStr
Konvertuje argument na typ String. Tato funkce správně rozpoznává oddělovače desetinné části podle nastavení v systému.
CurDir
Vrátí aktuální cestu. Syntaxe: CurDir[(disk)]
CVar
Konvertuje výraz na typ Variant.
CVErr
Vrací subtyp Error typu Variant s číslem chyby – argumentem funkce. Argument číslo chyby je libovolné platné číslo chyby. Pomocí funkce CVErr můžete ve svých procedurách definovat vlastní typy chyb.
Date
Vrací aktuální systémové datum. Systémové datum se nastavuje pomo− cí příkazu Date.
DateAdd
Vrací datum, ke kterému byl přidán zadaný časový interval. Vracená hodnota je typu Variant. Syntaxe: DateAdd(interval, number, date). Následující ukázka přidá jeden měsíc k datu 31. leden: DateAdd(“m“, 1, “31−Led−95“).
DateDiff
Vrátí počet časových intervalů mezi dvěma zadanými daty.
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Syntaxe: DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]]) DatePart
Vrací zadanou část data. Syntaxe: DatePart(interval, date[, firstdayofweek[, firstweekofyear]])
DateSerial
Vrací datum zadaného roku, měsíce a dne ve formátu Date. Syntaxe: DateSerial(year, month, day)
DateValue
Vrací zadané datum ve formátu Date. Syntaxe: DateValue(datum). Funkce DateValue je schopna poznat jednoznačné datum, které ob− sahuje jména měsíců a to buď v dlouhém nebo zkráceném tvaru. Například kromě formátů 12/30/1991 a 12/30/91 rozeznává funkce DateValue také tvar December 30, 1991 a Dec 30, 1991.
Day
Vrací celé číslo od 1 do 31 včetně, které je pořadovým číslem dne v měsíci. Syntaxe: Day(datum)
Dir
Vrací jméno souboru, adresáře nebo složky, které odpovídá zadanému vzoru nebo atributu souboru nebo jménu disku.
DoEvents
Dočasně přerušuje zpracování. Operační systém potom může zpraco− vat jiné události. Syntaxe: DoEvents( )
Syntaxe: Dir[(cesta a jméno[, atributy])]
Funkce DoEvents vrací jako hodnotu počet otevřených formulářů v samostatně běžícím programu Visual Basic jako je Visual Basic, Stan− dardní verze. Funkce DoEvents předává řízení operačnímu systému. Řízení je programu, který funkci DoEvents zavolal, vráceno zpět až v okamžiku, kdy operační systém dokončil zpracování událostí čekají− cích ve frontě. U programu Microsoft Windows musejí být navíc odeslány všechny klávesové povely z fronty SendKeys. Environ
Vrací řetězec sdružený s proměnnou prostředí operačního systému. Syntaxe: Environ({envstring | number}). Syntaxe funkce Environ obsahuje tyto pojmenované argumenty:
EOF
envstring
Řetězcový výraz s názvem proměnné prostředí.
number
Číselný výraz odpovídající pořadí řetězce v tabulce řetěz− ců prostředí. Argument number může být libovolné číslo, to je však před vyhodnocením zaokrouhleno na celočí− selnou hodnotu.
Vrací hodnotu False nebo True informující o tom, zda již bylo dosa− ženo konce specifikovaného souboru. Syntaxe: EOF(číslo souboru) Argument číslo souboru je jakékoli platné číslo souboru, pomocí kte− rého může příkaz Open soubor otevřít. Hodnoty 1 – 255 se používají pro soubory nepřístupné jiným aplikacím, hodnoty 256 – 511 pro sou− bory přístupné i z jiných aplikací.
139
UČEBNICE VISUAL BASICU 6.0 Error
Vrací chybovou zprávu, která odpovídá danému číslu chyby. Syntaxe: Error[(číslo chyby)] Je−li argument číslo chyby vynechán, je vrácena zpráva odpovídající poslední předešlé chybě při běhu programu. Hodnota vracená funkcí Error odpovídá vlastnosti Description objektu Err.
Exp
Vrací funkční hodnotu přirozené exponenciální funkce, jejímž moc− něncem je e (základ přirozeného logaritmu) a mocnitelem zadaný ar− gument. Syntaxe: Exp(exponent) Konstanta e je přibližně rovna číslu 2,718282.
FileAttr
Vrací typ přístupu k souboru a informace o popisovači souboru pro soubory otevřené příkazem Open. Syntaxe: FileAttr(číslo souboru, returntype) Popis: číslo souboru
Jakékoli platné číslo souboru.
returntype
Číslo označující typ informace, která má být vrácena. Chcete−li získat hodnotu určující přístup k souboru, zadejte 1. Pro získání popisovače souboru zadejte čí− slo 2.
Pokud je proměnné returntype přiřazeno číslo 1, určují následující vracené hodnoty u zadaného souboru přístupový režim: 1 Jen čtení 2 Jen zápis 4 Náhodný přístup 8 Přidávání 32 Binární FileDateTime
Vrací data určující datum a čas, kdy byl soubor vytvořen nebo napo− sledy pozměněn. Syntaxe: FileDateTime(cesta a jméno) Datum a čas se ukládají interně jako různé součásti reálného čísla. Hodnota na levé straně desetinné čárky představuje datum, hodnota na pravé straně desetinné čárky představuje čas.
FileLen
Vrací délku souboru v bajtech. Syntaxe: FileLen(cesta a jméno) Pro zjištění délky otevřeného souboru lze použít funkci LOF.
Fix
Vrací celou část čísla. Syntaxe: Fix(číslo) Je−li číslo záporné, vrací funkce Fix nejbližší vyšší nebo rovné celé záporné číslo. Například funkce Fix převede číslo −8.4 na −8.
Format
Formátuje výraz podle instrukcí pro formátování výrazu. Syntaxe:Format(výraz[, formát[, první_den_týdne[, první_týden_ro− ku]]]) výraz Jakýkoli platný výraz.
140
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION formát
Platné jméno uživatelsky definovaného formátu výrazu.
první_den_týdne
Konstanta určující první den v týdnu.
první_týden_roku Konstanta určující první týden v roce. FreeFile
Vrací další číslo souboru, které může být použito u příkazu Open. Syntaxe: FreeFile[(číslo rozsahu)]
FV
Vrací příští hodnotu anuity (investice) na základě periodických, kon− stantních splátek a konstantní úrokové míry. Anuita představuje uklá− dání pravidelných splátek ve stálé výši, prováděné po určitou dobu. Syntaxe: FV(rate, nper, pmt[, pv[, type]]) rate
Úroková sazba za jedno období.
nper
Celkový počet splátek (násobek cyklů).
pmt
Výše pravidelné splátky. Výše splátek a úroková sazba se většinou po dobu spoření nemění.
pv
Okamžitá výše vkladu.
type
Argument určující, zda jsou splátky splatné vždy na za− čátku nebo na konci cyklu. Jsou−li splatné na konci cy− klu, platí 0, jinak 1. Je−li vynechán, předpokládá se 0.
GetAllSettings Vrací seznam klíčů a jejich hodnot ze záznamu aplikace v registru programu Windows. Syntaxe: GetAllSettings(appname, section)
GetAttr
appname
výraz typu String, který obsahuje název aplikace nebo projektu, jehož hodnoty klíčů jsou požadovány.
section
výraz typu String, který obsahuje název oddílu, jehož klíče jsou požadovány. Funkce GetAllSettings vrací typ Variant, který obsahuje dvourozměrné pole řetězců. Ty− to řetězce obsahují všechny klíče z určeného oddílu a jim odpovídající hodnoty.
Vrací číslo charakterizující atributy souboru, adresáře nebo složky. Syntaxe: GetAttr(cesta a jméno) Hodnota vrácená funkcí GetAttr je součtem následujících hodnot atributů: Hodnota
Konstanta Popis
0 vbNormal Normální. 1 vbReadOnly Pouze pro čtení. 2 vbHidden Skrytý. 4 vbSystem Systémový soubor. 16 vbDirectory Adresář nebo složka. 32 vbArchive Soubor byl od posledního zálohování pozměněn. Ke zjištění, které atributy jsou nastaveny, lze použít operátor And k bitovému porovnání hodnot vrácených funkcí GetAttr a hodnoty žádaného atributu. Např.: Result = GetAttr(FName) And vbHidden
141
UČEBNICE VISUAL BASICU 6.0 Nenulová hodnota bude vrácena v případě, že je atribut vbHidden na− staven. GetObject
Vytvoří propojení OLE s objektem mechanismu ze souboru. Syntax: GetObject([cesta][, třída]) Popis: cesta
Kompletní cesta a jméno souboru, z něhož má být vytvo− řen objekt. Jestliže cesta není zadána, je nutné zadat tří− du.
třída
Řetězec určující třídu objektu. Proměnná třída používá syntaxi „jméno_apl.typ objektu“ a má tyto části.
jméno_apl
Jméno aplikace pracující s objektem.
typ objektu Typ nebo třída objektu, který má být vytvořen. GetSetting
Vrací hodnotu vybraného klíče ze záznamu aplikace v registru progra− mu Windows. Syntaxe: GetSetting(appname, section, key[, default]) Popis:
Hex
appname
výraz typu String, který obsahuje název aplikace nebo projektu, jehož hodnoty klíčů jsou požadovány.
section
výraz typu String, který obsahuje název oddílu, kde se klíč nalézá.
key
výraz typu String, který obsahuje název klíče, jehož hodnota má být vrácena.
default
výraz, který obsahuje hodnotu, která má být vrácena v případě, že klíč nemá nastavenu žádnou hodnotu.
Vrací řetězec, který zobrazuje hexadecimální hodnotu čísla. Syntaxe: Hex(číslo) Můžete používat přímo hexadecimální čísla tak, že před ně vložíte rozlišovací sekvenci: &H. Například &H10 je číslo 16 v hexadecimál− ním zápisu.
Hour
Vrací celé číslo od 0 do 23 včetně, které vyjadřuje denní hodinu. Syntaxe: Hour(čas) Argument je libovolný číselný nebo řetězcový výraz nebo libovolná kombinace čísel a znaků, která může vyjadřovat čas.
IIf
Vrací jednu ze dvou hodnot v závislosti na výsledku vyhodnocení vý− razu. Syntaxe: IIf(expr, truepart, falsepart) Syntaxe funkce IIf obsahuje tyto pojmenované argumenty:
142
expr
Vyhodnocovaný výraz.
truepart
Hodnota vrácená funkcí při expr rovno True.
falsepart
Hodnota vrácená funkcí při expr rovno False.
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Input
Vrací znaky z otevřeného sekvenčního nebo binárního souboru. Syntaxe: Input(číslo, [#]číslo souboru) číslo
Jakýkoli platný číselný výraz určující počet znaků, které mají být načteny.
číslo souboru Jakékoli platné číslo souboru. Tuto funkci používejte pouze se soubory otevřenými ve Vstupním ne− bo Binárním režimu. InStr
Vrací pozici opakování jednoho řetězce v jiném. Syntaxe: InStr([začátek, ]řetězec1, řetězec2[, porovnávání])
Int
začátek
Číselný výraz, který určí, od kterého místa se začne hle− dat. Je−li vynechán, hledá se od prvního místa.
řetězec1
Řetězcový výraz který bude prohledáván.
řetězec2
Hledaný řetězcový výraz.
porovnávání
Určí typ řetězcového porovnávání.
Vrací celou část čísla. Syntaxe: Int(číslo) Je−li číslo záporné, vrací funkce Int nejbližší nižší nebo rovné celé zá− porné číslo. Například Int převede číslo −8.4 na −9.
IsArray
Vrací hodnotu typu Boolean v závislosti na tom, je−li proměnná typu pole. Syntaxe: IsArray(název proměnné)
IsDate
Vrací hodnotu typu Boolean v závislosti na tom, je−li výraz převodi− telný na datum. Syntaxe: IsDate(výraz)
IsEmpty
Vrací hodnotu typu Boolean v závislosti na tom, byla−li proměnná ini− cializována. Syntaxe: IsEmpty(výraz)
IsError
Vrací hodnotu typu Boolean v závislosti na tom, je−li výraz chybovou hodnotou. Syntaxe: IsError(výraz)
IsMissing
Vrací hodnotu typu Boolean v závislosti na tom, byl−li volitelný argu− ment předán proceduře. Syntaxe: IsMissing(jméno argumentu)
IsNull
Vrací hodnotu typu Boolean v závislosti na tom, neobsahuje−li výraz žádné platné údaje (hodnota Null). Syntaxe: IsNull(výraz)
IsNumeric
Vrací hodnotu typu Boolean v závislosti na tom, může−li být výraz vy− hodnocen jako číslo. Syntaxe: IsNumeric(výraz)
IsObject
Vrací hodnotu typu Boolean v závislosti na tom, odkazuje−li výraz na platný objekt automatizace OLE. Syntaxe: IsObject(výraz)
LBound
Vrací nejmenší index, který je pro udaný rozměr pole k dispozici.
Argumentem výraz musí být typ Variant nebo VarType vbError.
Syntaxe: LBound(arrayname[, dimension]) Příklad: Dim Pole(1 To 100, 0 To 3, -3 To 4)
143
UČEBNICE VISUAL BASICU 6.0 Příkaz Vrácená hodnota LBound(Pole, 1)
1
LBound(Pole, 2)
0
LBound(Pole, 3) -3
LCase
Vrací řetězec zkonvertovaný na malá písmena. Syntaxe: LCase(řetězec)
Left
Vrací zadaný počet znaků z levé strany řetězce. Syntaxe: Left(řetězec, délka)
Len
Vrací délku řetězce nebo počet bajtů potřebný k uschování proměnné. Syntaxe: Len(řetězec | jméno_prom.) Funkce Len nemůže určit počet bajtů potřebných k uschování pro− měnné u uživatelsky definovaných typů dat.
LoadPicture
Natáhne rastrový obrázek do jednoho z těchto objektů: Form, Pictu− reBox, Image. Př.: Picture1.Picture = LoadPicture(“PARTY.BMP“)
LoadResData
Natáhne data ze souboru zdrojů (přípona souboru res). Syntaxe: LoadResData(index, format)
LoadResPicture Natáhne obrázek ze souboru zdrojů (přípona souboru res). Syntaxe: LoadResPicture(index, format) Loc
Vrátí aktivní pozici pro čtení/zápis v otevřeného souboru. Syntaxe: Loc(číslo souboru) Vrácená hodnota závisí i na režimu, ve kterém je soubor otevřen: Náhodný režim – funkce vrátí číslo posledního záznamu, který byl čten nebo zapsán do souboru. Sekvenční – funkce vrátí aktuální pozici bajtu v souboru děleno 128. Binární – funkce vrátí polohu bajtu, ve kterém bylo naposledy prová− děno čtení nebo zápis.
LOF
Vrátí velikost souboru v bajtech, otevřeného příkazem Open.
Log
Vrací přirozený logaritmus argumentu. Syntaxe: Log(číslo)
Syntaxe: LOF(číslo souboru) Konstanta e (hodnota základu přirozeného logaritmu) je přibližně rov− na číslu 2,718282. LTrim, RTrim. Trim Vrací kopii řetězce s vypuštěním mezer na začátku (LTrim), na konci (RTrim), nebo na začátku i na konci (Trim). Syntaxe: LTrim(řetězec) Trim(řetězec) Trim(řetězec)
144
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Mid
Vrací určitý počet znaků z řetězce. Syntaxe: Mid(řetězec, začátek[, délka]) Není−li zadán parametr délka, vrací funkce znaky od pozice začátek do konce řetězce.
Minute
Vrací celé číslo od 0 do 59 včetně, které vyjadřuje určitou minutu v hodině. Syntaxe: Minute(čas) Argument čas je číselný nebo řetězcový výraz, který se dá interpreto− vat jako časový údaj.
Month
Vrací celé číslo od 1 do 12 včetně, které vyjadřuje pořadové číslo mě− síce v roce. Syntaxe: Month(datum) Argument datum je číselný nebo řetězcový výraz, který se dá inter− pretovat jako datum.
MsgBox
U této funkce se zastavme o něco déle, protože její použití je velmi časté. Funkce MsgBox() zobrazí dialogové okno se zprávou a čeká dokud uživatel nestiskne tlačítko. Vrací hodnotu, která určuje, které tlačítko uživatel stiskl. Kromě textu zprávy uživatel definuje také jaká tlačítka se mají zobrazit, které z nich bude předvoleno a která ikona bude zprávu graficky doplňovat. Syntaxe funkce je následující: MsgBox(prompt[, buttons][,title][, helpfile, context]) Popis argumentů: prompt
Řetězcový výraz zobrazený jako dialogová zpráva. Maxi− mální délka promptu je v závislá na šířce znaků písma, které je použito (cca 1024 znaků). Má−li prompt více než jednu řádku, je možné jej rozdělit pomocí znaků konce odstavce (Chr(13)), přesunu na další řádek (Chr(10)) nebo jejich kombinací (Chr(13) + Chr(10)) mezi všemi řádky.
buttons
Číselný výraz sestávající ze součtů identifikačních čísel tlačítek, které mají být zobrazeny, ikon a předvoleného tlačítka (viz dále). Implicitní hodnota (pokud vynecháte tuto volbu) je 0.
title
Řetězcový výraz zobrazený v titulkovém pruhu dialogu. Pokud title vynecháte, je do titulkového pruhu vloženo jméno aplikace.
helpfile
Řetězcový výraz určující název souboru, který obsahuje text nápovědy k dialogu. Je−li argument helpfile určen, musí být také určen argument context.
context
Číselný výraz, který je přiřazen k tématu nápovědy.
Hodnota argumentu buttons vzniká jako součet hodnot vybraných po jedné z následujících částí (zkušenější z Vás správně poznávají vztah
145
UČEBNICE VISUAL BASICU 6.0 těchto dekadických čísel k binární soustavě). V prvním sloupci je ur− čen název konstanty, který lze použít místo číselné hodnoty, dále hodnota a popis: 1. část určuje tlačítka zobrazená v dialogu: vbOKOnly
0 Zobrazí pouze tlačítko ”OK”.
vbOKCancel
1 Zobrazí tlačítka “OK” a “Storno”.
vbAbortRetryIgnore 2 Zobrazí tlačítka ”Zpět”, ”Znovu” a ”Ignorovat”. vbYesNoCancel 3 Zobrazí tlačítka ”Ano”, ”Ne” a ”Storno”. vbYesNo
4 Zobrazí tlačítka ”Ano” a ”Ne”.
vbRetryCancel 5 Zobrazí tlačítka ”Znovu” a ”Storno”. 2. část určuje styl ikony: vbCritical
16 Zobrazí ikonu kritické zprávy.
vbQuestion
32 Zobrazí ikonu varovného dotazu.
vbExclamation 48 Zobrazí ikonu varovné zprávy. vbInformation 64 Zobrazí ikonu informační zprávy. 3. část určuje, které tlačítko je výchozí: vbDefaultButton1 0 Výchozí tlačítko je první. vbDefaultButton2 256 Výchozí tlačítko je druhé. vbDefaultButton3 512 Výchozí tlačítko je třetí. 4. část určuje režim dialogu: vbApplicationModal 0 Aplikační režim – uživatel musí před po− kračováním další práce ve zvolené aplikaci odpovědět na zprávu. Hodnota 0 je implicitně předvolena. Pokud vynecháte zadání argu− mentu buttons, budou informační okna pracovat v tomto režimu. vbSystemModal 4096 Systémový režim – všechny aplikace jsou pozastaveny, dokud uživatel neodpoví na zobrazenou zprávu. A jaké hodnoty funkce MsgBox vrací? Vprvním sloupci je název vrácené konstanty, ve druhém její číselná hodnota a v posledním název tlačítka, které bylo stisknuto.
146
vbOK
1 OK
vbCancel
2 Storno
vbAbort
3 Zpět
vbRetry
4 Znovu
vbIgnore
5 Ignorovat
vbYes
6 Ano
vbNo
7 Ne
Now
Funkce se volá bez argumentů a vrací aktuální systémové datum a čas.
Oct
Vrací řetězec představující číslo v osmičkové soustavě.
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Syntaxe: Oct(číslo) Čísla osmičkové soustavy lze používat přímo pomocí návěští &O. &O10 v osmičkové soustavě je 8 v desítkové soustavě. Partition
Funkci Partition můžete použít v mřížce návrhu dotazu, popřípadě v zobrazení SQL okna Dotaz. Funkce vrátí řetězec označující vypočte− nou oblast řady, do které spadá zadané číslo. Syntaxe: Partition(number, start, stop, interval) number
Celé číslo, které je po vyhodnocení zařazeno do jedné z oblastí.
start
Celočíselný počátek všech oblastí řady. Hodnota tohoto argumentu nemůže být záporná.
stop
Celočíselný konec všech oblastí řady. Hodnota musí být vyšší, než hodnota argumentu start.
interval
Celočíselná hodnota, délka oblastí. Tento argument ne− může být menší než 1.
PV
Vrací aktuální stav vkladového účtu při probíhajícím spoření založe− ném na pravidelných, stálých splátkách a konstantní úrokové sazbě.
QBColor
Vrátí barevný kód RGB palety, odpovídající zadanému číslu barvy. Syntaxe: QBColor(barva) Platné hodnoty argumentu barva: Číslo Barva
Číslo
Barva
0 černá
8
šedivá
1 modrá
9
světle modrá
2 zelená
10
světle zelená
3 azurová
11
světle azurová
4 červená
12
světle bílá
5 purpurová
13
světle purpurová
6 žlutá
14
světle žlutá
7 bílá
15
zářivě bílá
Rate
Vrací hodnotu úrokové sazby vztaženou k úročenému období anuity.
RGB
Vrací hodnotu reprezentující barvu RGB. Syntaxe: RGB (red, green, blue) red
Číslo v rozsahu 0 až 255, včetně, určující červenou slož− ku barvy.
green
Číslo v rozsahu 0 až 255, včetně, určující zelenou složku barvy.
blue
Číslo v rozsahu 0 až 255, včetně, určující modrou složku barvy.
147
UČEBNICE VISUAL BASICU 6.0 Seznam základních barev a příslušných hodnot pro systém RGB: Barva
Hodnota červené
Hodnota zelené
Černá
0
0
0
Modrá
0
0
255
Zelená
0
255
0
Tyrkysová
Hodnota modré
0
255
255
Červená
255
0
0
Fialová
255
0
255
Žlutá
255
255
0
Bílá
255
255
255
Right
Vrací určitý počet znaků z pravé strany řetězce.
Rnd
Funkce Rnd vrací náhodnou hodnotu menší než 1 a větší nebo rov− nu 0. Syntaxe: Rnd[(číslo)].
Syntaxe: Right(řetězec, délka)
Hodnota argumentu číslo určuje způsob, jakým funkce Rnd generuje náhodné číslo: Pokud je hodnota parametru číslo: •
menší než 0, funkce Rnd generuje pokaždé stejné číslo, para− metr číslo je použit jako výchozí hodnota
•
větší než 0 – další náhodné číslo posloupnosti
•
rovna 0 – naposledy generované náhodné číslo
•
nezadán – další náhodné číslo posloupnosti.
Second
Vrací celé číslo od 0 do 59 včetně, které představuje určitou sekundu v minutě. Syntaxe: Second(čas). Argument čas je číselný nebo řetěz− cový výraz, který se dá interpretovat jako časový údaj.
Seek
Vrací aktuální pozici pro čtení/zápis v souboru otevřeném příkazem Open. Syntaxe: Seek(číslo souboru)
Sgn
Vrací celé číslo (1, 0 či −1), které signalizuje znaménko čísla zadaného jako argument. Syntaxe: Sgn(číslo).
Shell
Slouží ke spuštění programu. Syntaxe: Shell(jméno cesty[,typ okna])
Sin
Vrací funkční hodnotu funkce sinus pro úhel určený zadaným argu− mentem. Syntaxe: Sin(úhel). Hodnota úhlu se zadává v radiánech.
SLN
Vrací výši odpisu majetku pro jedno období při rovnoměrném odpiso− vání.
Space
Vrací řetězec sestávající z daného počtu mezer. Syntaxe: Space(počet)
148
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Spc
Používá se s příkazem Print # nebo metodou Print k nastavení pozi− ce pro výstup. Syntaxe: Spc(n). Proměnná n udává počet mezer, které budou vloženy před zobraze− ním nebo tiskem následujícího výrazu v seznamu.
Sqr
Vrací druhou odmocninu z čísla. Syntaxe: Sqr(číslo)
Str
Konvertuje zadané číslo na řetězec. Syntaxe: Str(číslo)
StrComp
Vrací hodnotu výsledku řetězcového porovnávání. Syntaxe: StrComp(řetězec1, řetězec2[, porovnávání]) Hodnota parametru porovnání určuje typ porovnávání obou řetězců. Např. hodnota 0 (základní) k provedení binárního porovnávání, hod− nota 1 k provedení textového porovnávání. Návratové hodnoty: Pokud je řetězec1 menší než řetězec2 funkce StrComp vrací −1. Pokud je řetězec1 roven řetězec2 funkce StrComp vrací 0. Pokud je řetězec1 větší než řetězec2 funkce StrComp vrací 1.
StrConv
Provádí konverzi řetězce podle zadaného parametru konverze.
String
Vrací řetězec zvolené délky složený ze zvoleného znaku.
Syntaxe: StrConv(řetězec, konverze). Syntaxe: String(počet, znak). Switch
Vyhodnotí seznam výrazů a vrátí hodnotu (nebo výraz) sdruženou s prvním výrazem v seznamu, jehož hodnota je True. Syntaxe: Switch(výraz1, hodnota1[, výraz2, hodnota2 . . . [, výrazn, _ hodnota−]])
SYD
Vrací výši degresivních odpisů majetku za určité období.
Tab
Tabelátor. Používá se s příkazem Print # nebo s metodou Print k ur− čení pozice pro výstup. Syntaxe: Tab[(n)].
Tan
Vrací funkční hodnotu funkce tangens pro úhel určený zadaným argu− mentem (v radiánech). Syntaxe: Tan(úhel).
Time
Funkce aktuální systémový čas.
Timer
Vrací počet sekund, které uplynuly od půlnoci.
TimeSerial
Vrací výraz obsahující čas, který vyjadřuje určitou hodinu, minutu a sekundu zadané jako argumenty funkce. Syntaxe: TimeSerial(hour, minute, second).
TimeValue
Vrací výraz vyjadřující čas. Syntaxe: TimeValue(čas), Př.:
TypeName
a = TimeValue(“2:24:08 PM“)
Vrací řetězec, který poskytuje informace o proměnné. Syntaxe: TypeName(jméno_proměnné).
UBound
Vrací největší dostupný index pro stanovený rozměr určitého pole. Syntaxe: UBound(arrayname[, dimension]).
149
UČEBNICE VISUAL BASICU 6.0 Popis argumentů viz LBound. UCase
Vrací řetězec, který je konvertován na velká písmena. Syntaxe: UCase(řetězec).
Va
Vrací čísla obsažená v řetězci. Syntaxe: Val(řetězec).
VarType
Vrací hodnotu, která určuje podtyp proměnné. Syntaxe: VarType(jméno_proměnné). Návratové hodnoty funkce: Konstanta
Hodnota
Popis typu proměnné
vbEmpty
0
Empty (neinicializováno)
vbNull
1
Null (žádné platné údaje)
vbInteger
2
celé číslo
vbLong
3
dlouhé celé číslo
vbSingle
4
reálné číslo s jednoduchou přesností
vbDouble
5
reálné číslo s dvojnásobnou přesností
vbCurrency
6
měna
vbDate
7
datum
vbString
8
řetězec
vbObject
9
objekt automatizace OLE
vbError
10
chyba
vbBoolean
11
pravdivostní hodnota
vbVariant
12
typ Variant (pouze u polí typu Variant)
vbDataObject
13
objekt nepodporující automatizaci OLE
vbByte
17
bajt
vbArray
8192
pole
Weekday
Vrací celé číslo, které vyjadřuje pořadové číslo dne v týdnu.
Year
Vrací celé číslo, které reprezentuje rok zadaný v argumentu datum. Syntaxe: Year(datum).
Syntaxe: Weekday(date, [firstdayofweek]).
150
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION
Příkazy AppActivate
Aktivuje aplikační okno s titulkem title. Syntaxe: AppActivate title[, wait] title
je řetězcový výraz v titulkovém pruhu aplikačního okna
wait
je logická proměnná, která určuje, je−li aplikace při volá− ní vybrána nebo nikoli.
Beep
Aktivuje tón z reproduktoru počítače. Frekvence a délka tónu závisí na hardware a systémovém software a nedá se programovými pro− středky Visual Basicu nastavit.
Call
Volání jiné procedury. Předává řízení proceduře Sub, proceduře Function nebo proceduře v dynamické knihovně (DLL). Syntaxe: [Call] jméno [seznam parametrů] Používání klíčového slova Call při volání procedur je nepovinné.
ChDir
Změní aktuální adresář nebo složku. Syntaxe: ChDir cesta. Je povolena i tečková notace: př.:
ChDir “..“
ChDrive
Změní aktuální disk. Syntaxe: ChDrive disk.
Close
Zavře soubor daného čísla (nebo i více souborů, zadáte−li více čísel souborů) a tím znemožní vstup/výstup do tohoto souboru. Syntaxe: Close [seznam čísel souborů].
Const
Deklaruje konstanty, které se používají namísto literálů.
Date
Nastaví aktuální systémové datum. Syntaxe: Date = datum.
Syntaxe: [Public | Private] Const konstjmeno [As type] = výraz. Př.:
Date = #February 19, 1997#
Declare
Používá se na úrovni modulu k deklarování odkazů na externí proce− dury v dynamické knihovně (DLL). Syntaxe je popsána v kapitole pojednávající o dynamických knihovnách DDL.
DefType
Soubor příkazů, které se používají se na úrovni modulu k nastavení výchozího datového typu proměnných, argumentů předávaných pro− cedurám a k nastavení vraceného typu u procedur Function a Pro− perty Get, jejichž názvy začínají zadanými znaky. Př.: Názvy proměnných začínajících písmenem B až D jsou implicitně typu Integer. DefInt B−D
DeleteSetting
Vymazání oddílu nebo hodnoty klíče ze záznamu v registru programu Windows.
Dim
Deklaruje proměnné a přiděluje potřebnou paměť. Syntaxe a použití jsou popsány v kapitole o deklaraci proměnných. Klíčové slovo Dim
Syntaxe: DeleteSetting(appname, section[, key]).
151
UČEBNICE VISUAL BASICU 6.0 se používá také ve spojitosti s klíčovým slovem New při deklaraci ob− jektové proměnné jako nové instanci objektu jazyka Visual Basic nebo objektu OLE. Do...Loop
Příkaz cyklu – opakuje blok příkazů, dokud nabývá podmínka hodno− ty True (ve spoje ní s While) nebo dokud podmínka nenabyde hod− noty True (ve spojení s Until). Syntaxe: Do [{While | Until} podmínka] [příkazy] [Exit Do] [příkazy] Loop Jiná platná syntaxe: Do [příkazy] [Exit Do] [příkazy] Loop [{While | Until} condition]
End
Ukončuje proceduru nebo blok. Používá se ve spojení s klíčovým slo− vem, které specifikuje ukončovanou strukturu Visual Basicu. Syntaxe: End End Function End If End Property End Select End Sub End Type End With
Erase
Provede novou inicializaci prvků polí s pevnou velikostí a uvolní pa− měť přidělenou dynamickým polím. Syntaxe: Erase arraylist. Argument arraylist je jedna nebo více proměnných polí, které jsou vzájemně odděleny čárkou a které je třeba inicializovat.
Error
Simuluje výskyt chyby.
Exit
Slouží k opuštění bloku kódu, který představuje tělo příkazu Do...Loop, For...Next, Function, Sub nebo Property.
Syntaxe: Error číslo_chyby.
Syntaxe: Exit Do
152
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Exit For Exit Function Exit Property Exit Sub FileCopy
Zkopíruje soubor. Syntaxe: FileCopy zdrojový_soubor, kopie
For Each...Next Provede skupinu příkazů pro každý prvek pole nebo kolekce. Syntaxe: For Each prvek In skupina [příkazy] [Exit For] [příkazy] Next [prvek]
For...Next
prvek
je proměnná, která určuje prvky kolekce nebo pole,
Skupina
jméno kolekce nebo pole.
Zpracuje skupinu příkazů tolikrát, kolikrát je parametrem příkazu určeno. Syntaxe: For počítadlo = začátek To konec [Step krok] [příkazy] [Exit For] [příkazy] Next [počítadlo] Notoricky známá konstrukce je ve Visual Basicu obohacena o mož− nost předčasného ukončení cyklu příkazem Exit.
Function
Deklaruje název, argumenty a kód, který tvoří tělo procedury Function. Syntaxe je popsána v kapitole o deklaraci procedur.
Get
Načítá data z otevřeného diskového souboru disku do proměnné. Syntaxe: Get [#]číslo_souboru, [číslo_záznamu], jméno_proměnné Pokud není použito číslo_záznamu, je načten následující záznam ne− bo bajt. Zápis však musí obsahovat oddělující čárky, například: Get #4,,strZnak
GoSub...Return Slouží ke skoku do podprogramu uvnitř procedury a návratu z něj. Syntaxe: GoSub řádek ... řádek ... Return. Parametrem řádek může být libovolné návěští řádku nebo číslo řádku. GoTo
Nepodmíněný skok na určitý řádek procedury. Syntaxe: GoTo řádek
153
UČEBNICE VISUAL BASICU 6.0 Parametrem řádek může být libovolné návěští řádku nebo číslo řádku. If...Then...Else provádí podmíněné zpracování skupiny příkazů v zá− vislosti na pravdivostní hodnotě podmínky. Pokud má podmínka ne− nulovou hodnotu nebo hodnotu True, bude proveden následující blok příkazů. Syntaxe: If podmínka Then příkazy [Else jiné příkazy] Konstrukci lze použít v širším tvaru: If podmínka Then [příkazy] [ElseIf podmínka Then [jiné_příkazy]] . . . [Else [jiné_příkazy]] End If Input
Načte data z otevřeného souboru a přiřadí je proměnným. Syntaxe: Input #číslo souboru, seznam proměnných.
Kill
Maže soubory z disku. Syntaxe: Kill cesta_a_jméno.
Let
Přiřadí proměnné nebo vlastnosti hodnotu nějakého výrazu. Syntaxe: [Let] proměnná = výraz. Používání tohoto klíčového slova je nepovinné.
Line Input
Načte řádek z otevřeného sekvenčního souboru a přiřadí ho řetězcové proměnné.
Lock
Nastavuje uzamčení pro specifikované záznamy souboru otevřeného příkazem Open.
LSet
Řetězec v proměnné zarovná zleva nebo překopíruje proměnnou z jednoho uživatelského typu do jiného uživatelského typu.
Syntaxe: Line Input #číslo_souboru, jméno_proměnné
Syntaxe: Lock [#]číslo souboru[, rozsah záznamů].
Syntaxe: LSet prom_řetězce = řetězec LSet jméno_prom1 = jméno_prom2
154
prom_řetězce
Jméno řetězcové proměnné.
řetězec
Řetězcový výraz který bude v prom_řetězce zarovnán zleva.
jméno_prom1
Jméno uživatelsky definované proměnné, která bude kopírováná do jiné.
jméno_prom2
Jméno uživatelsky definované proměnné, do níž se bude kopírovat.
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Mid
Přepíše určitý počet znaků v řetězci jiným zadaným řetězcem nebo je− ho částí. Syntaxe: Mid(řetězec1, začátek[, délka]) = řetězec2. řetězec1
Jméno proměnné, v níž je upravovaný řetězec.
začátek
Umístění znaku v prom_řetězce, kde se začne s přepiso− váním textu.
délka
Počet znaků, které se budou přepisovat. Je−li tento argu− ment vynechán, je použit celý řetězec2.
řetězec2
Řetězcový výraz který bude vložen do prom_řetězce.
Po provedení operace je délka řetězce1 stejná nebo menší než před použitím příkazu Mid. Pokud je řetězec2 delší, jeho zbylé znaky se budou ignorovat. MkDir
Vytvoří nový adresář nebo složku. Syntaxe: MkDir cesta
Name
Přejmenuje nebo přesune soubor, adresář nebo složku.
On Error
Zapíná rutinu pro obsluhu chyby a určuje pozici rutiny v proceduře; slouží rovněž k vypnutí rutiny pro obsluhu chyby.
Syntaxe: Name stará_cesta_a_ jméno As nová_cesta_a_jméno
Možné syntaxe: On Error GoTo řádek On Error Resume Next On Error GoTo 0 Detailní popis příkazu je uveden v kapitole o obsluze zachytitelných chyb. On...GoSub, On...GoTo Podmíněný skok programu na jeden nebo několik určených řádků. Syntaxe: On výraz GoSub seznam cílů On výraz GoTo seznam cílů
Open
výraz
je libovolný číselný výraz, který nabývá celočíselné hodnoty z uzavřeného intervalu 0 až 255. Nenabývá−li výraz celočíselné hodnoty, je jeho hodnota před vy− hodnocením zaokrouhlena. Pokud je jeho hodnota mi− mo výše uvedený interval, vygeneruje se chyba. Pokud je hodnota výrazu 0, předá se řízení na příkaz následu− jící za příkazem Goto nebo Gosub. Jen při nenulové hodnotě výrazu bude proveden skok určený sezna− mem cílů.
seznam cílů
je seznam čísel řádků nebo návěští řádků oddělených čárkami.
Umožní vstupní/výstupní operace ze/do souboru. Syntaxe: Open cesta_a_jméno [For režim][Access přístup] [zamknout]_ As [#]číslo souboru [Len=délka záznamu]
155
UČEBNICE VISUAL BASICU 6.0
Option Base
cesta_a_jméno
Řetězcový výraz určující jméno souboru může za− hrnovat adresář nebo složku, a disk.
režim
Klíčové slovo určující typ přístupu k souboru: Append (přidání k souboru), Binary, Input (vstup), Output (výstup) nebo Random (náhod− ny přístup).
přístup
Klíčové slovo určující povolené operace s otevře− ným souborem: Read, Write nebo Read Write.
zamknout
Klíčové slovo určující povolené operace s otevře− ným souborem prováděné jinými metodami: Sha− red, Lock Read, Lock Write, and Lock Read Write.
číslo souboru
Platné číslo souboru v rozsahu od 1 do 511. Lze použít funkci FreeFile ke zjištění dalšího použi− telného čísla souboru.
délka záznamu
Číslo menší než nebo rovné 32 767 (počet bajtů). Pro soubory otevřené pro přímý přístup je jeho hodnota rovna délce záznamu. Pro ostatní sou− bory představuje tato hodnota počet znaků ve vy− rovnávací paměti.
Příkazem se na úrovni modulu deklaruje výchozí mez dolních indexů pole. Syntaxe: Option Base {0 | 1}
Option Compare Používá se na úrovni modulu k deklarování výchozí porovnávací me− tody, která se používá při porovnávání řetězcových dat. Syntaxe: Option Compare {Binary | Text | Database} Příkaz Option Compare Binary má za následek porovnání na zákla− dě pořadí řazení, které vychází z interního binárního tvaru znaků. Option Compare Text porovnává řetězce bez rozlišení malých a vel− kých písmen. Option Explicit Používá se na úrovni modulu k vynucení explicitní deklarace všech proměnných v tomto modulu. Syntaxe: Option Explicit. Option Private Module Příkazem se na úrovni modulu určí, že celý modul má být soukromý. Syntaxe: Option Private Module. Print # Zapíše data upravená pro zobrazení do sekvenčního souboru. Syntaxe: Print #číslo souboru, [seznam výstupu].
156
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Private
Používá se na úrovni modulu k deklarování soukromých proměnných a přidělování paměti. Syntaxe: Private varname [([ subscripts ])][ As [ New ] type][, varna− me_[([subscripts])][As [New] type]] . . . varname
Název proměnné.
subscripts
Rozměry proměnné pole. Je dovoleno deklarovat až 60−ti rozměrné pole. Argument subscripts používá následující syntaxi:
[lower To] upper [,[lower To] upper] . . . Není−li explicitně uvedeno v argumentu lower, je dolní mez pole říze− na příkazem Option Base. Nevyskytuje−li se příkaz Option Base v programu, bude mít dolní mez nulovou hodnotu.
Property Get
New
Klíčové slovo, které udává, že deklarovaná proměnná objektu je nová instance objektu v programu Visual Basic nebo objektu OLE, který je možné vytvořit externě.
type
Datový typ proměnné. Datové typy jsou Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (pro řetězce proměnné délky), String length (pro řetěz− ce pevné délky), Object, Variant, uživatelský typ, nebo objektový typ. Pro každou definovanou proměnnou je třeba použít samostatnou klauzuli As type.
Příkazem se deklaruje název, argumenty a kód tvořící tělo procedury Property, která vrací hodnotu vlastnosti. Syntaxe: [Public|Private][Static]Property Get name [(arglist)][As type] [statements] [name = expression] [Exit Property] [statements] [name = expression] End Property
Property Let
Deklaruje název, argumenty a kód, které tvoří tělo procedury Proper− ty Let. Procedura přiřazuje hodnotu nějaké vlastnosti. Syntaxe: [Public|Private][Static] Property Let name [(arglist)] [statements] [Exit Property] [statements] End Property
Property Set
Deklaruje název, argumenty a kód, které tvoří tělo procedury Proper− ty, která nastavuje odkaz na objekt.
157
UČEBNICE VISUAL BASICU 6.0 Syntaxe: [Public | Private][Static] Property Set name [(arglist)] [statements] [Exit Property] [statements] End Property Public
Používá se na úrovni modulu k deklarování veřejných proměnných a k přidělení paměti.
Put
Načte data z proměnné do souboru na disku. Syntaxe: Put [#]číslo_souboru, [číslo_záznamu], jméno_proměnné číslo_souboru
Jakékoli platné číslo souboru.
číslo_ záznamu
Číslo záznamu (soubory s náhodným přístupem) nebo číslo bajtu (soubory v binárním režimu), na kterém začne zápis.
jméno_proměnné Jméno proměnné, která obsahuje data pro zápis na disk. Randomize
Spouští generátor náhodných čísel. Syntaxe: Randomize [číslo] Příkaz Randomize používá argument číslo pro inicializaci generátoru náhodných čísel funkce Rnd.
ReDim
Používá se na úrovni procedury k deklarování proměnných dynamic− kého pole a k přidělování paměti. Př.: Dim Pole() As Integer ‘ Deklarace dynamického pole. ReDim Pole(10)
‘ Přidělení 10−ti prvků.
Rem
Příkaz uvozuje vysvětlující komentář. Kompilátor ignoruje zbytek řád− ku začínajícího klíčovým slovem Rem.
Reset
Příkaz Reset zavře všechny aktivní soubory otevřené příkazem Open a zapíše obsahy všech vyrovnávacích pamětí souborů na disk.
Resume
Obnovuje výpočet po ukončení obsluhy chyby. Syntaxe: Resume [0]
Vrátí řízení příkazu, který právě ošetřenou chybu vyvolal.
Resume Next
Odevzdá řízení příkazu bezprostředně následujícímu za příkazem, který chybu vygeneroval.
Resume řádek Výpočet pokračuje řádkem určeným parametrem řá− dek, kde řádek je buď návěští řádku nebo číslo řádku. Return
Používá se ve spojení s příkazem GoSub. Vrátí řízení z podprogramu procedury zpět na příkaz bezprostředně následující za příkazem GoSub, který provedl skok do podprogramu.
RmDir
Smaže existující adresář nebo složku. Syntaxe: RmDir cesta
158
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION RSet
Zarovná znaky v řetězci doprava. Je−li zarovnávaný řetězec kratší než původní, bude zleva nahrazen mezerami. Syntaxe: RSet prom_řetězce = řetězec
SaveSetting
Uloží nebo vytvoří záznam aplikace v registru programu Windows. Syntaxe: SaveSetting(appname, section, key, setting) appname
výraz typu String, který obsahuje název aplikace nebo projektu, kterého se nastavení týká.
section
výraz typu String, který obsahuje název oddílu, kam ma− jí být klíče uloženy.
key
výraz typu String, který obsahuje název klíče, který má být uložen.
setting
výraz, který obsahuje hodnotu, která má být přiřazena klíči určenému parametrem key.
Seek
Nastaví místo pro čtení nebo zápis v souboru otevřeného příkazem Open. Syntaxe: Seek [#]číslo souboru, pozice
Select
Zpracuje jednu z několika skupin příkazů v závislosti na hodnotě výrazu. Syntaxe: Select Case test [Case seznam výrazů−n [příkazy −n]] . . . [Case Else [jiné příkazy ]] End Select Parametrem test může být jakýkoli číselný nebo řetězcový výraz.
SendKeys
Zasílá jedno nebo více stisknutí kláves do aktivního okna, jako kdyby byly stisknuty na klávesnici. Syntaxe: SendKeys string[, wait] Argument string je řetězcový výraz specifikující, které klávesové úho− zy se mají odeslat. Přehled kódů některých kláves: Klávesa
Kód
BACKSPACE
{BACKSPACE}, {BS} nebo {BKSP}
BREAK
{BREAK}
CAPS LOCK
{CAPSLOCK}
DEL
{DELETE} nebo {DEL}
END
{END}
ENTER
{ENTER}
ENTER
{~}
ESC
{ESC}
159
UČEBNICE VISUAL BASICU 6.0 HOME
{HOME}
INS
{INSERT}
NUM LOCK
{NUMLOCK}
PAGE DOWN
{PGDN}
PAGE UP
{PGUP}
PRINT SCREEN
{PRTSC}
SCROLL LOCK
{SCROLLLOCK}
ŠIPKA DOLŮ
{DOWN}
ŠIPKA NAHORU
{UP}
ŠIPKA VLEVO
{LEFT}
ŠIPKA VPRAVO
{RIGHT}
TAB
{TAB}
F
{F1}
Ostatní klávesy (čísla a písmena) se do řetězce zapisují bez další iden− tifikace. Pro určení klávesových příkazů spojených s nějakou z kláves SHIFT, CTRL a ALT, napište před kód klávesy jeden z těchto znaků: Klávesa
Kód
SHIFT
+
CTRL
^
ALT
%
Následující příklad demonstruje použití programu Kalkulačka (vestavě− ného do operačního systému Windows) použitím příkazu SendKeys: ReturnValue = Shell(“CALC.EXE“, 1) ‘ Spustí program Kalkulačka. AppActivate ReturnValue For int = 200 To 1000
‘ Aktivuje program Kalkulačka. ‘ Nastaví smyčku pro výpočet součtu.
SendKeys int & “{+}“, True
‘ Odesílá programu Kalkulačka stisky kláves
Next int SendKeys “=“, True
‘ Vytvoří celkový součet.
SendKeys “%{F4}“, True
‘ Odesláním ALT+F4 uzavře program
Set
Přiřadí proměnné nebo vlastnosti odkaz na objekt. Syntaxe je ukázána na příkladech dříve v této učebnici.
SetAttr
Nastaví atributy souboru. Syntaxe: SetAttr cesta, atributy Možnosti nastavení proměnné atributy jsou:
160
PŘEHLED KLÍČOVÝCH SLOV VISUAL BASIC FOR APPLICATION Konstanta
Hodnota
Popis
vbNormal
0
Normální (výchozí).
vbReadOnly
1
Pouze pro čtení.
vbHidden
2
Skrytý.
VbSystem
4
Systémový soubor.
VbArchive
32
Soubor byl od posledního zálohování pozměněn.
Soubor, u kterého chcete nastavit atributy, nesmí být otevřen. Static
Používá se na úrovni procedury k deklarování proměnných a přidělo− vání paměti. Proměnné deklarované příkazem Static si uchovávají svou hodnotu po celou dobu běhu kódu. Popsáno v knize.
Stop
Přerušuje výpočet. Používá se např. při ladění procedur.
Sub
Deklaruje název, argumenty a kód, které tvoří tělo procedury Sub. Syntaxe a použití popsáno v knize.
Time
Nastaví systémový čas.
Type
Používá se na úrovni modulu k definici uživatelského datového typu obsahujícího jeden nebo více prvků.
Unlock, Lock
Ovládání přístupu – odemknutí, resp. uzamčení – k souboru otevřenému příkazem Open.
Syntaxe: Time = čas
Syntaxe: Unlock [#]číslo souboru[, rozsah záznamů] While...Wend
Provádí skupinu příkazů tak dlouho, dokud zadaná podmínka nabývá hodnoty True. Syntaxe: While podmínka [příkazy] Wend
Width #
Přiřadí šířku výstupnímu řádku (počet znaků na řádek např. při tisku) souboru otevřenému příkazem Open.
With
Provede na jednom objektu nebo uživatelském datovém typu skupinu operací určených příkazy.
Syntaxe: Width #číslo souboru, šířka
Syntaxe: With objekt [příkazy] End With Write #
Zapíše data do souboru. Syntaxe: Write #číslo souboru, [seznam_výstupů] seznam_výstupů reprezentuje jeden nebo více čárkami oddělených, čísel− ných nebo řetězcových výrazů určené k zápisu na disk.
161
Rejstřík
A
F
argument buttons, 16 mode, 61
formulář, 13 fráze CONSTRAINT, 84 GROUP BY, 79 HAVING, 79 ORDER BY, 79 WHERE, 78 funkce, 137 Asc, 57 CStr, 57 Format, 57 Chr, 57 IsMissing, 24 IsNumeric, 30 LSet, 56 MsgBox, 15 pro porovnávání řetězců, 55 RSet, 56 Str, 58 Val, 58
C Clear, 118 CommonDialog, 110 Connect, 91
Č číselné datové typy, 31
D DAO, 69 DatabaseName, 91 databázový ovladač, 71 DataField, 92 DataSource, 92 datový typ Boolean, 32 Object, 32 DefaultType, 91 deklarace konstant, 35 proměnných, 25 WITH OWNERACCESS OPTION, 80 deklarační sekce modulu, 26 Description, 118 dialog pro tvorbu Menu, 93 direktivy překladače, 137 DLL knihovna, 131 DSN−less, 90
H HelpContext, 118 HelpFile, 118 hodnota False, 117 Null, 30 True, 117
CH chyby, 113
E
I
Error, 113
Index, 99 instalace tiskárny, 108
163
UČEBNICE VISUAL BASICU 6.0
K klauzule ClearFormatting, 67 IN, 78 klíčové slovo, 21, 137 Optional, 24 kód Visual Basicu, 15 kódy chyb, 114 kolekce Printers, 108 Kontextové menu, 95 kontrola pravopisu, 65
L ladění programového kódu, 119 ladicí okno, 123 LastDLLError, 118
M MDI formuláře, 127 MDIForm, 127 Menu, 93 metoda RemoveItem, 47 metody, 3 Minimum Width, 99 mřížka, 12
N nabídka, 7 nahrazování textu, 66 nástrojová lišta, 7 návratové hodnoty funkce, 150 Number, 118
O ODBC, 69 odkaz, 21 okno projektu, 8, 134 vlastností projektu, 134 On Error GoTo 0, 116 On Error Resume Next, 116 operace INNER JOIN, 81 LEFT JOIN a RIGHT JOIN, 81 UNION, 81 ovládací prvek CommandButton, 39 CommonDialog, 110
164
Data, 90 ImageList, 102 ListBox, 39 TextBox, 39 ovládací prvky, 3 ovládání tiskáren, 107
P panel ovládacích prvků, 7 parametr KeyCode, 46 Shift, 47 platnost proměnných, 28 podřetězec, 49 pokročilá práce s řetězci, 55 pole, 33 predikáty ALL, DISTINCT, DISTINCTROW, TOP, 82 procedura main(), 75 programování, 11 programové moduly, 19 programový kód, 119 proměnná frm, 72 typu Variant, 30 prostředí Visual Basicu, 5 příkaz ALTER TABLE, 83 CREATE INDEX, 84 CREATE TABLE, 83 DELETE, 85 DROP, 85 Exit Sub, 51, 116 On Error, 116 PARAMETERS, 83 Resume, 117 SELECT, 77 TRANSFORM, 82 UPDATE, 85 příkazy, 151 přístup k datům, 69
R Raise, 118 ReadOnly, 91 RecordsetType, 91 RecordSource, 91
REJSTŘÍK
Ř
U
řetězcové proměnné, 31
událost Error, 113 LostFocus, 45 události, 3 událostní procedura, 13 user friendly aplikace, 104 uživatelem definované typy, 32
S SELECT...INTO, 80 seznam argumentů, 21 Source, 118 SQL dotaz, 77 aplikace, 86 StatusBar, 97 Style, 99 System DSN, 70
V veřejné procedury, 25 vlastnosti, 3 volání okna, 15 vytváření názvů, 29
T tělo, 15 Text, 99 textové soubory, 61 textový řetězec, 44, 49 tisk, 107
W Word, 65
Z záznam (Record), 64
165
Doporučená literatura: 1. 2. 3. 4.
Microsoft Visual Basic 6.0, příručka programátora, Microsoft Press, 852 stran, [K0221] Microsoft Visual InterDev 6.0 Příručka programátora, Microsoft Press, Microsoft Press, 488 stran, [K0241] Microsoft Visual Basic 6.O Professional Krok za krokem, Michael Halvorson, 588 stran + CD, Microsoft Press, [K0229] Mistrovství ve Visual Basicu 6.0, The Mandelbrot Set, Microsoft Press, 834 stran + CD, [K0264]