Peter Hrdlica / 05. 03. 2010, 08:37
V aktuálnom článku sa budeme venovať problematike funkcií a procedúr. Priblížime si kolekcie, polia, základy práce so stringami a podrobne si rozoberieme zdrojový kód
Úvod
Vítam Vás pri ďalšom diely seriálu o programovaní vo VB.NET. Dnes si ukážeme základnú prácu s funkciami a procedúrami a zbežne sa zoznámime s prácou s premennými typu string, poľom, kolekciami ovládacích prvkov či doplníme zápis cyklu For .. Next.
Funkcie a procedúry
Funkcie a procedúry sú akési podprogramy (kusy zdrojového kódu), ktoré umožňujú znovupoužitie kódu (tj. opakované volanie, bez nutnosti zväčšovania jeho „objemu“, v závislosti na platnosti deklarácie), jeho parametrizáciu (dynamickú zmenu parametrov = vstupných hodnôt), získanie návratovej hodnoty (pri funkciách) a v neposlednej rade oddelenie logických celkov programu do samostatných častí, vďaka čomu sa zlepšuje čitateľnosť kódu a zjednodušuje sa jeho úprava.
Deklarácia
Funkcie ako aj procedúry (ale aj premenné) môžu mať rôznu „územnú“ platnosť. Môžu byť privátne Private a platiť iba na formulári, module, atd. kde ste ich deklarovali, alebo globálne Public a môžeme k nim pristupovať z ktorejkoľvek časti nášho programu – iné okno, iný modul, .. Určite ste si tieto rozdiely už všimli napr. pri deklarácii rôznych handlerov.
Ako príklad na použitie funkcie si uvedieme program, ktorý načíta vstupný text a prerobí prvé písmená každého slova na veľké a zároveň si aspoň ukážeme základy práce so stringami. Navrhnite si formulár približne nasledovne:
Ako prvé si zadeklarujeme funkciu. V tomto prípade, by sa samozrejme celý kód zmestil do handleru tlačidla a program by tým nijak neutrpel, no ide nám o názornú ukážku práce s funkciami a procedúrami
Private Function spracovanie_textu(ByVal text As String)
Dim pole() As String = Split(text, " ")
Dim slovo As String
Dim spracovana_veta As String = ""
For Each slovo In pole
spracovana_veta += UCase(Strings.Left(slovo, 1)) + Strings.Right(slovo, Len(slovo) - 1) + " "
Next
Return spracovana_veta
End Function
Rozbor:
- keďže budeme funkciu používať iba v rámci tohto jedného formulára, tak sme ju deklarovali ako lokálnu - Private
- slovo Function nám vraví, že sa bude jednať o funkciu a nie o procedúru a teda vo výsledku budeme očakávať nejakú návratovú hodnotu
- spracovanie_textu() je názov funkcie
- ByVal text As String je deklarácia parametra predávaného funkcii, v našom príklade predávame vetu zo vstupného textového poľa; ByVal znamená, že tento parameter sa nesmie vynechať
- Dim pole() As String deklaruje pole typu String; polia uchovávajú dáta istého typu a je možné k nim pristupovať hromadne pomocou indexácie prvkov
- Split(text, " ") do poľa priamo vloží dáta a to tak, že vezme vetu text, ktorú sme predali funkcii parametricky a rozdelí ju podľa oddeľovača " " čo je v našom prípade medzera oddeľujúca slová
- For Each slovo In pole je takmer rovnaký For cyklus ako ten, ktorý sme si už ukázali, no tento krát sa jedná o prvky slovo v kolekcii pole (každé slovo pôvodnej vety) a pre každý tento prvok budeme vykonávať určitý programový kód
- spracovana_veta += je skrátená podoba ekvivalentného výrazu spracovana_veta = spracovana_veta + .. – programovací jazyk tento príkaz chápe tak, že vezme starý obsah danej premennej a na jej koniec prilepí nové dáta; ak by sme to + vynechali, tak by sa premenná zakaždým kompletne prepísala
- UCase() urobí z predaného stringu uppercase = veľké písmeno, ak už veľké je, tak neurobí nič
- Strings.Left(slovo, 1) vezme zo stringu slovo jeden znak zľava (číslo za čiarkou v parametroch určuje počet znakov, ktoré sa majú odrezať)
- Strings.Right() funguje rovnako ako predošlí príkaz, ale z opačnej strany stringu – od konca = sprava
- Len(slovo) nám vráti číselnú hodnotu dĺžky predaného stringu
- Strings.Right(slovo, Len(slovo) - 1) teda odreže od pravého okraja o jeden znak menej (vynechá ten, ktorý sme odrezali a zväčšili) ako je celková dĺžka slova
- Return spracovana_veta - ako som zmienil už na začiatku, funkcia musí mať nejakú návratovú hodnotu, v našom prípade to bude už celá spracovaná veta; návratovú hodnotu podávame príkazom Return; ak by sme Return nevolali, parser by nás na to upozornil
Volanie funkcie na spracovanie vety:
K funkciám i procedúram pristupujeme tak, že ich voláme po mene, rovnako ako doma voláte svojich rodinných príslušníkov alebo v práci kolegov. V našom konkrétnom príklade voláme funkciu z handleru tlačidla a jej návratovú hodnotu vložíme do prvku Label menom lbl_vystup pričom obsah textového poľa je povinný parameter funkcie.
lbl_vystup.Text = spracovanie_textu(TextBox1.Text)
Kolekcie
Vo VB.NET je možné jednoducho pracovať so všetkými prvkami na formulári (prípadne iba s prvkami istého druhu) a to pomocou kolekcií. Uvedieme si príklad, v ktorom pomocou kolekcií bude procedúra zisťovať, či je náš imaginárny „registračný formulár“ vyplnený. Nakreslime si teda okno približne nasledovne:
Public Sub vyplnene()
Dim prvok As Control
For Each prvok In Me.Controls
If TypeOf (prvok) Is TextBox Then
If prvok.Text = "" Then
MessageBox.Show("Nevyplnili ste všetky polia!", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error)
Me.ActiveControl = prvok
Return
End If
End If
Next
End Sub
Rozbor:
- Dim prvok As Control je všeobecná deklarácia ovládacích prvkov
- For Each prvok In Me.Controls značí konkrétne „Pre každý prvok v Mojich.Ovládacích_prvkoch“; zabezpečuje, že sa skutočne žiadny prvok v kolekcii Me.Controls nevynechá
- If TypeOf (prvok) Is TextBox Then zistí či je skúmaný prvok typu TextBox a ak áno, budeme pokračovať jeho kontrolou
- Me.ActiveControl = prvok dá focus (aktivuje) na prvok, o ktorom sa zistilo, že je skutočne prázdny
- Return sa v tomto prípade viaže na kontrolujúci cyklus a nie na celú procedúru, no keďže už za cyklom nič nevykonávame, ukončí sa aj tá; keby sme Return vynechali, tak by sa nám MessageBox zobrazil naraz pre každý nevyplnený prvok a neumožnil by nám tak efektívne ukázať užívateľovi prázdne textové pole
Rozbor vynechaných riadkov ako i volanie funkcie nechám už na pozornom čitateľovi.
Pole s heslom upravíme v panely s vlastnosťami prvkov a to tak, že vlastnosti PasswordChar priradíme akýkoľvek znak, ktorým budeme vstupný text „šifrovať“, najčastejšie však *,#,•.
Záver
Dnes sme i ukázali ďalšie dôležité postupy potrebné pri programovaní stále objemnejších a náročnejších aplikácií. Ak sa ktorákoľvek časť zdala nezrozumiteľná, prípadne zle či nevhodne vysvetlená, prosím informujte ma o tom nech je možné tento omyl napraviť. Prajem Vám rýchle a bezproblémové zvládnutie problematiky.
Peter Hrdlica
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk