Je to úplně jednoduché, handler události je nějaká metoda. Když tedy vytvoříte handler pro tlačítko Visual Studio Vám vyrobí něco jako:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
End Sub
Toto je metoda a ta klauzule Handles značí, že když nastane událost Button1.Click, spustí se ta metoda Button1_Click. Tomuto vztahu mezi tou událostí a metodou se říká přiřazení handleru, kde handler označuje tu metodu Button1_Click. Handler se dá přiřadit i dynamicky, v době, kdy je program už spuštěn:
AddHandler Button1.Click, AddressOf Button1_Click_Nahradni
Když provedeme tento řádek kódu a pak nastane událost Click objektu Button1, spustí se metoda Button1_Click_Nahradni a pokud jsme nechali tu deklaraci předtím, kdy jsme přiřadili ten handler Button1_Click, spustí se i ten. To je k ošetřování událostí. A teď si představte další věc: vnímejte tu metodu jako kdyby to byla proměnná.
Dim mojeMetoda As Action = Sub()
'procedura přiřazená do proměnné (typ Action či Action(Of T...Tx) pro proceduru s parametry a typ Func nebo Func(Of T...Tx) pro funkce)
End Sub
Pokud je v metodě (proceduře či funkci) jen jeden řádek kódu, můžeme to napsat inlinově a vynechat End konstrukci.
Dim mojeMetoda = Sub() MsgBox("toto je moje metoda")
Toť vše. Nyní zkombinujeme tyto dvě znalosti a dostaneme se k tomu, že můžeme dynamicky přiřadit handler události, který nemusíme adresovat (AddressOf) na metodu deklarovanou v kódu, ale radši na referenci proměnné typu Action. Následovně:
Dim mojeMetoda = Sub(sender, e) MsgBox(DirectCast(sender,Control).Name
AddHandler Button1.Click, mojeMetoda
A pokud by měla proměnné mojeMetoda sloužit jen k tomuhle a nebyla by potřeba na dalším místě v kódu, můžeme to zkrátit ještě více:
AddHandler Button1.Click, Sub(sender As Object, e As EventArgs) MsgBox("...")
Já předtím ty sendery a ečka pojmenoval s číslenými indexy, protože jsem ty inline metody deklaroval v těle procedury jejíž parametry už se jmenovali sender a e a docházelo tedy ke kolizi jmen více proměnných ve stejné naming scope.
|