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 Class
Aliohjelma 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 Class
Tä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 Sub
tä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.