2013-05-24 6 views
8

Мне нужно передать ссылку функции на другую функцию в VB.NET. Как это может быть сделано?Передача AddressOf функции в VB.NET для использования AddHandler

Моя функция должна использовать AddHandler внутри, для чего мне нужно передать ей функцию обработки. Мой код ниже явно не работает, но он передает идею того, что мне нужно.

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 

Есть ли другой способ сделать это? AddHandler должен быть установлен в переданный параметр в функции каким-то образом ...

+0

'Addressof' возвращает делегат. Поэтому ваша функция должна принимать заданный делегат как тип параметра. – asawyer

ответ

1

Во-первых, обработчики событий должны иметь Subs. Во-вторых, AddressOf не может использоваться как тип. Если юг находится в том же классе, просто используйте его. Если это в другом классе/файле, вам может понадобиться сделать суб-публикацию и/или квалифицировать ее как члена другого класса. Переводники для пункта AddHandler должны в основном по той же схеме:

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

Если вам нужны различные процедуры на основе имени пункта меню, вы можете использовать один обработчик и вызвать соответствующую процедуру на основе названия элемента запускающего событие.

+0

Правильно, я знаю, что AddressOf не может быть типом данных. Это было просто для того, чтобы передать идею. И я знаю, как использовать AddHandler. Но если можно сказать, что функция обработчика находится в другом классе, а CreateMenuItem является общедоступной, как я могу передать адрес функции обработчика из этого класса в CreateMenuItem? Каждое созданное меню должно иметь другой обработчик. Я хочу, чтобы у вас не было огромного переключателя или списка .... – DieSlower

8

Ваш второй аргумент в функции должны быть типа EventHandler, и ваша функция будет выглядеть так:

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 

Теперь вам нужен метод для обработки этих кликов:

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

И вы могут использовать эти два метода сейчас с чем-то вроде:

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

    i.PerformClick() 
13

Веселый делегат - это то, что вам нужно сделать. Сначала вам нужно определить делегата где-нибудь в классе. Измените подпись, чтобы она соответствовала вашему курсу.

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

Ваша функция примет делегата в качестве аргумента.

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 

А вот как вы вызываете функцию:

CreateMenuItem(myString, AddressOf MyEventHandler) 
+1

Если инструкция AddHandler дает ошибку, попробуйте установить параметр 'del' как EventHandler вместо MyDelegate в CreateMenuItem. (см. решение Янеза Лукана) – Fil