AddHandler   zodpovězená otázka

VB.NET

Dorý den, můžuse zeptat jak použít ve visual basicu příkaz AddHandler?

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

Zjednodušeně řečeno se používá k přidání kódu k události. Tedy pokud se vyvolá událost, určuje se tím kód, který se spustí.

Například:

AddHandler Button1.Click, AddressOf Button1_Click

Tento řádek říká, že pokud se klepne na tlačítko Button1, tak se spustí procedura Button1_Click.

Opakem je RemoveHandler, který z event handleru odkaz odebere.

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

Díky to je přesně co jsem potřeboval.

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

Mám takový problém addhandlerem přídávám např. k button událost click stejně jako ve vašem pripadě. To znamená že se provede neprjve udalost přidaná addhandlerem a po té se ještě provede kód napsany v objektu button v udalosti Button1_Click. Jde nějakým způsobem zastavit zpracování události

Button1_Click (kód v objektu) na základě kódu zadaného v proceduře deklarované addhandlerem? Jenom upřesňuji nesmím původní proceduru zcela nahradit, jenom potřebuji ve své procedůře rozhodnout zda se má zpracovat i procedůra zapsaná přímo události objektu. Děkuji za odpoved

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

Nerozumím přesně vašemu dotazu, ale zřejmě bude problém v tom, že k události Click máte přiřazenou handlovací metodu jak pomocí klíčového slova AddHandler tak pomocí Handles (obyčejně se generuje automaticky). Takže buď ponechte Handles (Button1_Click ... Handles Button1.Click) což doporučuji, nebo odstraňte Handles a ponechte ruční přiřazení pomocí AddHandler. AddHandler se ve většině případů používá při dynamickém vytváření ovládacích prvků nebo ve zvláštních případech.

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

Pokud jsem Vás dobře pochopil, tak máte na mysli něco takového:


Public Class Form3

Private Sub procedura1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' původní kód, který "nesmíte" měnit
        MsgBox("z procedury 1")
End Sub

Private Sub procedura2(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ' váš nový kód
        MsgBox("z procedury 2")
End Sub

Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        AddHandler Button1.Click, AddressOf procedura2
End Sub
End Class

Vy takto události click tlačítka button přidáváte další handler na další obslužnou metodu.

Nevím, nakolik je to korektní postup - to musí říci odborníci, ale pokud vycházím z toho, co zde kdysi psal pan Linhart o příbuzném jazyku C#, kde se handlery přidávají pomocí operace += soudím, že jich k události může být legálně navěšeno více.

Pouze nevím, nakolik je striktně dáno pořadí jejich provádění, ale pokud jsem to zkoušel, tak se mi to chovalo přesně naopak, než Vy popisujete - nejprve se provedla obslužná metoda "Procedura1", poté teprve ta programově přidaná "Procedura2".

Pokud máte skutečně nějaký vážný důvod, proč to nesloučit do jedné metody, pak by bylo nejlépe (nesmíte-li vůbec zasahovat do původně vygenerované ("procedura1" - původně "Button1_Click"),

pak by bylo nejlepší to, co Vám radil pan Linhart - u procedury1 zrušte vše, co se nachází za závorkou (Handles Button1.Click),

vyrobte si svou proceduru a z ní, pokud uznáte, že je to nutné, proceduru Procedura1 volejte.

Nějak takto:

Public Class Form3

    Private Sub procedura1(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ' původní kód, který "nesmíte" měnit
        MsgBox("z procedury 1")
    End Sub
    Private Sub procedura2(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ' váš nový kód
        If MsgBox("Provést i proceduru1?", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then procedura1(sender, e)

    End Sub

    Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       AddHandler Button1.Click, AddressOf procedura2
    End Sub
End Class

No a pokud ani takový zásah nesmíte udělat (odstranit handles), pak to jde ještě obejít tím, že tento "Handler" odstraníte programově:

Public Class Form3

    Private Sub procedura1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' původní kód, který "nesmíte" měnit
        MsgBox("z procedury 1")
    End Sub
    Private Sub procedura2(ByVal sender As System.Object, ByVal e As System.EventArgs)
        ' váš nový kód
        If MsgBox("Provést i proceduru1?", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then procedura1(sender, e)

    End Sub

    Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        RemoveHandler Button1.Click, AddressOf procedura1
        AddHandler Button1.Click, AddressOf procedura2
    End Sub
End Class

nahlásit spamnahlásit spam 2 / 2 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