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