cool web a perfektni rs- Doporucuji

Thursday, May 31, 2007

Zobrazování zpráv

(o stavu financí)
Protože už teď hráč do automatu něco dává a máme jakous takous evidenci o tom, jak si v daném okamžiku
stojí, můžeme mu poskytnout možnost, aby si kdykoli zobrazil, kolik vyhrává, resp. kolik prohrává.
Naprogramujeme proto událostní proceduru Click tlačítka s nápisem Vypsat stav:
Public Sub btnStav_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles btnStav.Click
If StavCelkem > 0 Then
MessageBox.Show("Vyhráváte: " & FormatCurrency(StavCelkem), _
"Informace o stavu financí", _
Messagebox.IconExclamation + Messagebox.OK)
Else
MessageBox.Show("Zatím Vás to stálo: " & FormatCurrency(-StavCelkem), _
"Informace o stavu financí", _
Messagebox.IconInformation)
End If
End Sub
Pro výpis jednoduchých zpráv uživateli v dialogovém okně se využívá třída MessageBox pojmenovaného
prostoru System.WinForms. Zpráva se zobrazuje její metodou Show, v níž první parametr udává nápis
v okně, druhý nápis v titulkovém pruhu a třetí různé informace o tom, jaká tlačítka v dialogovém okně budou,
jaká tam bude ikona a jaké tlačítko bude výchozí. Tyto informace se specifikují pomocí polí třídy MessageBox.
V souvislosti se zobrazováním zpráv si můžete vyzkoušet další rys Visual Basicu, totiž podporu tzv. pojmenovaných
parametrů. Má-li metoda hodně parametrů, a vy přitom ve volání chcete uvést jen několik (pro
ostatní chcete ponechat výchozí hodnoty), můžete parametry specifikovat tak, že uvedete název parametru,
speciální operátor := (dvojtečka a rovná se) a hodnotu parametru. Výhody jsou zřejmé. Parametry můžete
uvést v libovolném pořadí a jen ty, které opravdu potřebujete. Například, obrázek o stavu financí byste mohli
zobrazit také tímto příkazem:
MessageBox.Show(caption:="Informace o stavu financí", _
text:="Vyhráváte: " & FormatCurrency(StavCelkem))
Názvy parametrů se dozvíte přímo při zápisu volání metody z pomocného okénka, v němž se zobrazuje
kompletní syntax metody.
Až budete později řešit formulář parametrů, ukážeme si, jak pracovat v situacích, kdy je v dialogovém
okně více než jedno tlačítko a je třeba zjistit, na kterém z nich uživatel klepl (a podle toho rozvětvit další běh
programu).

Labels:

Wednesday, May 30, 2007

VB6.

Barvy se nyní nastavují prostřednictvím struktury Color pojmenovaného prostoru System.
Drawing. Jestliže se vám stýská po funkcích RGB nebo QBColor, najdete je
v pojmenovaném kompatibilním prostoru Microsoft.VisualBasic.Compatibility.
VB6.Information.
Námět na procvičování. Chcete-li uživateli dopřát, aby si mohl sám určovat barvy některých ovládacích
prvků, zobrazte mu společné dialogové okno Barva. Jak se volají společná dialogová okna Windows se dozvíte
na konci této brožury, v oddílu „Využití společných dialogových oken Windows“.

Labels:

Sunday, May 27, 2007

Námět na procvičování.

Zkuste snížit počet volání konverzních funkcí v kódu vypisovaném zde i jinde
v brožuře (například pomocí vhodných pomocných proměnných).
Nastavení barvy textu v ovládacím prvku
Další drobné zobecnění bude spočívat v tom, že pokud bude kredit vyšší, než počáteční (hráč vyhrává),
zůstane hodnota kreditu v původní barvě, bude-li prohrávat, decentně ho na to upozorníme tím, že hodnotu
zobrazíme jinou barvou (odstín růžové barvy).
1. Do deklarační sekce třídy formuláře přidejte deklaraci:
Private PočátečníBarvaKreditu As System.Drawing.Color
2. Na konec událostní procedury tlačítka Roztočit přidejte tuto rozhodovací konstrukci:
If CInt(lblKredit.Text) < PočátečníKredit Then
lblKredit.Forecolor = System.Drawing.Color.RosyBrown
Else
lblKredit.Forecolor = PočátečníBarvaKreditu
End If
Barva popředí (inkoust) se tedy nastavuje prostřednictvím vlastnosti ForeColor, obdobně barva pozadí
prostřednictvím vlastnosti BackColor. Většinou se barvy nastavují vizuálně v okně vlastností.

Labels:

Evidence vsazených částek a celkové výše výher

Další modifikace budou spočívat v tom, že nebudeme jen počítat, kolikrát uživatel vyhrál, ale přiblížíme
se trochu realitě tím, že budeme předpokládat, že hráč dá na začátku „do banku“ nějaký obnos, budeme mu
říkat třeba kredit a stanoví, jak velkou jeho část vsadí při každém roztočení kola štěstí. V tomto oddílu nastavíme
počáteční kredit a velikost sázky „natvrdo“, později tyto hodnoty bude moci hráč zadávat na samostatném
formuláři parametrů. Kromě toho si hlavní formulář připravíme pro další modifikace. Postup:
1. Do deklarační sekce třídy formuláře přidejte deklarace pomocných proměnných:
Private PočátečníKredit, StavCelkem As Integer
2. Do konstruktoru třídy formuláře (pod ‘TODO) přidejte příkazy, jimiž „natvrdo“ nastavíte počáteční
hodnoty kreditu a sázky:
PočátečníKredit = 1000
lblKredit.Text = CStr(PočátečníKredit)
lblSázka.Text = "10"
3. Doplňte konstrukci zjišťující, zda uživatel vyhrál (viz předchozí oddíl) o příkazy, jimiž se bude
evidovat, jak si hráč stojí:
If strVyhrál = "NE" Then
' Nevyhrál, zmizí obrázek, sníží se kredit, aktualizuje se průběžný stav
picVýhra.Image = Nothing
lblKredit.Text = CStr(CInt(lblKredit.Text) - CInt(lblSázka.text))
StavCelkem -= CInt(lblSázka.Text)
Else
PočetVýher += 1
lblPočetVýher.Text = CStr(PočetVýher)
Beep()
' Vyhrál, podle druhu výhry se zobrazí patřičný obrázek
Select Case strVyhrál
Case "DVESTEJNE"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Money.wmf")
VýšeVýhry = CInt(CDbl(lblSázka.Text) / 10)
Case "POSTUPKA"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\dollars.wmf")
VýšeVýhry = CInt(CDbl(lblSázka.Text) * 10)
Case "HLAVNI"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Moneybag.wmf")
VýšeVýhry = CInt(CDbl(lblSázka.Text) * 20)
Case Else
' Sem se to nemá nikdy dostat
End SelectlblKredit.Text = CStr(CInt(lblKredit.Text) + VýšeVýhry)
StavCelkem += VýšeVýhry
picVýhra.Visible = True
End If
Spočetli jsme si pravděpodobnosti výher a rozhodli jsme se, dejme tomu, že vylosuje-li hráč dvojici stejných
číslic, vyhraje desetinu vsazené částky; při postupce vyhraje desetinásobek a při trojici stejných čísel
dvacetinásobek.
Proměnnou StavCelkem využijeme později k celkové evidenci, protože hráči umožníme strkat do automatu
další prachy, kdykoli to uzná za vhodné. Umožníme mu také, aby mohl pokračovat ve hře, až se mu
kredit vyčerpá (tuto skutečnost mu oznámíme automaticky a zobrazíme formulář, v němž bude moci vložit
další kredit, změnit výši sázky a jiné vstupní parametry). Viz oddíl „Formulář parametrů“ později.

Labels:

Friday, May 25, 2007

Konstrukce

se používá v případech, kdy potřebujete program rozčlenit na více než dvě větve. Kritérium,
uvedené za Select Case se pak rozškatulkovává na jednotlivé případy (Case). Vykonají se příkazy toho
případu (větve), který odpovídá zadanému kritériu. Příkazy ve větvi Case Else se vykonají tehdy, když „nezabere“
ani jedna z ostatních větví. Měla by se uvádět vždy, když ostatní větve nevyčerpají všechny situace,
které mohou nastat.. Alespoň po dobu ladění byste si do ní měli dál nějaké pomocné výpisy, kdyby se přes
všechna očekávání program do ní dostal. Pomohlo by vám to asi odhalit příčinu (přinejmenším byste věděli,
že v tomto místě už program běží špatně).
Náměty na procvičování. Rozlište velikost obrázků výher podle výše výher (pro malou výhru obrázek
malý, pro větší výhru obrázek větší). Zkuste alespoň dvě varianty: měnit při běhu rozměry ovládacího prvku
PictureBox podle výše výhry nebo umístit do návrhu pro každý typ výhry samostatný ovládací prvek PictureBox
a podle druhu výhry vždy „zviditelnit“ patřičný objekt.

Labels:

Wednesday, May 23, 2007

Různé obrázky pro různé výhry

Zatím jste hráče „odměňovali“ bez ohledu na výši výhry-tím, že jste zobrazovali stále stejný obrázek. Teď
automat rozvineme tak, že se pro každý druh výhry zobrazí jiný obrázek. Úloha zároveň poslouží k ukázce
druhé základní rozhodovací konstrukce Visual Basicu, totiž Select Case.
Původně jsme úlohu řešili tak, že jsme obrázek „natáhli“ metodou FromFile třídy Image pojmenovaného
prostoru System.WinForms a jeho zobrazování či skrývání jsme vyřešili nastavováním vlastnosti Visible
na True resp. False. Protože teď máme v jediném ovládacím prvku PictureBox zobrazovat tři obrázky,
musíme kód poněkud modifikovat. Postup následuje.
1. Z konstruktoru třídy formuláře převeďte na komentář (nebo odstraňte) prvotní přiřazení obrázku
(příkaz pod řádkem ‘TODO ve vygenerovaném kódu formuláře).
2. V událostní proceduře tlačítka s nápisem Roztočit nahraďte konstrukci, která zjišťuje, zda uživatel
vyhrál, touto:
If strVyhrál = "NE" Then
' Nevyhrál, zmizí obrázek
picVýhra.Image = Nothing
Else
' Vyhrál
PočetVýher += 1
lblPočetVýher.Text = CStr(PočetVýher)
Beep()
' Podle druhu výhry se přiřadí patřičný obrázek
Select Case strVyhrál
Case "DVESTEJNE"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Money.wmf")
Case "POSTUPKA"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\dollars.wmf")
Case "HLAVNI"
picVýhra.Image = Image.FromFile(Application.StartupPath & "\Moneybag.wmf")
Case Else
' Sem se to nemá nikdy dostat
End Select
picVýhra.Visible = True
End If

Labels:

Tuesday, May 22, 2007

i takto:

strVyhrál = Vyhral(Trojice)
Při zápisu kódu, jímž voláte své přetížené procedury, uvidíte podobnou pomůcku, jakou jste viděli pro vestavěnou
funkci Int na obrázku v oddílu „Vylosování čísel“ výše.
VB6. Přetěžování dříve takto provádět nešlo. Kódu z předchozích verzí se ale tato schopnost
týká v jiných důležitých situacích, například když ve svých programech voláte funkce API
s parametry typu As Any. Tato fráze se už nepodporuje a definice procedur budete muset
změnit. Řešení nabízejí právě přetěžované funkce. Místo jedné deklarace napíšete několik,
každou pro jeden z datových typů.
Dříve jste se také v kódu setkávali se dvěma alternativami některých funkcí pracujících
s řetězci. Jedna alternativa funkce měla „normální“ název a vracela Variant, název druhé
končil na znak $ (dolar) a vracela String. Nyní se jedná o jedinou přetíženou funkci, proto
se podporuje jen jediný název(bez dolaru).

Labels:

Sunday, May 20, 2007

Přetížené mohou být i konstruktory instance nebo vlastnosti ve třídě. Modifikovaný
zápis funkce Vyhral vypadá takto:
Public Overloads Function Vyhral(ByVal strCislo As String) As String
' Původní varianta funkce
End Function
Public Overloads Function Vyhral(ByVal Cisla() As Integer) As String
Dim i, j, intCislo As Integer
Vyhral = "NE"
' První cyklus se upraví
For i = 0 To UBound(Cisla)
For j = i + 1 To UBound(Cisla)
If Cisla(i) = Cisla(j) Then
Vyhral = "DVESTEJNE"
Exit Function
End If
Next j
Next i
' Spočte se trojciferný ekvivalent číslic
intCislo = Cisla(0) * 100 + Cisla(1) * 10 + cisla(2)
' Zbytek funkce je stejný jako v původní variantě
End Function
Za předpokladu, že jsou deklarované potřebné proměnné:
Dim strCislo, strVyhrál As String
Dim Trojice(3) As Integer
můžete naši funkci volat takto
strVyhrál = Vyhral(strCislo)

Saturday, May 19, 2007

Řešení při předání pole číslic

- jako přetíženou funkci
Patrně vás napadlo, že by se funkce dala zjednodušit, kdyby se jednotlivé číslice uložily do celočíselného
pole. V tomto případě možná. Může se ale stát, že budete řešit více úloh, v nichž budou kritéria pro losování
čísel velmi odlišná. Pak byste si možná chtěli programování jednotlivých algoritmů usnadnit (či urychlit) tím,
že vstupní hodnoty předáte uložené tak, jak to bude pro řešený algoritmus nejvýhodnější.
Ve Visual Basic.NET už nemusíte psát procedury s různými názvy, pokud se liší pouze datovými typy
předávaných parametrů. Napíšete potřebný počet variant funkce se stejným názvem, ale do záhlaví funkce
přidáte klíčové slovo overloads.

Wednesday, May 16, 2007

' Zde se předpokládá nějaký příkaz pracující s proměnnou j
tak ve Visual Basicu 6.0 kód projde, protože proměnná j je známá (obor je vždy alespoň
úrovně procedury). Ve Visual Basic.NET se zobrazí seznam úloh (Task List) s řádkem, který
sdělí, že „název j není deklarovaný“.
Proměnná j má obor úrovně bloku, takže mimo blok cyklu přes i není známá. Doba života
proměnné j je však procedura, takže vstoupíte-li do daného bloku vícekrát po dobu života
procedury, musíte dávat pozor na to, aby byla taková proměnná vždy správně inicializovaná.

Tuesday, May 15, 2007

Kód této funkce upozorňuje na některé další varianty cyklu For – Next. Přírůstek cyklu (daný klíčovým
slovem Step nemusí být kladný (viz třetí cyklus shora) a nemusí být ani celočíselný. Příkaz Exit umožňuje
vyskočit okamžitě z cyklu (nebo z procedury). Poslední část kódu ukazuje cyklus přes i, do něhož je vnořen
cyklus přes j. V příkazech Next jsou i resp. j volitelné, ale přispívají k srozumitelnosti kódu (vidíte okamžitě,
k jakému For daný Next patří).
Mid je jedna z funkcí Visual Basicu, které pracují s řetězci. Vybírá z řetězce uvedeného jako první parametr
od pozice dané druhým parametrem (pozice prvního znaku má pořadové číslo 1) počet znaků daných
třetím (volitelným) parametrem. Funkce Len vrací délku řetězce ve znacích.
VB6. Ve Visual Basic.NET je možno deklarovat proměnné s oborem úrovně bloku, což dříve
nešlo. Například, kdybychom poslední cyklus napsali takto:
For i = 1 To Len(strCislo)
Dim j As Integer
For j = i + 1 To Len(strCislo)
If Mid(strCislo, i, 1) = Mid(strCislo, j, 1) Then
Vyhral = "DVESTEJNE"
Exit Function
End If
Next j
Next i

Monday, May 14, 2007

Řešení při předání řetězce číslic

Zbývá napsat proceduru, která určí, zda uživatel vyhrál. Vyhraje malou výhru, budou-li dvě číslice stejné,
daleko větší výhru budou-li všechny číslice za sebou (vzestupně nebo sestupně) a nejvíc vyhraje, budou-li
všechny tři číslice stejné. Funkce může vypadat například takto:
Public Function Vyhral(ByVal strCislo As String) As String
Dim i, j, intCislo As Integer
' Inicializace
Vyhral = "NE"
intCislo = CInt(strCislo)
' Všechny tři číslice stejné – hlavní výhra
For i = 0 To 999 Step 111
If intCislo = i Then
Vyhral = "HLAVNI"
Exit Function
End If
Next
' Postupka nahoru, velká výhra
For i = 12 To 789 Step 111
If intCislo = i Then
Vyhral = "POSTUPKA"
Exit Function
End If
Next
' Postupka dolů, také velká výhra
For i = 987 To 21 Step -111
If intCislo = i Then
Vyhral = "POSTUPKA"
Exit Function
End If
Next
' Dvě stejné, malá výhra
For i = 1 To Len(strCislo)
For j = i + 1 To Len(strCislo)
If Mid(strCislo, i, 1) = Mid(strCislo, j, 1) Then
Vyhral = "DVESTEJNE"
Exit Function
End If
Next j
Next i
End Function

Labels:

Sunday, May 13, 2007

Zjištění, zda uživatel vyhrál – skutečná kritéria

Skutečné podmínky našeho automatu, které budou určovat, zda uživatel vyhrál, soustředíme do další
funkce, kterou si napíšeme. Pojmenujeme ji třeba Vyhral. Její návratová hodnota bude dejme tomu řetězec,
který informuje o tom, zda a co vyhrál. Jestliže nevyhrál, vrátí funkce řetězec "NE". Rozhodnutí o výhře bude
proto v událostní proceduře tlačítka s nápisem Roztočit velmi jednoduché:
If Vyhral(strCislo) <> "NE" Then
PočetVýher += 1
picVýhra.Visible = True
lblPočetVýher.Text = CStr(PočetVýher)
Beep()
End If
Pokud vyhrál (porovnávací operátor <> znamená není rovno), zvýšíme počet výher o 1, zviditelníme obrázek
výhry a zobrazíme aktuální počet výher na formuláři tím, že počet převedený na řetězec zobrazíme
v odpovídajícím popisku. Nakonec pípneme.

Labels:

Saturday, May 12, 2007

VB6. FormatPercent

je jedna z vestavěných formátovacích funkcí Visual Basicu (nyní se
nacházejí v pojmenovaném prostoru Microsoft.VisualBasic). Umožňuje pohodlně formátovat
ve tvaru procent. Druhý parametr udává počet desetinných míst. Další obdobné funkce
jsou Format, FormatNumber, FormatCurrency a FormatDateTime.
Tyto formátovací funkce najdete také v kompatibilní knihovně Microsoft.VisualBasic.
Compatibility.VB6 .Strings, kam přešly také dva už nepodporované příkazy LSet a
RSet, které se dříve používaly k vyplnění řetězců na danou délku vpravo resp. vlevo. Místo
nich nyní volejte metody PadRight resp. PadLeft ze třídy String pojmenovaného prostoru
System.
Protože budeme měnit algoritmus, který určuje, zda uživatel vyhrál, zapamatujeme si vylosovaná čísla
dejme tomu jako trojčíslí ve tvaru řetězce:
For Each ctl In Panel1.controls
If TypeOf ctl Is Label Then
ctl.Text = VygenerovatPrirozeneCislo()
strCislo &= ctl.Text
End If
Next

Labels:

Thursday, May 10, 2007

Přidání evidence počtu pokusů a počtu výher

Pro účel evidence počtu pokusů a počtu výher si můžete definovat dvě pomocné proměnné na úrovni třídy.
Zařaďte do kódu třídy formuláře Form1 (Do konstrukce Public Class Form1 těsně nad první proceduru)
příkaz:
Dim PočetVýher, PočetPokusů As Integer
VB6. Na rozdíl od dřívějších deklaračních pravidel se obě proměnné deklarují jako Integer.
Dříve se první deklarovala jako Variant a jen druhá jako Integer. Mimochodem, datový
typ Variant už není, místo něho se používá obecný typ Object. A ani Integer není to, co
dříve. Odpovídá dřívější deklaraci Long a dřívějšímu typu Integer odpovídá nový datový
typ Short.
Na začátek událostní procedury tlačítka s nápisem Roztočit přidáme potřebné deklarace, připočteme jedničku
k počitadlu počtu pokusů a přiřadíme počet pokusů a procentové vyjádření úspěšnosti do vlastností
Text odpovídajících popisků.
Dim i As Integer
Dim strCislo As String
PočetPokusů += 1
lblPočetPokusů.Text = CStr(PočetPokusů)
lblPočetPokusůVProcentech.Text = FormatPercent(PočetVýher / PočetPokusů, 2)
V třetím řádku shora se využívá nový operátor, který kombinuje přičtení hodnoty a uložení do proměnné
na levé straně. Obdobné operátory jsou k dispozici i pro další základní operace: -=, *=, /=, \=, ^= a &=.

Labels:

Wednesday, May 09, 2007

Rozšíření prototypu

Přidáním statistických informací začneme první rozšíření prototypu aplikace. Postupujte takto:
1. Přidejte na formulář popisné objekty typu Label. Nastavte jejich vlastnosti Text na nápisy (Kredit:,
Sázka:, Výher:, Pokusů: a V procentech:). Nastavte jejich vlastnosti Font na tučné písmo velikosti
10.
2. Vpravo od všech těchto popisků se nacházejí další, stejně naformátované popisky. Pojmenujte je
lblKredit, lblSázka, LblPočetVýher, lblPočetPokusů a lblPočetPokusůVProcentech.
3. Jejich písmo nastavte jako u popisků obsahujících nápisy. Hodnotu vlastnosti Text odstraňte nebo
uveďte nulu. Počáteční hodnoty můžete také nastavit při běhu na místě, kde přiřazujete výchozí
hodnoty ovládacím prvkům ( pod řádek TODO ve vygenerovaném kódu formuláře).
4. Vyberte vždy popisek nápisu a popisek obsahující statistiku vpravo od něj a naformátujte je pomocí
příkazů v nabídce Format. Na předchozím obrázku byly například u sdružených dvojic odstraněny
vodorovné rozestupy. Přehled příkazů z nabídky Format viz oddíl „Formátování více
ovládacích prvků současně“ výše.

Labels:

Tuesday, May 08, 2007

Otestování prototypu

Do formuláře se dostalo poměrně dost kódu a je nejvyšší čas, zase prototyp otestovat (v podstatě jste to
už měli několikrát zkusit). Přitom se může stát, že přehlédnete některá upozornění, která poskytuje editor kódu
v podobě modrých vlnovek nebo nevíte, jak chybný zápis odstranit, a přesto se pokusíte aplikaci vybudovat.
V takovém případě se seznámíte s další novinkou, je to okno seznamu úloh (Task List).
Určité informace o chybách najdete také ve výstupním okně (Output), které vidíte v dolní části obrázku
na příští straně. Z obsahu okna seznamu úloh je zřejmé, že musíte vyřešit dvě úlohy. Jednak jste uvedli omylem
vlastnost Caption (nyní je to vlastnost Text), druhou chybou je zřejmě překlep v názvu objektu.
Každý řádek v seznamu úloh obsahuje jistý druh vysvětlení, v čem je příčina chyby. Klepnete-li na ikonu
vlevo od vysvětlujícího textu, skočíte v kódu na místo, kde se tato chyba vyskytla a chybná část příkazu se
vybere (vidíte to těsně nad horní stranou okna seznamu úloh).
Seznam úloh toho umí o mnoho víc, výklad však sahá mimo rámec této brožury. Další informace si vyhledejte
například pod heslem „Task List Window“ v nápovědě MSDN Visual Studia NET.
Až se vám podaří aplikaci spustit, měla by vypadat zhruba takto:
Navíc jsou na obrázku určité statistické údaje a popisky připravené pro skutečné vyčíslení sázek a výše
výher. Tím se budeme zabývat v příštích oddílech.

seskupení ovládacích prvků do skupiny

Ovládací prvky se shromažďují do skupin především proto, že se pak s jednotlivými prvky pohodlněji
pracuje. Například je možné přesouvat všechny ovládací prvky skupiny najednou tak, že se přemístí jejich
kontejner. Usnadníte si také procházení všech prvků takto definované podmnožiny ovládacích prvků.
Chcete-li nějaké ovládací prvky seskupit, umístěte je do ovládacího prvku GroupBox nebo Panel. Oba
ovládací prvky jsou velmi podobné. Základní rozdíl spočívá v tom, že GroupBox má výchozí viditelné ohraničení
a můžete u něj zadat titulek, kdežto Panel má výchozí vzhled "neviditelný" a titulek v něm uvádět nemůžete.
V naší brožuře si ukážeme využití ovládacího prvku Panel. Postupujte takto:
1. Klepněte v soupravě nástrojů na ovládací prvek Panel a vymezte pro něj obdélník na formuláři.
2. Nakreslete do jeho vnitřku ovládací prvky, které v něm chcete mít.
3. Chcete-li mít panel viditelný, nastavte barvu pozadí (BackColor), případně obrázek na pozadí
(BackgroundImage) a styl okraje (BorderStyle).
4. Máte-li už na formuláři sestrojené ty ovládací prvky, které chcete zařadit do panelu, nejprve je
všechny vyberte (klepejte na nich při stisknuté klávese Shift) a vyjměte do schránky (Ctrl+X). Pak
vytvořte panel, vyberte ho (aby okolo něj byly úchyty v podobě malých čtverečků) a při vybraném
panelu prvky ze schránky vložte (Ctrl+V).
Pak můžete výše uvedené cykly upravit podle tohoto vzoru (předpokládá se, že jste ponechali výchozí název
panelu – Panel1):
For Each ctl In Panel1.controls
If TypeOf ctl Is Label Then
If ctl.Text = "1" Then
picVýhra.Visible = True
Beep()
End If
End If
Next
VB6: Ve VB6 se odpovídal ovládacímu prvku GroupBox zhruba ovládací prvek Frame nebo
se skupina vytvořila jako pole ovládacích prvků (control array), které se už také nepoužívá.
Viz oddíl „Procházení podmnožiny ovládacích prvků na formuláři“ výše.

Labels:

Sunday, May 06, 2007

TypeOf

Klíčové slovo TypeOf se používá v rozhodovacích konstrukcích ve tvaru TypeOf NázevObjektu Is
TypObjektu a umožňuje cyklovat přes ovládací prvky daného typu.
Potíže ovšem nastanou, budete-li později mít (což se dá čekat) na formuláři také jiné ovládací prvky typu
popisek (Label), protože do nich nechcete ani nic přiřazovat, ani je testovat. Jednou z možností, jak takovou
situaci řešit, je, že vložíte ovládací prvky, které chcete zpracovávat do kontejneru a uděláte z nich skupinu.
Visual Basic NET k tomuto účelu poskytuje dva základní ovládací prvky: GroupBox a Panel.

Labels:

Jak se to tedy vlastně má dělat?

Třeba tak, že využijete klíčové slovo TypeOf v součinnosti s kolekcí
Controls. Takže prvotní prototyp událostní procedury Click tlačítka s nápisem Roztočit (předpokládáme, že
uživatel vyhrál, pokud se vylosovala alespoň jedna jednička) může mít tento tvar:
Public Sub btnRoztočit_Click _
(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRoztočit.Click
Dim ctl As Control
picVýhra.Visible = False ' skryje obrázek z případné předchozí výhry
' vygeneruje náhodná čísla
For Each ctl In Controls
If TypeOf ctl Is Label Then
ctl.Text = VygenerovatPrirozeneCislo()
End If
Next
' Je-li alespoň jedna jednička, uživatel vyhrál
For Each ctl In controls
If TypeOf ctl Is Label Then
If ctl.Text = "1" Then
picVýhra.Visible = True ' zobrazí obrázek výhry
Beep() ' pípne
End If
End If
Next
End Sub
V několika posledních ukázkách kódu vidíte dvě ze tří konstrukcí cyklu, které jsou ve Visual Basicu
k dispozici (tím třetím jsou varianty příkazu Do). První z nich (For – Next) opakuje příkazy těla od dolní
meze po horní mez. Protože v těchto ukázkách není uveden přírůstek, předpokládá se 1. Další ukázky tohoto
druhu cyklu najdete v oddílu „Přidání evidence počtu pokusů a počtu výher“ ve výpisu funkce Vyhral.
Druhý typ cyklu For Each – Next se dá vyjádřit slovy „pro každý prvek v dané kolekci proveď příkazy
těla cyklu“. Controls je kolekce Visual Basicu všech ovládacích prvků na formuláři (v terminologii NET
Framework je to ale vlastnost třídy Control pojmenovaného prostoru System.WinForms a představuje odkaz
na všechny dceřiné ovládací prvky).

Labels:

Saturday, May 05, 2007

Tag

Jestliže jste měli za úkol zpracovat v cyklu různé druhy ovládacích prvků, využívala se někdy
k tomuto účelu vlastnost Tag ovládacích prvků v součinnosti s kolekcí Controls. Vlastnost Tag
neměla ve Visual Basicu 6.0 žádný specifický význam a sloužila jako pomocná „paměť“ pro uložení
uživatelsky definovaných informací o daném ovládacím prvku. Proto jste cyklus přes takové
prvky mohli sestrojit tak, že jste (v režimu návrhu nebo při běhu) přiřadili do této vlastnosti nějakou
identifikaci:
OvládacíPrvek.Tag = "NějakáIdentifikace"
a pak napsali tento druh cyklu:
Dim ctl As Control
' For Each ctl In Controls
' If ctl.Tag = " NějakáIdentifikace" Then
' ' Něco udělej
' End If
Next
Ovládací prvky bohužel už vlastnost Tag nepodporují.
Někteří programátoři úlohu řešili tak, že si „šikovně“ovládací prvky pojmenovali –využívali prostě
při běhu hodnotu vlastnosti Name ovládacích prvků:
Dim ctl As Control
For Each ctl In Me.Controls
If ctl.Name = "NějakýNázev" Or _
ctl.Name = "JinýNázev" Or _
ctl.Name = "JeštěJinýNázev" Then
' ' Něco udělej
End If
Next
Bohužel, ani vlastnost Name není při běhu dostupná.

Labels:

Wednesday, May 02, 2007

pole ovládacích prvků

Především se takové úlohy daly řešit přes tzv. pole ovládacích prvků (control array), o němž jsem
už výše v jedné připomínce uvedl, že se už nepoužívá. Místo toho, abyste měli jednotlivé popisky
jako samostatné objekty, umístili jste na formulář jeden popisek, pak ho zkopírovali do schránky a
vkládali další, přičemž jste na dotaz Visual Basicu při vkládání první kopie prohlásili, že má vytvořit
pole ovládacích prvků (klepnutím na tlačítko Ano v okně zprávy). Na jednotlivé prvky jste se
pak mohli odkazovat pomocí indexů (prvky pole ovládacích prvků se číslovaly od nuly). Například,
pokud jste pole popisků nazvali třeba lblCislo, mohli jste všechny popisky zařazené do pole (bez
ohledu na to, kolik jich je), zpracovat takto:
Dim i As Integer
For i = 0 To lblCislo.Count - 1
lblCislo(i) = VygenerovatPrirozeneCislo(0, 9) ' vygeneruje náhodná čísla
Next

Labels: