Kirjautuminen

Haku

Tehtävät

Koodit: VB6: Callback-funktio

Kirjoittaja: Antti Laaksonen

Kirjoitettu: 29.11.2003 – 29.11.2003

Tagit: koodi näytille, vinkki

Toisinaan WinAPI-funktion tuottama tulos ei mahdu yhteen palautusarvoon tai funktion toiminta on pitkäkestoisempaa. Tällöin ohjelmassa määritellään ns. callback-funktio, jota API-funktio kutsuu itsenäisesti — kenties useita kertoja ja vasta pidemmän ajan kuluttua. Visual Basicissa moinen on mahdollista versiosta 5.0 lähtien käyttämällä AddressOf-avainsanaa aliohjelman tai funktion parametrilistassa. Callback-funktion täytyy sijaita moduulissa ja olla yleinen (Public).

Esimerkkiohjelmassa luodaan SetTimer-funktiolla oma ajastin, joka kutsuu säännöllisin väliajoin moduulissa olevaa TimerProc-aliohjelmaa. Todisteena ajastimen toiminnasta ikkunan otsikkorivillä näytetään Windowsin käynnistämisestä kulunut aika. Lopuksi ajastin tuhotaan KillTimer-funktiolla.

Lisää tietoa callback-funktioiden käytöstä Visual Basicissa löytyy osoitteesta http://www.partware.com/ebooks/api/articles/intro/part05.html.

Form1

'ajastimen tunnus tallennetaan id-muuttujaan
Dim id As Long

Private Sub Form_Load()
    'luodaan ajastin:
    '   o Me.hwnd on kahva ikkunaan, johon ajastin liittyy
    '   o vbNullin tilalla voisi määrätä ajastimen tunnuksen
    '   o 100 on ajastimen väliaika millisekunteina
    '   o TimerProc on aliohjelma, jota kutsutaan määräajan täyttyessä;
    '     AddressOf selvittää sen sijainnin muistissa
    id = SetTimer(Me.hwnd, vbNull, 100, AddressOf TimerProc)

    'jos palautusarvo on 0, jotain meni pieleen
    If id = 0 Then
        MsgBox "Ei onnannut!"
        End
    End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'poistetaan ajastin ikkunan sulkeutuessa
    id = KillTimer(Me.hwnd, id)
End Sub

Module1

Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long

'TimerProc-aliohjelma suoritetaan aina ajastimen määräajan täyttyessä
'   o hwnd on ajastimen luoneen ikkunan kahva
'   o uMsg on aina WM_TIMER eli &H113 eli 275
'   o idEvent on ajastimen tunnus
'   o dwTime on Windowsin käynnistämisestä kulunut aika millisekunteina
Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
    'näytetään käynnistämisestä kulunut aika formin otsikkopalkissa
    Form1.Caption = dwTime
End Sub

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta