//建立定時器函數的聲明:SetTimer( hWnd: HWND; {與定時器相關聯的視窗控制代碼} nIDEvent: UINT; {指定一個非 0 的定時器標識符} uElapse: UINT; {指定間隔時間, 單位是毫秒} lpTimerFunc: TFNTimerProc {每到時間後, 要調用的函數的指標}): UINT; {返回定時器標識符; 失敗返回 0}//移除定時器函數的聲明:KillTimer( hWnd: HWND; {與定時器相關聯的視窗控制代碼} uIDEvent: UINT {定時器標識符}): BOOL;//處理 WM_TIMER 訊息的回呼函數的格式:TimerProc( hWnd: HWND; {與定時器相關聯的視窗控制代碼} uMsg: UINT; {WM_TIMER 訊息} idEvent: UINT; {定時器的標識符} Time: DWORD {以世界時間公約格式(UTC)指定的系統時間}); {這是個過程, 無傳回值}
應該先理解一下再舉例:
SetTimer 的參數1: hWnd, 一般指定 Self.Handle 就可以了;
SetTimer 的參數2: nIDEvent 是某個定時器的標識符, 說明可以建立若干個定時器, 隨便給個正整數即可;
SetTimer 的參數3: uElapse, 這相當於 VCL 中 Timer 類的 Interval 屬性;
看來參數 1-3 還是非常簡單, 不好理解的就是參數4: lpTimerFunc, 這是一個過程的地址.
任意一個過程的地址嗎? 當然不是; 這個過程的參數結構是 Windows 系統規定的, 我們必須按規定去定義這個過程; 即使你用不到其中的參數也必須如此.
//舉例:var i: Integer;//先定義回呼函數procedure MyTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD);begin Form1.Text := IntToStr(i); Inc(i);end;//建立定時器procedure TForm1.Button1Click(Sender: TObject);begin SetTimer(Handle, 1, 10, @MyTimerProc); {每 1/100 秒調用一次 MyTimerProc}end;//刪除定時器procedure TForm1.Button2Click(Sender: TObject);begin KillTimer(Handle, 1); {建立時指定的定時器標識是 1, 這裡必須要一致}end;//如果回調過程是表單類的一個方法, 需要這樣:var i: Integer;//先定義回呼函數procedure TForm1.MyTimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; Time: DWORD);begin Text := IntToStr(i); Inc(i);end;//建立定時器procedure TForm1.Button1Click(Sender: TObject);begin SetTimer(Handle, 1, 10, @TForm1.MyTimerProc); {每 1/100 秒調用一次 MyTimerProc}end;//刪除定時器procedure TForm1.Button2Click(Sender: TObject);begin KillTimer(Handle, 1); {建立時指定的定時器標識是 1, 這裡必須要一致}end;