现在的位置: 首页 > 综合 > 正文

Delphi中的事件处理过程

2013年10月02日 ⁄ 综合 ⁄ 共 1517字 ⁄ 字号 评论关闭
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;
以上是个人对事件的理解,如果有理解错误,欢迎指正。

抱歉!评论已关闭.