Joskus olisi kiva näyttää vaikkapa aliohjelman luuppilaskurin arvo kutsuneessa formissa, mutta ei tiedetä mistä formista kutsu tuli eikä mihin boxiin pitäisi kirjoitaa. Ongelman voi ratkaista CallBack:llä eli takaisin kutsulla. Aliohjelmalle välitetään tieto funktion osoitteesta, jota kutsumalla saadaan laskurin näyttö menemään oikeaan formiin ja näytettyä siellä sopivassa paikassa (joka siis ei tarvitse edes tietää aliohjelmaa kirjoitettaessa).
Takaisinkutsun rakenne määritellään Delegate määrittelyssä, jota sitten käytetään kutsun funktio-parametrin "as" määrittelyssä.
Formiin: button ja textbox
Sub NäytäLaskuri(ByVal k As Integer)
'näyttää laskurin arvon
TextBox1.Text = k
Application.DoEvents()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim jv As New JokuVaan 'instanssi luokasta JokuVaan
Dim KutsuTakaisin As JokuVaan.NäytäLaskuriDelegate ' varataan tila funktiokutsulle
KutsuTakaisin = AddressOf NäytäLaskuri ' tehdään instanssi funktiosta
jv.Aliohjelma(KutsuTakaisin) ' kutsutaan aliohjelmaa
End Sub
End ClassAliohjelma luokka
Public Class JokuVaan
Public Delegate Sub NäytäLaskuriDelegate(ByVal k As Integer) 'kutsun rakenteen määrittely
Public Sub Aliohjelma(ByVal NäyttöFunktio As NäytäLaskuriDelegate)
Dim i As Integer
For i = 1 To 10000
'takaisin kutsu laskurin arvon näyttämiseksi
NäyttöFunktio.Invoke(i)
Next
End Sub
End ClassTässä vielä toinen esimerkki:Integrointi-aliohjelmalle annetaan integroitava funktio parametrinä.
'integroitavana oleva funktio
Public Function OmaFunktio(ByVal x As Double) As Double
OmaFunktio = x ^ 2 * Math.Sin(x)
End Function
'kutsun rakenteen määrittely
Public Delegate Function FunktioDelegate(ByVal x As Double) As Double
'aliohjelma joka integroi
'Funktio = viittaus integroitavana olevaan funktioon
'integrointi a1:stä a2:een
Public Function Integraali(ByVal Funktio As FunktioDelegate, ByVal a1 As Double, ByVal a2 As Double) As Double
Dim i As Integer
Dim sum As Double
For i = 1 To 10000
sum = sum + Funktio(a1 + (i - 0.5) / 10000 * (a2 - a1))
Next
Return sum / 10000
End Function
'button tapahtuma
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim f1 As FunktioDelegate 'rakenne määrittely
f1 = AddressOf OmaFunktio ' instanssi tehdään
' kutsutaan integrointia, funktio parametrina
TextBox1.Text = Integraali(f1, 0, 6.28)
End Subtämähän on mainio! kiits tuli oikeastaan aika hyvään tarpeeseen ja opinpa jotain uuttakin :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.