Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB.NET: CallBack toiminto

tnb [28.02.2004 00:30:15]

#

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

tnb [29.02.2004 21:53:09]

#

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

nomic [03.03.2004 15:42:38]

#

tämähän on mainio! kiits tuli oikeastaan aika hyvään tarpeeseen ja opinpa jotain uuttakin :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta