Delphi中的事件处理过程
2007-12-15 10:48
1111 查看
Delphi的事件是属性的一种特别类型,事件处理过程系由windows捕获消息再将消息封装成事件的过程。如下是以 OnMouseDowng事件为例,说明事件的执行过程。
以下是在controls.pas里的代码:
//定义事件的方法指针,TMouseEvent 是一种鼠标事件类型,是过程指针。
TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer) of object;
//定义事件类型变量
FOnMouseDown :TMouseEvent ;
//定义事件属性,当获取OnMouseDown的值时,返回FOnMouseDown指针变量,当给OnMouseDown赋值时,也就是FOnMouseDown赋值;
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
//在控件中定义获取WM_RBUTTONDBLCLK类型的消息。
procedure WMRButtonDblClk(var Message: TWMRButtonDblClk); message WM_RBUTTONDBLCLK;
//消息处理过程
procedure TControl.WMRButtonDblClk(var Message: TWMRButtonDblClk);
begin
inherited;
DoMouseDown(Message, mbRight, [ssDouble]);//调用DoMouseDown方法处理消息过程
end;
//DoMouseDown方法定义
procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
//DoMouseDown方法实现
procedure TControl.DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
begin
if not (csNoStdEvents in ControlStyle) then
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
else
MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);
end;
//关联FOnMouseDown的方法
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); dynamic;
procedure TControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);//如果FOnMouseDown过程指针有赋值,则调用FOnMouseDown所指向的方法,即OnMouseDown设置的值。
end;
以上是个人对事件的理解,如果有理解错误,欢迎指正。
以下是在controls.pas里的代码:
//定义事件的方法指针,TMouseEvent 是一种鼠标事件类型,是过程指针。
TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer) of object;
//定义事件类型变量
FOnMouseDown :TMouseEvent ;
//定义事件属性,当获取OnMouseDown的值时,返回FOnMouseDown指针变量,当给OnMouseDown赋值时,也就是FOnMouseDown赋值;
property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
//在控件中定义获取WM_RBUTTONDBLCLK类型的消息。
procedure WMRButtonDblClk(var Message: TWMRButtonDblClk); message WM_RBUTTONDBLCLK;
//消息处理过程
procedure TControl.WMRButtonDblClk(var Message: TWMRButtonDblClk);
begin
inherited;
DoMouseDown(Message, mbRight, [ssDouble]);//调用DoMouseDown方法处理消息过程
end;
//DoMouseDown方法定义
procedure DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
//DoMouseDown方法实现
procedure TControl.DoMouseDown(var Message: TWMMouse; Button: TMouseButton;
Shift: TShiftState);
begin
if not (csNoStdEvents in ControlStyle) then
with Message do
if (Width > 32768) or (Height > 32768) then
with CalcCursorPos do
MouseDown(Button, KeysToShiftState(Keys) + Shift, X, Y)
else
MouseDown(Button, KeysToShiftState(Keys) + Shift, Message.XPos, Message.YPos);
end;
//关联FOnMouseDown的方法
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); dynamic;
procedure TControl.MouseDown(Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Assigned(FOnMouseDown) then FOnMouseDown(Self, Button, Shift, X, Y);//如果FOnMouseDown过程指针有赋值,则调用FOnMouseDown所指向的方法,即OnMouseDown设置的值。
end;
以上是个人对事件的理解,如果有理解错误,欢迎指正。
相关文章推荐
- Delphi 给窗体上面所有的控件都挂上一个事件处理过程华软源码
- Delphi 给窗体上面所有的控件都挂上一个事件处理过程华软源码
- 从爬取微博中搜索的热门事件到数据分析处理全过程(一)
- iOS开发日记35-事件处理机制与图像渲染过程
- Global.asax的16个事件处理过程
- 通过消息拦截达到在Delphi控件中屏蔽原有事件处理的一种方法
- 如何在客户端写脚本触发一个服务器端事件处理过程.在线等.
- Android 碎片Fragment之(生命周期事件处理过程)
- UITouch事件处理过程详解
- linux输入子系统(input subsystem)之evdev.c事件处理过程
- iOS 事件处理机制与图像渲染过程
- Liferay 启动过程分析3-处理启动事件(第四部分)
- Global.asax的16个事件处理过程
- android中的触摸事件处理过程详解
- linux input子系统分析--子系统核心.事件处理层.事件传递过程
- QT类 Qevent事件处理过程 事件过滤器
- XMG 触摸事件的处理过程
- Delphi 2010 新增功能之: 手势编程[4] - 关于 OnGesture 事件过程的参数
- 两个例子均用现实的例子来解释委托事件的处理过程
- wxPython的事件处理过程详解