10.1 Reakce na kliknutí myší
10.2 Reakce na zmáčknutí klávesy
10.3 Kolekce prvků a Tagy
10.4 Pole jednorozměrná
10.5 Pole vícerozměrná
10.6 Dynamická pole
10.7 CommonDialog
10.8 Domácí úkol
10.9 V další lekci...
10.1 Reakce na kliknutí myší (tohle je jubilejní, 10 lekce:))
Dost často potřebujete zjistit, na jaké tlačítko myši uživatel kliknul. Pro každé tlačítko potřebujete napsat jinou funkci. Tam musíte rozlišit, na které tlačítko jste klikli. Je nejlepší použít procedury MouseDown, Click, MouseUp, DoubleClick nebo MouseMove.
Zde je ukázka funkce Click a MouseDown:
Private Sub Command1_Click()
End Sub
Private Sub Command1_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
End Sub
Funkce MouseDown nám na rozdíl od funkce Click předává i nějaké hodnoty, a to jsou hodnoty Button, ta nám předává číslo stisknutého tlačítka myši, dále Shift, ta nám říká, jestli byl při stisknutí tlačítka zmáčknut i Shift, a hodnoty X a Y nám udávají pozici kurzoru. V tom je velká výhoda a také použitelnost při stisknutí jiných tlačítek než jen levého. Kód může vypadat třeba takto:
Private Sub Command1_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button = 1 Then Print "levé talčítko"
If Button = 2 Then Print "pravé talčítko"
End Sub
Tady je velmi jednoduchý kód jako ukázka využití:
Private Sub Command1_MouseDown(Button As Integer, _
Shift As Integer, X As Single, Y As Single)
If Button = 1 Then End
If Button = 2 Then Form1.PopupMenu aaa
End Sub
Ale musíte si vytvořit menu. A pokud na tlačítko kliknete levým tlačítkem, tak se program vypne, a pokud na něj kliknete pravým, tak se vyroluje Popup Menu. První (pouze první) položku v menu musíte nastavit na Visible = False (to se dělá v dialogu pro vytváření menu).
Hodnota
Tlačítko
1
levé
2
pravé
3
pravé + levé
4
střední
5
levé + střední
6
pravé + střední
7
levé + pravé + střední
Kombinace se dají používat pouze u metody MouseMove při pohybu myší. Vhodné je psát si pro každé tlačítko funkce a pouze je volat, zpřehledňuje to kód.
10.2 Reakce na zmáčknutí klávesy
Po myši následuje klávesnice, pokud byste chtěli tvořit nějakou hru, tak je to velmi podstatné, ale využití to najde i jako ovládání různých programů. Můžeme využívat těchto procedur:
Private Sub Form_KeyDown(KeyCode As Integer, _
Shift As Integer)
End Sub
Private Sub Form_KeyPress(KeyAscii As Integer)
End Sub
Private Sub Form_KeyUp(KeyCode As Integer, _
Shift As Integer)
End Sub
Ty nám předávají pro nás podstatný kód Ascii, podle kterého rozlišíme, jaká klávesa byla zmáčknuta, případně můžeme využít i kontroly stisknutého Shiftu. Ukázka funkčnosti:
Private Sub Form_KeyDown(KeyCode As Integer, _
Shift As Integer)
Print Chr(KeyCode)
End Sub
Nebo:
Private Sub Form_KeyDown(KeyCode As Integer, Shift _
As Integer)
If KeyCode = 87 Then Shape1.Top = Shape1.Top - 500
If KeyCode = 65 Then Shape1.Left = Shape1.Left - 500
If KeyCode = 83 Then Shape1.Top = Shape1.Top + 500
If KeyCode = 68 Then Shape1.Left = Shape1.Left + 500
Print KeyCode
End Sub
Ale nevkládejte na formulář nic jiného než prvek Shape. Jinak tento kód bude nefunkční. To kódy nejsou v praxi příliš využívané, jsou tu proto, abyste věděli, že jsou. Toto není příliš důležité. Kousek využití si ukážeme ještě v takové legraci v příští lekci.
10.3 Kolekce prvků a Tagy
No tohle je teprve téma více méně také jen takové nedůležité, ale někdy se může hodit. Je to práce s kolekcemi prvků. Pokud tedy chcete posunout nebo upravit nějaké objekty najednou, nemusíte je dělat po jednom, ale upravíte celou kolekci. Pokud tedy chcete, můžete třeba při změně barvy pozadí změnit zároveň i barvu tlačítek. Všechny prvky na jednom formuláři jsou členy jedné skupiny, ta se nazývá kolekce Controls. Vytváří se hned při vytvoření nového formuláře a počet obsažených prvků je závislý na počtu vložených prvků. Pro každý formulář je jedna kolekce Controls, a proto musíme zapisovat jména formulářů podle toho, s jakou kolekcí chceme pracovat. Pokud chceme pracovat s jedním prvkem kolekce, můžeme to zapsat takto:
Private Sub Form_Load()
Form1.Controls!Label1.Caption = "ahoj"
End Sub
Vykřičník přiřazuje objekt ke kolekci. S prvkem můžeme pracovat i podle indexu. Prvky se indexují pozpátku, to znamená, že naposledy vložený prvek má index 0, předposlední 1 a tak dál.
Private Sub Form_Load()
Form1.Controls(1).Caption = "ahoj"
End Sub
Pokud ale chceme pracovat s celou skupinou, využíváme cyklu For Each Next. Ještě než použijete následující kód, tak si na formulář vložte alespoň 10 objektů. Kód pak může vypadat například takto:
Private Sub Command2_Click()
For Each objekty In Form1.Controls
objekty.Left = objekty.Left + 50
Next objekty
End Sub
Takto se pracuje se všemi prvky, pokud ale prvky nechcete upravit všechny, ale třeba tři vynechat, tak se používají Tagy (záložky). Pokud tedy nechceme pohnout třeba tlačítkem, kterým ostatní prvky přesouváme, napíšeme do jeho vlastnosti Tag text NEPOHYBOVAT. A použijeme následující kód, což má za následek, že Command2 se nám nebude pohybovat.
Private Sub Command2_Click()
For Each Objekty In Form1.Controls
If Objekty.Tag <> "NEPOHYBOVAT" Then
Objekty.Left = Objekty.Left + 50
End If
Next Objekty
End Sub
Na ukázku ještě jeden kód:
Private Sub Command2_Click()
For Each Objekty In Form1.Controls
If Objekty.Tag <> "NEPOHYBOVAT" Then
If Objekty.Tag = "OPACNE" Then
Objekty.Left = Objekty.Left - 50
Else
Objekty.Left = Objekty.Left + 50
End If
End If
Next Objekty
End Sub
Ještě než kód použijete, dejte některému prvku do hodnoty Tag text OPACNE. Tak to by bylo ke kolekcím, doufám, že vám to stačí.
10.4 Pole jednorozměrná
Pole, pole ano, ano, to je velmi důležitá kapitola. Pole umožňují ukládat data. Zatím se budeme zabývat jednorozměrnými poli. Pokud si třeba chceme uložit několik výsledků nebo nějakých čísel či jiných záznamů do paměti programu, můžete využít pole. S poli se dá pracovat i v cyklech. Jejich další výhodou je schopnost pojmout obrovské množství dat. Kdyby neexistovala pole, museli bychom používat kvanta proměnných, jež by zhoršovala přehlednost kódu a kód by byl neskutečně rozsáhlý. Dají se tedy používat pro ukládání při cyklických výpočtech. Pole můžeme definovat takto:
Deklarace jednorozměrného pole může vypadat třeba takto:
Public SerioveCislo(400) As Integer
Public je deklarace globálního pole, SerioveCislo je název pole, číslo 400 nám určuje maximální počet pomyslných buněk s daty a As Integer nám říká, jakého typu musí být obsažená data. Takto deklarujte pole do modulu. Pokud chcete pole deklarovat do formuláře, deklarujte takto:
Dim SerioveCislo(400) As Integer
Stručně si můžete jednorozměrné pole představit jako jednořádkovou tabulku a každá její buňka může obsahovat data.
Jak se z pole čte a jak se do něj ukládá. Práce je to velmi jednoduchá, do pole uložíte nebo přečtete data tak, že využijete názvu pole a čísla pomyslné buňky, která data bude obsahovat nebo již obsahuje:
Private Sub Command1_Click()
SerioveCislo(0) = 53612
SerioveCislo(1) = 53659
SerioveCislo(2) = 53769
SerioveCislo(3) = 53169
For i = 0 To 400
If SerioveCislo(i) = 0 Then Exit For
Print SerioveCislo(i)
Next i
End Sub
Další ukázka je bez odchytávání chyb, jen pro názornou ukázku využití pole.
Private Sub Command1_Click()
For i = 0 To 400
SerioveCislo(i) = InputBox("Zadejte sériové číslo výroby " _ & i, "Sériová čísla")
If MsgBox("Chcete zadat další sériové číslo?" _
,vbYesNo, "???") = 7 Then Exit For
Next i
For i = 0 To 400
If SerioveCislo(i) = 0 Then Exit For
Print SerioveCislo(i)
Next i
End Sub
10.5 Pole vícerozměrná
Pole mohou mít i několik rozměrů, dvojrozměrné pole si můžeme představit třeba jako tabulku s několika řádky a s několika sloupci. A opět každá z buněk může obsahovat data. Práce s ním pak může vypadat třeba takto:
Dim ceny(15, 2) As Integer
Private Sub Command1_Click()
ceny(5, 2) = 92
End Sub
Nezapomínejte, že v Basicu, pokud je pole deklarováno jen jedním rozměrem, se začíná vždy od nuly a ne od jedničky.
Pokud je pole deklarováno takto: Dim Ceny(1 To 15) As ... , pak začíná opravdu od 1 do 15.
Ještě si ukážeme, jak se toto pole dá využít v praxi:
Dim ceny(15, 2) As Integer
Private Sub Command1_Click()
For i = 0 To 15
ceny(i, 0) = InputBox("zadejte _
cenu", "Ceny")
Next i
For i = 0 To 15
ceny(i, 1) = (ceny(i, 0) + ((ceny(i, _
0) / 100) * 22))
Next i
For i = 0 To 15
ceny(i, 2) = (ceny(i, 0) * 22) / 100
Next i
For i = 0 To 15
Print "bez Dph" & ceny(i, 0) _
& " S dph" & _
ceny(i, 1) & " dph" _
& ceny(i, 2)
Next i
End Sub
Rozměrů pole se dá využít daleko víc, třeba tři, čtyři a tak dál. Pokud by vás nenapadlo, jak to použít, tak je mnoho různých možností. Třeba při tvorbě kalendářů. Víc rozměrů umožňuje jednodušší správu dat.
10.6 Dynamická poleDynamická pole jsou taková, jejichž velikost volíme až při běhu programu, jednoduchý příklad může vypadat třeba takto:
Dim ceny() As Variant
Dim rdm As Integer
Private Sub Command1_Click()
rdm = (Val(InputBox("Zadejte počet výrobků", _
"??")))
ReDim ceny(rdm)
For i = 1 To rdm
ceny(i) = InputBox("Zadejte cenu výrobku číslo" _
& i)
Next i
For i = 1 To rdm
Print ceny(i)
Next i
End Sub
Příkaz ReDim je vlastně dodatečné určení velikosti pole. Zbytek je snad pochopitelný, pokud ne, je zde poradna. Dynamickými poli tedy pole zakončím a jdeme dál.
10.7 CommonDialog
Minule jsem říkal, že pokud se příliš nerozepíšu, tak se budu věnovat i CommonDialogu pro ukládání, ale přestože jsem se až zas tak moc nerozepsal, nechám to na jindy. Jsou věcí, které jsou potřeba probrat předtím.
10.8 Domácí úkol
Za domácí úkol bude program, který bude pracovat s dvojrozměrným polem, do kterého budeme moci ukládat a ze kterého budeme moci číst pomocí jednoho TextBoxu a několika tlačítek, jimiž se budeme po poli pohybovat. A program budeme moci ovládat pomocí Popup Menu (např. vypnutí a možnost změnit barvu pozadí všech tlačítek najednou.)
10.9 V další lekci probereme:
Funkce Line, Circle a Pset. Objekty Shape a Line a metoda Drag and Drop.