2013-05-24 16 views
8

Muszę przekazać odwołanie funkcji do innej funkcji w VB.NET. Jak to zrobić?Przekazywanie AddressOf do funkcji w VB.NET w celu użycia AddHandler

Moja funkcja musi wewnętrznie używać AddHandler, dla którego muszę przekazać mu funkcję obsługi. Mój kod poniżej oczywiście nie działa, ale przekazuje ideę tego, czego potrzebuję.

Public Function CreateMenuItem(ByVal Name As String, ByRef Func As AddressOf) As MenuItem 
    Dim item As New MenuItem 

    item.Name = Name 
    'item. other options 

    AddHandler item.Click, AddressOf Func 

    Return item 
End Function 

Czy istnieje inny sposób, aby to zrobić? AddHandler musi być ustawiony na przekazany parametr w funkcji jakoś ...

+0

'Addressof' zwraca delegata. Twoja funkcja powinna zatem zaakceptować dany delegat jako typ parametru. – asawyer

Odpowiedz

1

Po pierwsze, programy obsługi zdarzeń muszą mieć Subs. Po drugie, AddressOf nie może być używany jako typ. Jeśli sub jest w tej samej klasie, po prostu użyj nazwy podrzędnej. Jeśli znajduje się w innej klasie/pliku, może być konieczne, aby sub-public i/lub zakwalifikować go jako członka innej klasy. Subs dla klauzuli AddHandler musi w zasadzie zgodne z wzorcem:

Public/Private Sub MyHandler(sender As Object, e As EventArgs) 

Jeśli potrzebujesz różnych procedur na podstawie nazwy pozycji menu, można użyć jednego przewodnika i wywołać odpowiednią procedurę na podstawie nazwy elementu wyzwalającego wydarzenie.

+0

Dobrze, wiem, że adres nie może być typem danych. To miało tylko przekazać ten pomysł. I wiem, jak używać AddHandler. Ale jeśli pozwala powiedzieć, że funkcja obsługi jest w innej klasie, a CreateMenuItem jest publiczne, w jaki sposób mogę przekazać adres funkcji obsługi z tej klasy do CreateMenuItem? Każda utworzona pozycja menu powinna mieć inną procedurę obsługi. Chcę uniknąć wielkiego przełącznika lub listy instrukcji .else. – DieSlower

8

Twój drugi argument funkcji powinny być typu EventHandler, a funkcja będzie wtedy wyglądać tak:

Public Function CreateMenuItem(ByVal Name As String, ByRef Func As EventHandler) As MenuItem 
    Dim item As New MenuItem 

    item.Name = Name 
    'item. Other options 

    AddHandler item.Click, Func 

    Return item 
End Function 

Teraz trzeba się sposób obsłużyć te kliknięcia:

Private Sub ItemClick(sender As Object, e As EventArgs) 
    'Do something with that click here 
End Sub 

a ty można teraz spożywać te dwie metody z czymś podobnym:

Dim handler = New EventHandler(AddressOf ItemClick) 
    Dim i = CreateMenuItem("My item", handler) 

    i.PerformClick() 
13

Zabawa Delegat ction jest właśnie tym, czego potrzebujesz. Najpierw musisz zdefiniować delegata gdzieś w klasie. Zmień podpis, aby pasował oczywiście do wydarzenia.

Public Delegate Sub MyDelegate(sender As System.Object, e As System.EventArgs) 

Twoja funkcja przyjmie delegata jako argument.

Public Function CreateMenuItem(ByVal Name As String, del As MyDelegate) As MenuItem 
    '''' 
    AddHandler item.Click, del 
    '''' 
End Function 

Public Sub MyEventHandler(sender As System.Object, e As System.EventArgs) 
    '''' 
End Sub 

A oto jak wywołać funkcję:

CreateMenuItem(myString, AddressOf MyEventHandler) 
+1

Jeśli instrukcja AddHandler podaje błąd, spróbuj ustawić parametr "del" jako EventHandler zamiast MyDelegate w CreateMenuItem. (patrz rozwiązanie @Janez Lukan) – Fil