Предаване на AddressOf към функция във VB.NET за използване на AddHandler

Трябва да предам препратка на функция към друга функция във VB.NET. Как може да стане това?

Моята функция трябва да използва вътрешно 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 трябва да бъде настроен на предаден параметър във функция по някакъв начин...


person DieSlower    schedule 24.05.2013    source източник
comment
Addressof връща делегат. Следователно вашата функция трябва да приеме дадения делегат като тип параметър.   -  person asawyer    schedule 24.05.2013


Отговори (3)


Функционален делегат е точно това, от което се нуждаете, за да направите това. Първо трябва да дефинирате делегата някъде в класа. Разбира се, променете подписа, за да отговаря на вашето събитие.

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)
person Fuzhou Hu    schedule 24.05.2013
comment
Ако инструкцията AddHandler дава грешка, опитайте да зададете параметър „del“ като EventHandler вместо MyDelegate в CreateMenuItem. (реф. @Janez Lukan решение) - person Fil; 06.08.2016

Вашият втори аргумент във функцията трябва да е от тип 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()
person Janez Lukan    schedule 24.05.2013

Първо, манипулаторите на събития трябва да имат Subs. Второ, AddressOf не може да се използва като тип. Ако sub е в същия клас, просто използвайте sub името. Ако е в друг клас/файл, може да се наложи да го направите публичен и/или да го квалифицирате като член на другия клас. Subs за клаузата AddHandler трябва основно да следват модела:

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

Ако имате нужда от различни процедури въз основа на името на елемента от менюто, можете да използвате един манипулатор и да извикате подходящата процедура въз основа на името на елемента, задействащ събитието.

person tinstaafl    schedule 24.05.2013
comment
Добре, знам, че AddressOf не може да бъде тип данни. Това беше само за да предам идеята. И знам как да използвам AddHandler. Но ако да кажем, че функцията за обработка е в друг клас и CreateMenuItem е публичен, как мога да предам адреса на функцията за обработка от този клас на CreateMenuItem? Всеки създаден елемент от менюто трябва да има различен манипулатор. Искам да избегна огромен списък с инструкции за превключване или if..else. - person DieSlower; 24.05.2013