2013-05-24 22 views
8

Ho bisogno di passare un riferimento di una funzione a un'altra funzione in VB.NET. Come si può fare?Passare AddressOf a una funzione in VB.NET per utilizzare AddHandler

La mia funzione deve utilizzare AddHandler internamente, per cui ho bisogno di passarlo una funzione di gestione. Il mio codice qui sotto ovviamente non funziona, ma trasmette l'idea di ciò di cui ho bisogno.

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 

C'è un altro modo per farlo? AddHandler deve essere impostato su un parametro passato in una funzione in qualche modo ...

+0

'Addressof' restituisce un delegato. La tua funzione dovrebbe quindi accettare il delegato dato come tipo di parametro. – asawyer

risposta

1

Prima di tutto, i gestori di eventi devono avere sottotitoli. In secondo luogo, AddressOf non può essere utilizzato come tipo. Se il sottotitolo è nella stessa classe, usa solo il nome secondario. Se si trova in un'altra classe/file, potrebbe essere necessario rendere il pubblico secondario e/o qualificarlo come membro dell'altra classe. Subs per la clausola AddHandler deve fondamentalmente seguire il modello:

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

Se avete bisogno di diverse routine in base al nome della voce di menu, è possibile utilizzare un gestore e chiamare la routine appropriato in base al nome dell'elemento scatenante l'evento.

+0

A destra, so AddressOf non può essere un tipo di dati. Questo era solo per trasmettere l'idea. E so come usare AddHandler. Ma se diciamo che la funzione del gestore è in un'altra classe e CreateMenuItem è pubblico, come posso passare l'indirizzo della funzione di gestione da quella classe a CreateMenuItem? Ogni voce di menu creata dovrebbe avere un gestore diverso. Voglio evitare di avere un interruttore enorme o se ... lista di istruzioni di cancellazione. – DieSlower

8

tuo secondo argomento della funzione deve essere di tipo EventHandler, e la funzione sarebbe quindi simile:

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 

Ora avete bisogno di un metodo per gestire tali clic:

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

E voi può consumare questi due metodi ora con qualcosa del tipo:

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

    i.PerformClick() 
13

Un divertimento delegato ction è proprio quello che devi fare questo. Per prima cosa è necessario definire il delegato da qualche parte nella classe. Cambia la firma per adattarla al tuo evento, naturalmente.

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

La tua funzione prenderà il delegato come argomento.

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 

Ed ecco come si chiama la funzione:

CreateMenuItem(myString, AddressOf MyEventHandler) 
+1

Se l'istruzione AddHandler dà errore, provare a impostare il parametro 'del' come EventHandler invece di MyDelegate in CreateMenuItem. (ref. @Janez Lukan solution) – Fil