Delphi句柄类型计时器及回调函数
windodws.pas中 HWND = type LongWord;windows.pas中THandle定义:THandle = System.THandle; 而在system单元中,定义THandle = LongWord; windows.pas中 HDC = type LongWord;也就是说delphi中这三个实际上都是longword,定义出这么三个东西来, 是为了与 windows api配合,因为程序是在windows的平台上开发的,要调用windows 的API,而在windowsAPI中定义了这么个类型。 在windows系统中,HDC Handle to a device context (DC). 即指向一个设备上下文(device context 设备描述表:要在窗口中输出文字或者显示图形,就需要用到设备描述表,即DC。DC是一个包含设备(物理输出设备,如显示器,以及设备驱动程序)信息的结构体,在Windows平台下,所有的图形操作都是利用DC来完成的。设备描述表是一个Windows数据结构,它包含了一个设备(比如显示器和打印机)绘图属性的相关信息。所有的绘图操作的调用都是通过一个设备描述表类型的对象来实现,这个类对象封装了Windows API(Application Programming Interface,应用程序编程接口)函数中关于划线、作图和输入输出文本的的相关操作。设备描述表允许在窗口上进行与设备无关的绘图操作,设备描述表可以用在往屏幕、打印机或者图元文件的绘图操作。设备描述表旗下有4个常用DC类,他们分别是CPaintDC,CClientDC,CWindowDC和CMetaFileDC)。HWND Handle to a window. 是一个窗口句柄。 THandle是delphi的东西,windows自己没有定义。handle属性是Delphi封装的上述各种句柄,对不同对象是不同类型,如:Form1.handle,Application.handle是窗口句柄;Canvas1.handle是设备环境句柄。Brush1.handle是画刷句柄等。
定时器API SetTimer
delphi实现延时的方法,很多人首先就想到用timer控件,其实使用API来做定时器也很简单,主要就是一个SetTimer函数和KillTimer函数,
例如:settimer(self.handle,0,1000,@timerfun);
1.调用函数的handle,windows会定时发送WM_TIMER消息给此handle
procedure TimerProc(hwnd:HWND;uMsg,idEvent:UINT;dwTime:DWORD); stdcall;
procedure TForm1.FormCreate(Sender:TObject);
SetTimer(Handle,10,500,@TimerProc);
procedure TForm1.FormDestroy(Sender:TObject);
//回调函数:当定时器到点后,就会调用该函数,该函数的格式有一定的讲究,可以参照以下写:
procedure TimerProc(hwnd:HWND;uMsg,idEvent:UINT;dwTime:DWORD); stdcall;
killtimer(handle, idEvent);//关闭定时器
//主函数:在主函数里定义定时器并开始运作:比如在一个按纽事件里写:
procedure TForm1.Button1Click(Sender: TObject);
identer:=settimer(0,0,2000,@timerfun);//两秒
if identer=0 then //定时器没有创建成功。
Delphi 回调函数及例子
3 .回调函数通常作为参数传递给系统API,由该API来调用。
4. 回调函数可能被系统API调用一次,也可能被循环调用多次。
回调函数主要用于一些比较费时的操作,或响应不知道何时将会发生的事件,回调函数提供了一种异步的机制,相对于同步执行,提高了效率。
1、定义一个回调函数类型,跟一般的函数过程的定义并没有什么区别,但其定义必须根据需要满足回调函数的函数要求,唯一的区别在于在函数或过程的定义后面必须声明其为windows标准调用;
例:type THDFunction= function(I:integer;s:string):integer; stdcall;
对于过程的声明:type THDProcedure=procedure(s:string); stdcall;
2、 然后根据此原形定义一个相应的函数或过程,对于这个函数或过程来说名字没有什么要求,对函数其参数的类型和返回值的类型必须和定义的回调函数类型完全一致,对于过程来说,只需要其参数类型一样就可以了。
例:根据上面的函数和过程的原形定义一个相应的函数和一个相应的过程。
函数原形定义:Function HdFunExample(k:integer,sExam:string):integer; stdcall;
过程定义:procedure HdProExample(sExam:string);stdcall;
Function HdFunExample(k:integer,sExam:string):integer; stdcall;
procedure HdProExample(sExam:string);stdcall;
假设有如下调用函数: function DyHdFunExample(HdFun:THDFunction;I:integer):boolean;
注:在调用函数中通过对函数指针的处理可以直接调用回调函数(即调用函数中的那个是回调函数类型的参数,直接操作它),使回调函数履行一定的操作。即在调用函数中实现回调函数的功能。
I:=DyHdFunExample(@HdFunExample,i);
TCallbackFunc = procedure ();stdcall;
procedure AFunc(Callback: TCallbackFunc);
procedure MyCallback();stdcall;//回调函数
ShowMessage('Callback function');