Nevizuální objektyPři procedurálním řízení
programu s výhodou použijeme zapouzdřené objekty, které slouží jako černé
skříňky k provádění různých funkcionalit. Objekty nemusí být vizuální
(nejsou při běhu programu vidět). Ukážeme si to na jednoduchém a vidláckém
příkladu tzv. spínacích hodin.
Spínací hodiny
Základní
funkcionality spínacích hodin spočívají v tomto:
- umožňují týdenní plánování zapnutí a vypnutí zařízení (čas se píše
do polí)
- pracují se systémovým časem PC
- lze s nimi zařízení zapnout trvale (zelené tlačítko)
- lze s nimi zařízení trvale vypnout
- lze spustit funkci předvoleného čas. programu
- lze jimi řídit zařízení, které obsahuje
mikropočítač se sériovým portem
- lze je spustit ve více instancích, pokud řídíme zap/vyp více
zařízení, start dalších spínaček se dělá stisknutím speciálního
tlačítka (široké a hnědé dole).
Poznámky:
1. V této demoverzi byl odstraněn kód pro komunikaci se zařízením.
2. Jedna z
komunikujících verzí je však popsána na této stránce.
|
 |
Spuštění více instancí vypadá takto (horní dvě
zařízení jsou zrovna zapnuta):

Spuštění více instancí má zásadní výhodu - Form1
programu je jednoduchý a přehledný.
Návrh programu
Demo programu (exe) si
můžete stáhnout zde. Zdrojový
kód (Visual Basic) .zip
stáhnete zde a listing
programu .pdf zde.
Nevizuální objekty
| V plné verzi
byly použity dva nevizuální objekty (Timer a Seriová komunikace). V
demoverzi si představíme pouze Timer, jeho použití je jednoduché,
používá se často. Vy nemáte zařízení, které lze spínačkami ovládat. Já
takové zařízení mám a je v něm mikropočítač PICAXE 08M2, který se
programuje také v programu Basic. V této úloze nyní nemá smysl druhý
objekt popisovat. Nevizuální objekt vytáhneme
z Toolboxu jako kterýkoliv jiný objekt a vyplníme dvě vlastnosti,
které budou po startu Form1 důležité - interval 200 milisekund; po
uplynutí takového intervalu timer provede příkazy, které má napsané ve
své proceduře, pokud je vlastnost Enabled nastavena jako True. |
 |
| |
|
Pohled na design programu

Procedura Timer1 obsahuje jen dva příkazy -
volání dvou procedur:
Private
Sub Timer1_Tick(ByVal
sender As
System.Object, ByVal
e As System.EventArgs)
Handles
Timer1.Tick
Prave_nyni()
'Skok do procedury na zjisteni casu
Makej()
'Skok do procedury testovani
přednastavených parametrů
End
Sub
Procedura právě nyní slouží k tomu, aby program
zjistil aktuální čas ze systémových hodin. Ten je vyčten v definovaném
formátu a my ho pomocí několika málo příkazů musíme převést do formátů,
které budeme v další proceduře testovat a zpracovávat:
Private
Sub Prave_nyni()
den_nyni.Text = Format(Now(), "dddd")
'Tady se takto načte den v tejdnu jako číslo ve formátu "dddd"
cas_nyni.Text = Format(Now(), "HH.mm
ss") + " h.min
s"
'Tady se sežene čas jako text (řetěz) ve
formátu "h.min s"
Datum_hhmm = 100 * Format(Now(), "HH")
+ Format(Now(), "mm")
+ 1 'Tady se vyrobí
hodnota pro testování (porovnávání) ve formátu "hhmm"
Label5.Text = Format(Now(), "ss")
+ " sekund"
'Tady se vyrobí jen hodnota sekund
(nepoužil jsem)
End
Sub
Poznámka: V tomto školním příkladu jsme se naučili
používat systémovou funkci Format ( ....). Funkci jsme volali celkem 4
krát, pokaždé s jinými parametry a ona nám vrátila pokaždé jiné hodnoty
(podle parametrů), které jsme dosadili do textových proměnných.
Tlačítko "Start dalších hodin" (tlačítko Button4)
obsahuje též příkaz systémové funkce:
Private
Sub Button4_Click(ByVal
sender As
System.Object, ByVal
e As System.EventArgs)
Handles
Button4.Click
Shell("time_control.exe",
AppWinStyle.NormalFocus)
' Po kliknutí na tlačítko je spuštěn program "time_control.exe"
End
Sub
Jedná se o systémovou funkci Shell ( ), pomocí které se
spouští spustitelné Windows programy s různými parametry. Jsou nabídnuté v
kontextové nápovědě) při psaní kódu.
Poznámky:
1. Tímto jednoduchým opatřením si snadno pořídíme tolik časových intervalů
na zapínání během dne, aniž bychom to dopředu plánovali a rozmýšleli.
Rozhodneme se až při běhu programu, když spínačky nastavujeme.
Potřebujeme-li další interval, jednoduše si ho přidáme.
2. Všimněte si, že opět je kód napsán ve třídě (Class) Form1 a jeho konec
je ukončen End Class. Můžeme si něco vyhledat a přečíst o tzv. třídách.
3. Všimněme si deklarace proměnných. První je typu Date, další tři jsou
typu String (řetěz, textový řetězec, ...)
Dim Datum
As
Date
'Deklarace Datum
Dim Datum_hh
As
String
Dim Datum_mm
As String
Dim Datum_hhmm
As
String
Omezení
Naší demoverzi jsme si omezili o procedury pro komunikaci. Ostatní
věci však provádí jako reálný program. Využívá vizuálních a jednoho
nevizuálního objektu Timer1, volá 2 systémové funkce (Format a Shell),
imperativní programování využívá procedur (skoků do podprogramů) a
dosazovacích příkazů.
Měli bychom být schopni vytvořit stejný program v Linuxu, v prostředí
Gambas nebo klidně v prostředí Lazarus, pokud se učíme syntaxi jazyka
Pascal a deklaraci proměnných v Pascalu.
Měli bychom mít podvědomí o tom, co to je imperativní a objektové
programování, jak se dělá s procedurami, že jsou vizuální a nevizuální
objekty, že jsou tzv. třídy, že se nějak volají funkce, apod.
Po této lekci bychom měli být rovněž schopni porozumět např. tzv. "tipům
dne", které nám nabízí Gambas 3 po jeho spuštění v Linuxu.
Pokud spustíme program v Linuxu, v runtime Wine, nebudou některé věci
fungovat, např. sériový port, ten není v demoverzi, ale ani funkce Shell
nám nespustí ve Wine další instanci. Pokud na dalším obrázku vidíte
spuštěné dvě instance, tak toho jsem docílil tím, že jsem je spustil
zavaděčem Wine z adresáře:

|