9.1 CommonDialog pokračování
9.2 Odchytávání chyb
9.3 Barvy
9.4 Datum a čas
9.5 PopUp Menu
9.6 Domácí úkol
9.7 V další lekci
9.1 CommonDialog pokračování
CommonDialog nám nyní pomůže drobně upravit prohlížeč obrázků, který jsme tvořili v minulé lekci, a to tak, že pomocí něj budeme moci otevírat obrázky.
Private Sub Command1_Click()
CommonDialog1.DialogTitle = "Vyber obrázek"
CommonDialog1.Filter = "*.jpg; *.gif; *.bmp; *.dib; *.wmf"
CommonDialog1.ShowOpen
Image1.Picture = LoadPicture(CommonDialog1.FileName)
End Sub
Private Sub Dir1_Change()
File1.Path = Dir1.Path
Label1.Caption = File1.Path
End Sub
Private Sub Drive1_Change()<
Dir1.Path = Drive1.Drive
File1.Path = Dir1.Path
Label1.Caption = File1.Path
End Sub
Private Sub File1_Click()
Image1.Stretch = True
Image1.Picture = LoadPicture(File1.Path & "\" & File1.FileName)
Label1.Caption = File1.Path & "\" & File1.FileName
End Sub
Private Sub Form_Load()
File1.Pattern = "*.jpg; *.gif; *.bmp; *.dib; *.wmf"
Label1.Caption = File1.Path & "\" & File1.FileName
End Sub
Než CommonDialog zobrazíme, tak mu můžeme dát vlastnosti, např. titulek okna nebo jiné. Nás bude zajímat možnost omezení na určité formáty souborů, to se zde neprovádí pomocí File1.Pattern = "*.jpg; *.gif; *.bmp; *.dib; *.wmf" , ale pomocí CommonDialog1.Filter = "*.jpg; *.gif; *.bmp; *.dib; *.wmf". Není to závratný rozdíl, ale je potřeba si na to dávat pozor. Potom CommonDialog zobrazíme pomocí CommonDialog1.ShowOpen a načteme obrázek do ImageBoxu takto:
Image1.Picture = LoadPicture(CommonDialog1.FileName)
Je to mnohem jednodušší a mnohem méně pracné než používat prvky DriveListBox a podobně. To by bylo to podstatné o načítání pomocí CommonDialogu. Ukládání si probereme někdy jindy.
9.2 Odchytávání chyb
Odchytávání chyb je docela pracné, protože pokud chcete udělat nějaký plně funkční produkt, tak nemůže spadnout uprostřed práce, tak jak to mají některé programy ve zvyku. Chyb k odchytávání je opravdu mnoho, obzvláště pokud máte rozsáhlou aplikaci. Jednou z takových chyb může být například jen nevložené CD do mechaniky nebo jen nějaká drobnost, jako je stisknutí storna při CommonDialogu nebo dělení nulou. Existuje několik způsobů, jak chybu odchytit. Začneme tím nejjednodušším, a to je přeskočení chyby:
Private Sub Form_Load()
On Error Resume Next
a = x / 0
End Sub
Nulou samozřejmě nelze dělit, tak co může program udělat? No vyhodí chybu, ale protože je v proceduře zapsáno On Error Resume Next, která programu říká, ať při chybě pokračuje dál, tak se program nezasekne, ale pokračuje dál. To je ale málo, některé chyby je potřeba ošetřit tak, aby nenarušily chod programu nebo aby něco oznámily uživateli. V takovém případě se používá ErrorHandler: je to část kódu, ve které se opravuje nebo vyřizuje ona chyba. Kód potom může vypadat třeba takto:
Private Sub Form_Load()
On Error GoTo ErrorHandle
a = x / 0
ErrorHandle:
End Sub
Zde je zjednodušená ukázka, jak kód může vypadat. Druhý řádek kódu, který obsahuje text On Error GoTo ErrorHandle, který určuje, že pokud se stane chyba, tak se program přesune do části za názvem ErrorHandle: a pokračuje v ní. Zde je drobná ukázka jak toho využít jako oznámení uživateli:
Private Sub Form_Load()
On Error GoTo ErrorHandle
x = 7
y = 0
a = x / y
ErrorHandle:
If Err.Number = 11 Then MsgBox "Nulou nelze dělit", _
vbOKOnly, "Chyba"
End Sub
Nebo to lze využít pro opravení chyby třeba takto:
Private Sub Command1_Click()
On Error GoTo ErrorHandle
x = 7
y = 0
a = x / y
ErrorHandle:
If Err.Number = 11 Then
y = 1
Resume
End If
End Sub
Slovíčko Resume znamená návrat na řádek, ve kterém se vyskytla chyba a jeho opětovné provedení a pokračování v kódu. Pokud se ale chyba neopravila nebo se opravila špatně, tak se z toho klidně může stát nekonečná smyčka, proto si na to dávejte pozor. Obsah ErrorHandleru dávejte do podmínky, protože jinak se provede také, protože je to součástí procedury a program přes náš ErrorHandle půjde:
Private Sub Command1_Click()
On Error GoTo ErrorHandle
x = 7
y = 0
a = x / y
Print "Konec"
ErrorHandle:
If Err.Number = 11 Then
MsgBox " Nulou nelze dělit ", _
vbOKOnly, "Chyba"
Resume Next
End If
End Sub
Zde je ještě jedna modifikace, ta se ale nevrací k řádku, na
kterém se vyskytla chyba, ale pokračuje na řádku pod ním.
Nyní se budu věnovat
další části ohledně chyb, a to je využití objektu s názvem Err. Ten obsahuje informace o chybě. Jeho použití je ukázáno již v předchozích případech, ale teď se
jím budu zabývat podrobněji.
Private Sub Command1_Click()
On Error GoTo ErrorHandle
x = 7
y = 0
a = x / y
Print "Konec"
ErrorHandle:
If Err.Number = 11 Then
MsgBox "Typ Chyby:" & Chr(13) & Chr(10) & Err.Description _
& Chr(13) & Chr(10) & Chr(13) & Chr(10) & "Číslo chyby" & _
Chr(13) & Chr(10) & Err.Number, vbOKOnly, "Chyba"
Resume Next
End If
End Sub
Zde je ukázka kódu, jak by měl přibližně vypadat a jak by měl být zformátován. Podtržítka se používají k zalamování dlouhých příkazů, ať se nemusí rolovat ve dvou směrech. Chr(13) & Chr(10) kombinace těchto dvou čísel převedených pomocí funkce char na znak se v MsgBoxu přesuneme na další řádek. Nyní se dostávám k tomu, k čemu jsem chtěl, to je objekt Err. Ten v sobě, jak jsem se již zmiňoval, obsahuje informace o chybě, a to číslo chyby a popisek chyby. Číslo chyby získáme z Err.Number a typ nebo popis chyby pomocí Err.Description. Chyby se pomocí funkce vypíší do MsgBoxu a uživatel bude vědět, kde udělal chybu. Vypisování čísla samozřejmě není nutné, protože uživateli, který nezná jazyk, bude asi k ničemu. Ještě ukázka, jak filtrovat chybu chybějícího CD v mechanice a použití ukončení procedury kvůli vyvolané chybě. Jako příklad dávám opět ukázku z minulé lekce, tj. upravený prohlížeč obrázků.
Private Sub Dir1_Change()
File1.Path = Dir1.Path
Label1.Caption = File1.Path
End Sub
Private Sub Drive1_Change()
On Error GoTo Error
Dir1.Path = Drive1.Drive
File1.Path = Dir1.Path
Label1.Caption = File1.Path
Error:
If Err.Number = 68 Then
MsgBox "Disk není " & Drive1.Drive & " k dispozici" _
vbOKOnly, "Chyba"
End If
End Sub
Private Sub File1_Click()
Image1.Stretch = True
Image1.Picture = LoadPicture(File1.Path & "\" & File1.FileName)
Label1.Caption = File1.Path & "\" & File1.FileName
End Sub
Private Sub Form_Load()
File1.Pattern = "*.jpg; *.gif; *.bmp; *.dib; *.wmf"<
Label1.Caption = File1.Path & "\" & File1.FileName
End Sub
Zde je tedy ukázka drobné opravy chyby, která se
v předchozím kódu vyskytovala. Číslo chyby při vytváření programu můžeme
zachycovat do nějaké proměnné z objektu Err třeba takto:
Chyba = Err.Number.
Proměnnou pak můžeme třeba vytisknout na formulář.
Ještě než zakončím tuto kapitolu, řeknu vám, jak opravit chyby CommonDialogu
Private Sub Command1_Click()
On Error GoTo error
CommonDialog1.ShowOpen
Image1.Picture = LoadPicture(CommonDialog1.FileName)
error:
If Err.Number = 481 Then
MsgBox "Špatný typ souboru"
End If
End Sub
To je příklad, jak dosáhnout toho, že špatný soubor, ve kterém je chyba nebo špatně vybraný soubor s jinou příponou, neodstaví celý program.
Myslím, že ohledně chyb toho bylo až moc, tak pojďme dál.
9.3 Barvy
Máme několik možností, jak barvy zadávat.
První je použití RGB, je jednoduché a nevyžaduje znalost 16kové soustavy. Každá barva má hodnotu od 0 až do 255, její zadání je velmi jednoduché, vypadá takto:
Form2.BackColor = RGB(50, 100, 150)
První je hodnota červené, čím je hodnota vyšší, tím větší je podíl barvy v barvě výsledné. Pak následuje barva zelená a modrá.
Druhou možností je zadávaní pomocí 16kové soustavy, je to celkem jednoduché, od desítky do patnáctky se místo čísel používají písmena A až F. 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. To je 16 hodnot. F je hodnota nejvyšší.
Form2.BackColor = &H66FFFF
Zde jsou ale barvy převrácené, první je hodnota modré, druhé dvojčíslí je hodnota zelené a třetí je hodnota červené.
To by bylo něco málo ohledně barev. Těmi se časem ale budeme zabývat velmi podrobně. Pří výrobě editoru fotek, ke kterému se postupně probojujeme přes mnohá úskalí jazyka VB
9.4 Datum a čas
Čas a datum, která aplikace by se bez něj jen mohla obejít, vždyť i onen jednoduchý poznámkový blok nám umožňuje vložit do textu čas nebo datum. Tady máte něco málo jak získat různé časové údaje, kód je velmi jednoduchý, takže by neměl být problém to z něj pochopit.
Private Sub Command1_Click()
Print "Čas " & Time
Print "Hodina " & Hour(Time) & " Minuta " & Minute(Time) _
& " Sekunda " & Second(Time)
Print "Datum " & Date
Print "Den: " & Day(Date) & " Měsíc: " & Month(Date) & "
Rok: " & Year(Date)
Print "Pořadové číslo dne v týdnu " & Weekday(Date)
End Sub
Podobně můžete tyto hodnoty zapisovat do proměnných třeba takto:
Dim čas As Date
Dim minuty As Byte
Private Sub Command1_Click()
čas = Time
minuty = minute(čas)
Print minuty
'zkráceně
Print minute(Time)
End Sub
Tak to by bylo to základní ohledně času, a pokud chcete čas zobrazovat ve vašem programu stále aktuální, tak jej musíte každou vteřinu nebo minutu obnovit, na to je vhodný Timer. Kód pak může vypadat třeba takto:
Private Sub Form_Load()
Timer1.Interval = 1000
End Sub
Private Sub Timer1_Timer()<
Text1.Text = Time
End Sub
Můžete ale zobrazovat třeba jen hodiny a minuty takto:
Ale kdepak - nic už vám neřeknu, to bude domácí úkol.
9.5 PopupMenu.
PopupMenu se nebojte, není to žádné nebezpečné vyskakovací okno. Pokud nevíte, jak to vypadá, tak ve vašem prohlížeči klikněte pravým tlačítkem a to, co se vám zobrazí, to je ono. Vytváří se v menu editoru stejně jako menu normální, ale jeho vlastnost. Tak si vytvoříme menu, jehož horní položka se bude jmenovat mnuNabídka a bude obsahovat položky s názvy mnuVlozit, mnuKopírovat a mnuVyjmout.
Takto bude vypadat základní zobrazení menu:
Form2.PopupMenu mnuNabidka
Můžeme použít i umístění na formuláři takto:
Form2.PopupMenu mnuNabidka, , 100, 100
Menu bude 100 twipů na výšku a 100 twipů na délku vzdáleno od rohu formuláře. A ještě můžeme vybrat defaultní (předvybranou) položku takto:
Form2.PopupMenu mnuNabidka, , 100, 100, mnuKopirovat
Nápis mnuKopírovat bude vyznačen tučně.
Zatím sice nevíte, jak použít pravé tlačítko myši, ale to nevadí, protože to zjistíte v další lekci.
9.6 Domácí úkol
Ano, milí přátelé, už je tady náš a váš domácí úkol: Vaším úkolem bude vytvoření prohlížeče obrázků, který bude obrázky načítat pomocí CommonDialogu. Bude, jak už jsem sliboval, zobrazovat i hodiny, které ukazují pouze hodiny a minuty (ne vteřiny). Všechny chybičky se pokusíte vychytat. PopupMenu nechám až na úkol v příští lekci. No tak to by mohlo stačit, ale nestačí. Ještě se po startu programu změní barvy prvků. A to tak, jak jsem psal, pokuste se využít obě metody. Zkuste udělat použitelné uživatelské rozhraní.
9.7 V další lekci
Původně jsem sliboval ještě reakce na kliknutí a stisknutí kláves, ale pro nečekaně velký obsah této lekce se veselí nekoná, a toto téma přesouvám do další lekce, ve které se budu zabývat poli a kolekcemi. Pokud se zase tak nerozepíšu, řeknu vám i něco o používání CommonDialogu na ukládání.