NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Honza.L
Člen
Avatar
Honza.L:11.5.2016 10:03

Ahoj,
rád bych vás poprosil o přeskoumání následujícího programu. Princip by měl být jednoduchý.
Nechám si vytvořit 3 tlačítka, po jejich stisknutí dojde k výpisu jejich jména do listboxu.
V mém případě se však vždy poslední tlačítko (i když si jich tam nechám vypsat víc) zmáčkne dvakrat?!

Public Class Form1
    WithEvents btn_manual As Windows.Forms.Button

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        For x = 1 To 3
            btn_manual = New Windows.Forms.Button
            btn_manual.Name = "tlacitko" & x
            btn_manual.Text = "B"
            btn_manual.Left = 5 + x * 25
            btn_manual.Width = 19
            btn_manual.Height = 19
            btn_manual.TabIndex = x
            Me.Controls.Add(btn_manual)
            AddHandler btn_manual.Click, AddressOf btn_manualClicked
        Next

    End Sub


    Private Sub btn_manualClicked(sender As Object, e As EventArgs) Handles btn_manual.Click
        Dim counter As String
        counter = sender.name
        ListBox1.Items.Add(counter)
    End Sub
End Class

Velice děkuji, jsem z toho jelen

 
Odpovědět
11.5.2016 10:03
Avatar
Honza
Člen
Avatar
Honza:11.5.2016 12:24

Ahoj, jde o to že event click toho tlačítka napojuješ 2x na obslužnou proceduru. Jednou nahoře pomocí WithEvents kde je tato proměná sdílená v rámci celé třídy a podruhé v tom cyklu. WithEvents a pak Handles u obslužné procedury je zbytečné, když event napojuješ programově. Tady je kód který funguje tak jak má:

Public Class Form1



    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        For x = 1 To 3
            Dim btn_manual As Windows.Forms.Button = New Windows.Forms.Button
            btn_manual.Name = "tlacitko" & x
            btn_manual.Text = "B"
            btn_manual.Left = 5 + x * 25
            btn_manual.Width = 19
            btn_manual.Height = 19
            btn_manual.TabIndex = x
            Me.Controls.Add(btn_manual)
            AddHandler btn_manual.Click, AddressOf btn_manualClicked
        Next

    End Sub


    Private Sub btn_manualClicked(sender As Object, e As EventArgs)
        Dim counter As String
        counter = sender.name
        ListBox1.Items.Add(counter)
    End Sub


End Class
Editováno 11.5.2016 12:25
Nahoru Odpovědět
11.5.2016 12:24
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza.L
Člen
Avatar
Odpovídá na Honza
Honza.L:11.5.2016 14:08

Díky. A dokážeš mi vysvětlit, proč to dělalo chybu pouze u posledního vygenerovaného tlačítka a ne u všech?

 
Nahoru Odpovědět
11.5.2016 14:08
Avatar
Honza
Člen
Avatar
Honza:12.5.2016 8:10

Problém byl právě v té proměnné btn_manual, protože ti v ní vždycky zůstává poslední hodnota kterou do ní přiřadíš v cyklu.

Představ si jednotlivé průchody toho cyklu:
průchod 1: v btn_manual je nothing, přiřadíš do ní button1
průchod 2: v btn_manual je button1, místo něj tam dáš button2
průchod 3: v btn_manual je button2, místo něj tam dáš button3

Další průchod cyklu už není, takže v té proměnné to třetí tlačítko zůstane.
Kdybys po skončení toho cyklu zavolal ještě btn_manual = nothing tak by to nejspíš taky fungovalo tak jak očekáváš.

Nahoru Odpovědět
12.5.2016 8:10
Snadnou cestou se daleko nedostanete, je tam velká tlačenice...
Avatar
Honza.L
Člen
Avatar
Odpovídá na Honza
Honza.L:18.5.2016 11:16

pěkně vysvětleno, díky.

 
Nahoru Odpovědět
18.5.2016 11:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.