完全初学者问题:这个 @TimerProc 如何得到参数? (20分)

  • 主题发起人 拾荒者
  • 开始时间

拾荒者

Unregistered / Unconfirmed
GUEST, unregistred user!
Object Pascal 越学越晕。
这是《DELPHI 深度历险》关于定时器的例,是个 CONSOLE 程序:
program Project1;

{$APPTYPE CONSOLE}

uses
Windows;

[red]procedure TimerProc(Window: HWND
message, idEvent: UINT
dwTime: DWORD)
stdcall;[/red]
begin //好多参数呀,怎么一个都用不上?
Writeln('Timer triggered !!');
end;

var
Msg: tMsg;
TimerID: Integer;
begin
[h4][red]TimerID := SetTimer(0, 0, 1000, @TimerProc);[/red][/h4]

while GetMessage(Msg, 0, 0, 0) do
DispatchMessage(Msg);

KillTimer(0, TimerID);
end.

procedure TimerProc 怎么这什么多参数? 好像没一个用上的呀。

TimerID := SetTimer(0, 0, 1000, @TimerProc);中的 @TimerProc 怎么向
procedure TimerProc 传递参数呀? :( 习惯了结构化编程,对 Object 真的
好晕。
 
TimerProc 这是 SetTimer 的回调函数。SetTimer 是 Win32API ,我们在 Delphi 中
用的 Timer 用的也是这个函数,只是回调被 Delphi 封装了,你不必理会。但本例
中直接使用 API ,就必须自己写回调函数。回调函数也不是乱写的,配合相应的 API
有固定的格式,但也大同小异。没什么好抱怨的啊。
 
VOID CALLBACK TimerProc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
);
这个函数的结构如上。Delphi 帮助上有的。
 
小雨哥:

这个问题可以这样理解吗?
SetTimer 是 Win32API ,需要一个
VOID CALLBACK TimerProc(
HWND hwnd, // handle of window for timer messages
UINT uMsg, // WM_TIMER message
UINT idEvent, // timer identifier
DWORD dwTime // current system time
);
结构的回调函数。而
procedure TimerProc(Window: HWND
message, idEvent: UINT
dwTime: DWORD)
stdcall;
begin //好多参数呀,怎么一个都用不上?
Writeln('Timer triggered !!');
end

之所以没有多少内容,是因为它继承得来的,这样想对吗?
但 TimerProc () 一个参数都没得到呀!是不是SetTimer 通过 @TimerProc取得 TimerProc
的入口,在SetTimer函数内部才传递参数?
谢谢
 
哎哟,在回调中,函数格式是回调设计者确定的,传递的是回调函数的地址。其实
每一个参数都使用到了,比如 : hwnd 就是你程序的窗口句柄(控制台为 0),uMsg 就是 WM_Timer:=$0113 (即 275),
idEvent 在你的程序段中已经在 setTimer 时得到,dwTime 是当前系统时间 (下面的演示可以观察到每秒的变化)。
简单的观察办法是如下:
program Project1;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
procedure TimerProc(Window: HWND
message, idEvent: UINT
dwTime: DWORD)
stdcall;
begin
Writeln('Timer triggered !!');
Writeln('Window:='+IntToStr(Window));
Writeln('message:='+IntToStr(message));
Writeln('idEvent:='+IntToStr(idEvent));
Writeln('dwTime:='+IntToStr(dwTime));
Writeln('----------------------------');
end;
var
Msg: tMsg;
TimerID: Integer;
begin
TimerID := SetTimer(0, 0, 1000, @TimerProc);
while GetMessage(Msg, 0, 0, 0) do
DispatchMessage(Msg);
KillTimer(0, TimerID);
end.
这个和什么鸟结构化编程和 Object 一点关系都没有。
 
看了 《Pascal 精要》后 “茅厕”顿开,明白了。谢谢
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
646
import
I
I
回复
0
查看
535
import
I
顶部