2013-05-24 2 views
8

VB.NET의 다른 함수에 함수 참조를 전달해야합니다. 어떻게 할 수 있습니까?AddHandler를 사용하기 위해 VB.NET의 함수에 AddressOf를 전달하십시오.

내 함수는 내부적으로 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'가 대리자를 반환 여기

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 

그리고 당신이 함수를 호출하는 방법입니다. 따라서 함수는 주어진 델리게이트를 매개 변수 유형으로 받아 들여야합니다. – asawyer

답변

1

먼저 이벤트 처리기에 Sub가 있어야합니다. 둘째, AddressOf은 유형으로 사용할 수 없습니다. 하위 클래스가 같은 클래스에 있으면 하위 이름 만 사용하십시오. 다른 클래스/파일에있는 경우 하위 공개 및/또는 다른 클래스의 멤버로 한정해야 할 수도 있습니다. 트리거 항목의 이름에 따라 적절한 루틴을 사용자가 메뉴 항목의 이름에 따라 서로 다른 루틴이 필요하면

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

, 하나 처리기를 사용할 수 및 전화 : AddHandler에 절에 대한 잠수정은 기본적으로 패턴을 따라야합니다 그 사건. 기능에

+0

맞아, 나는 AddressOf가 데이터 유형이 될 수 없다는 것을 알고있다. 그것은 그 아이디어를 전하기위한 것입니다. AddHandler를 사용하는 방법을 알고 있습니다. 하지만, 처리기 함수가 다른 클래스에 있고 CreateMenuItem이 public이라면 그 클래스의 핸들러 함수 주소를 CreateMenuItem에 어떻게 전달할 수 있습니까? 만들어진 각 메뉴 항목에는 다른 처리기가 있어야합니다. 거대한 스위치 또는 if..else 명령문 목록을 사용하지 않으려합니다. – DieSlower

8

두 번째 인수는 유형 EventHandler이어야하고 기능은 다음과 같습니다 당신에게

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

그리고 : 이제 당신은 그 클릭을 처리 할 방법이 필요

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 

다음과 같은 두 가지 방법을 사용할 수 있습니다.

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

    i.PerformClick() 
13

재미 ction 대리인은이 작업을 수행하는 데 필요한 것입니다. 먼저 클래스의 어딘가에서 델리게이트를 정의해야합니다. 물론 이벤트에 맞게 서명을 변경하십시오.

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

함수는 대리자를 인수로 사용합니다.

CreateMenuItem(myString, AddressOf MyEventHandler) 
+1

AddHandler 명령에서 오류가 발생하면 CreateMenuItem의 MyDelegate 대신 'del'매개 변수를 EventHandler로 설정해보십시오. (@ Janez Lukan 참조) – Fil

관련 문제