Passare una funzione ad un metodo e richiamarla da metodo

Devo passare una funzione ad un metodo che dovr richiamarla.
Nel caso specifico ho creato una finestra di dialogo per richiedere un valore e richiamando questa finestra devo passare l’indirizzo di una funzione che mi controlla il valore inserito.
In base a quale valore devo immettere avr diverse funzione di controllo e quindi dovrei poter passare alla finestra di dialogo la corretta funzione di controllo.

Esempio
Finestra principale dove ho due box di testo (non editabili direttamente) dove inserire il valore di una misura in metri che va da min 10cm a max 300cm ed un numero che deve essere maggiore o uguale a 1

Quando si fa clic sul testo della misura comparir la finestra di dialogo per chiedere il valore in metri e devo utilizzare la funzione ControllaMetri per verificare che il valore inserito sia tra 10cm e 300cm
Quando si fa clic sul testo del numero comparir la finestra di dialogo per chieder il valore numerico e devo utilizzare la funzione ControllaNumero per verificare che il numero inserito sia maggiore o uguale a 1

Come faccio a passare alla finestra di dialogo una delle due funzione ControllaMetri o ControllaNumero che deve esser richiamata quanto si fa clic su ok per confermare il valore?

Sono possibili varie alternative.
Se il compito e’ solo verificare che il valore immesso sia compreso in un intervallo e’ possibile creare la finestra in modo che abbia come proprieta’ i due valori inferiore e superiore dell’intervallo e implementare nella finestra stessa il metodo che utilizza i due valori per la validazione.
Alla creazione della finestra di dialogo si settano i valori minimo e massimo e la finestra sara’ autonoma nel rilevare la validita’ del valore immesso.

Altra soluzione, forse anche troppo evoluta per lo scopo sopra descritto, e’ definire un evento nella finestra che sara’ generato al click di ok.
Alla creazione della finestra e’ possibile connettere dinamicamente il gestore dell’evento mediante AddHandler .
Questa seconda alternativa e’ basata proprio sulla possibilita’ di settare il puntatore ad una funzione: numero, tipo di parametri e valore di ritorno sono liberamente definibili.
Credo che questa seconda alternativa, pur essendo molto flessibile, forse sia anche troppo complessa per il caso specifico vista la necessita’ di gestire la flessibilita’ stessa.

In ogni caso la scelta della migliore soluzione possibile dipende dalle reali necessita’ dell’applicazione.

Saluti.

Puoi fare cos :

crei una variabile ( propriet ) con i dati che vuoi tornare ad esempio
risultato as string
Non assegnare nessun valore.

crei un metodo ( funzione ) che passa i dati da elaborare :

Public Function visualizza(codicearticolo as string, codicecliente as string, datadocumento as date, optional gruppo as string = “”) as string

me.ShowModal
return self.risultato.

quando chiami la finestra con la funzione :
dim wfinestra as new finestra
dim risultato as string
risultato = wfinestra.visualizza(codicearticolo, codicecliente, datadocumento, gruppo)

prima di chiudere la finestra chiamata devi assegnare un valore alla propriet risultato e poi chiudi la finestra con self.close; vedrai che ‘risultato’ dalla finestra chiamante avr il valore impostato dalla finestra chiamata.

Puoi anche creare nella tua finestra di dialogo un delegate (funzione virtuale) tipo:
controllaValore(testoDelCampo as string) as boolean

sempre finestra di dialogo una propriet callBackControllo as controllaValore
Poniamo che tu abbia una propriet ok as boolean, nella finestra di dialogo che ti indica se il valore inserito e corretto; e una propriet valore as variant che ne rappresenta il valore.
nel pulsante di conferma (o comunque per verificare e accettare il valore) puoi scrivere:

If callBackControllo<>Nil Then
  If callBackControllo.Invoke(TextField1.Text) Then //TextField1  il campo dove il valore viene inserito...
    valore=TextField1.Text.Val
    ok=True
    Self.Close
  Else
    MsgBox "Errato"
  End If
End If

Aggiungi alla finestra di dialogo un costruttore:

Public Sub Constructor(funzioneDiControllo as controllaValore)
  // Calling the overridden superclass constructor.
  callBackControllo=funzioneDiControllo
  Super.Constructor
  
End Sub

A questo punto puoi senza altre complicazioni, come dover aggiungere handler che poi andrebbero rilasciati, richiamare la tua finestra di dialogo (qui la chiamiamo winInserisciValore) con un codice tipo:

Dim w As New winInserisciValore(WeakAddressOf ControllaMetri)
w.ShowModalWithin(Self)
If w.ok Then Label1.Text=w.valore.DoubleValue.ToText

Dove
-Label1 dove vuoi visualizzare il valore inserito
-ControllaMetri la funzione che hai descritto che verifica se il valore compreso tra 10 e 300, ma pu essere qualsiasi altra funzione che prende in ingresso un parametro stringa e restituisce un booleano per indicare se il valore accettato o meno.

Semplice e riusabile per qualsiasi altra cosa.