Addhandler, event   zodpovězená otázka

VB.NET, WinForms, .NET

Úvod

Nejdříve se chci omluvit za stupidní název tématu. Opravdu jsem 10 minut přemýšlel, jak bych můj problém nejlépe pojmenoval.

Ještě bych rád řekl, že jsem samouk. S Basicem pracuji už asi 2 roky, mám za sebou tak 30 - 50 úspěšně fungujících aplikací. Přočetl jsem už pár knih (půjčených), a když něco nevím, najdu si to na internetu. Kód se snažím pochopit, a ne ho zkopírovat.

Co je za problém?

Představte si, že mám 5 buttonů. A když zmáčknu 1., chci zavolat funkci a předat ji argument ,,1", u druheho buttonu 2, atd.

Můj problém je, že nevím, kolik budu potřebbovat buttonů (třeba 50). Vytvořím tedy cyklus který mi na formulář přidá buttony

 For o = 0 To UBound(pole)
                            'vytvori picturebox


                        Dim pic As New PictureBox
                        pic.Size = New Size(117, 89)

                        pic.Location = New Point(1,1)
me.controld.add(pic)

Toto je jen ukázka. (v projektu mám promenne, které vzdy picturebox posunou, ci vytvori novou radu). HLAVNĚ jde o to, že přidávám na formulář buttony, nebo pictureboxy(to je jedno)

EVENT

do smyčky jsem přidal

 'přidá handler
                      
            AddHandler pic.Click, AddressOf Me.pic_click

A ZDE JE PROBLÉM

Každý picturebox po kliknutí vyvolá stejnou proceduru (pic_click), a já ani pomocí senderu, či e nedokážu zjistit jméno komponenty, která jej vyvolala. Potřebuji, aby při kliknutí na picturebox1 se zavolala funkce a předal se ji argument 1, picturebox2, argument 2 atd.

Mohl bych udělat toto


Select Case i
                Case 0
                                    AddHandler pic.Click, AddressOf Me.pic0_click
                                Case 1
                                    AddHandler pic.Click, AddressOf Me.pic1_click

atd...a apak bych musel vytvořit procedury pic1_click a pic0_click

Také mne napalo:

AddHandler pic.Click, AddressOf Me.pic_click( ?, ?,i)

 Private Sub pic_click(ByVal sender As System.Object, ByVal e As System.EventArgs, ByVal i As Integer)
        
    End Sub

Tedy že bych k proceduře pic_click přidal i, a nějak ho té proceduře předal..?

A JEŠTĚ OTÁZKA

Když přidám na formulář button


dim mynewbutton as new button
mynewbutton.name = "Button1"
me.controls.add(mynewbutton)

Tak jak se na něj odkážu? pod jménem button1 jej ,,nevidím". Já jsem to dělal takto


Me.Controls.Item(0)

Což je pěkné a dostačující, ale když někdy v budoucnu na formulář manuálně přidám nějakou komponentu, index mého buttonu se znmění, a taky nemám zájem zjišťovat, jaký index má který button...

Mockrát Vám děkuji za Váš čas a případné odpovědi

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Moc zbytečných řečí kolem, kterým stejně nevěřím!

Když jste za 10 minut vymyslel název, mohl jste jeho slova během pár vteřin vložit do vyhledávače a řešení byste našel.

A sender.name jste asi nezkusil, protože zcela spolehlivě vrátí jméno tlačítka.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mockrát děkuju a moc se omlouvám

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přetypujte sender na očekávaný typ (button, image) a pak už není problém zjistit jméno volajícího objektu. Můžete také použít property TAG, kterou má každý objekt. Do ní můžete doplnit nějakou upřesňující identifikaci nebo cokoli jiného (tag je typu object, tzn. že do ní můžete klidně vložit i nějakou svoji třídu).

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

1.) Vytvářet Buttony programově může poukazovat na špatný návrh aplikace, k čemu byste potřebovat 50 Buttonů? :-) Pokud jde o nějakou herní desku, nebo tak něco, je lepší použít GDI+, ale to je zase jiná kapitola.

2.) Handlery udáslostí přiřazujete správně. V proceduře samotné je pak ale třeba zvážit několik věcí. U Vás se to zjednodušuje tím, že víte, že handler vždy vyvolá Button, nebo PictureBox, takže DirectCast(sender, Button).Name vrátí jméno Vaší komponenty.

3.) Když přidáte tlačítko programově, můžete mu sice nastavit jméno, ale z kódu se na něj přes to jméno stejně nedostanete. Když totiž designerem vložíte na formulář Button a pojmenujete ho Franta, v souboru FormX.design.vb (nebo tak nějak, je to jedno, ten soubor stejně defaultně není vidět) se vytvoří proměnné jménem Button a vy pak v FormX.vb můžete odkazovat na ten Button podle jména, protože ta proměnná se díky práci Visual Studia pojmenuje stejně jako to, co napíšete ve vlastnostech Buttonu (Controlu) do Name.

P.S.: Máte u mně + za zdvořile položený dotaz s vlastní snahou.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

S buttonem to byl jen příklad. V aplikaci mám pictureboxy. Aplikace načte do každého pictureboxu malý obrázek.

Všechny aplikace které jsem dříve dělal byly opravdu ale opravdu jednoduché (čtení ze souboru, jednoduché databáze, práce se soubory...).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

3.) Když přidáte tlačítko programově, můžete mu sice nastavit jméno, ale z kódu se na něj přes to jméno stejně nedostanete.

A proč ne?

 Public Class Form1
   Public Sub NoveTlacitko(ByVal Nazev As String)
   Dim Tlacitko As New System.Windows.Forms.Button
   Tlacitko.Name = Nazev
     ' ... další, jako např. text, umístění ap.
    Controls.Add(Tlacitko)
    AddHandler Tlacitko.Click, AddressOf Tlac_Click
  End Sub

   Private Sub Tlac_Click(ByVal sender As System.Object, _
       ByVal e As System.EventArgs)
     MsgBox("Stisknuté tlačítko má jméno: " & sender.name)
    End Sub

End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ovšem, myslel jsem tím následující:

Dim b As New Button() With {.Name="Button1"}
' Nejde:
Button1.Text = "Click me."
nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jistě, omlouvám se. Zaměřil jsem se na podstatu problému podle otázky tazatele a Vaši připomínku jsem si pořádně nepřečetl a nepochopil.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Až teď vidím, že jsem nedočetl ani původní dotaz - tedy tu poslední otázku, na kterou jste odpověděl.

Kdyby někdo mohl moje hlouposti vymazat, ať to prosím udělá.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Takovýhle dotaz po 30-50 úspěšně napsaných aplikacích, 10 minut přemýšlení o názvu článku? Já myslím, že spíš 3-5 nefunkčních bastlů a název hned to první co vás napadlo. Kdybyste se nepokoušel tak trapně ospravedlňovat, neřeknu ani slovo.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To je nějaký vtipn s tím "Ve škole Basic bereme, ale oni jsou teprv u Buttonu", ne?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback