Pokud proměnnou nadeklarujete v cyklu, platí pouze v tom cyklu. Pokud ji nadeklarujete v proceduře, platí v celé proceduře (i v cyklech, které jsou uvnitř). Deklarace je příkaz Dim něco AS něco. Pokud Vám jde o to, aby Visual Basic neházel warningy, protože cyklus se nemusí provést ani jednou a za ním byste pracoval s neinicializovanou proměnnou, stačí přímo v deklaraci do této proměnné něco přiřadit, ideálně Nothing. Pak si samozřejmě musíte dát pozor, abyste do proměnné něco smysluplného přiřadil, než s tím budete pracovat. Co se týče druhého dotazu, já jsem se spíš ptal, proč si v cyklu vytváříte několik tlačítek a AddHandler máte až za cyklem, čímž namapujete událost jen pro poslední tlačítko, pro to, které je zrovna v proměnné btn nebo jak se to jmenuje. Pokud chcete, aby to fungovalo, musíte mít AddHandler uvnitř cyklu, aby se s událostí provázalo každé tlačítko a ne jen to poslední. Jinak pokud potřebujete něco jako kolekci komponent na formuláři, která byla ve VB6, asi nejelegantnější řešení je dát si do deklarací ve formuláři (mimo proceduru) něco jako:
Dim TextBoxy As New List(Of TextBox)
Tím se vytvoří seznam pro položky typu TextBox, který se může libovolně nafukovat. Když komponenty v cyklu generujete, po přidání na formulář je ještě přidejte do tohoto seznamu, nějak takto:
Dim txb As TextBox = Nothing 'tahle deklarace by šla šoupnout i dovnitř cyklu, ale chci Vám zároveň ukázat, jak se to dá dělat s jednou proměnnou
For i As Integer = 1 To 10 'vytvoříme 10 TextBoxů
txb = New TextBox()
txb.Left = i * 50: txb.Top = 30
Me.Controls.Add(txb) 'přidat TextBox na formulář
TextBoxy.Add(txb) 'přidat TextBox do seznamu TextBoxy
Next
'poznámka - za cyklem je v proměnné txb odkaz na poslední TextBox
Tím vygenerujete 10 TextBoxů a přidáte je do seznamu TextBoxy. Na jednotlivé TextBoxy se pak z celého formuláře můžete odkazovat přes TextBoxy(i), kde i je pořadí vytvoření (čísluje se od nuly). Jinak je nutné si uvědomit, že TextBox je třída - referenční typ. Proto když napíšete New TextBox, vytvoří se nový objekt, ale ten není fyzicky uložen v té proměnné, do které tohle přiřadíte. Objekt samotný leží kdesi v paměti (na haldě) a do proměnné se uloží jenom adresa, kde ten objekt leží. Když tedy do proměnné txb přiřadíte jeden TextBox a za chvíli do ní uložíte druhý, ten první se nesmaže. Například u čísel (Integer, Single, Double atd.), což jsou hodnotové typy, by se tohle stalo - hodnota je uložena přímo v proměnné. U objektů ale ne, prostě jenom zmizí odkaz na ten objekt a nahraje se tam jiný. Objektu se to nijak nedotkne. stejně tak formulář má v kolekci Controls seznam odkazů na objekty, které má na sebe vykreslit (přidali jsme mu je tam přes Me.Controls.Add), a stejně tak náš seznam TextBoxy si vlastně také drží jenom odkazy na skutečné objekty. Jakmile na objekt v paměti nevedou žádné odkazy, tento objekt bude odstraněn Garbage Collectorem. Kdyžtak si přečtěte tento článek, je to tam vysvětlené podrobněji: http://www.vbnet.cz/clanek--107-objektov... . Připadá mi, že v tom trochu tápete.
|