Delphi的事件是属性的一种特别类型,事件处理过程系由windows捕获消息再将消息封装成事件的过程。如下是以 OnMouseDowng事件为例,说明事件的执行过程。
以下是在controls.pas里的代码:
//定义事件的方法指针,TMouseEvent 是一种鼠标事件类型,是过程指针。
TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer) of object;
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;
以上是个人对事件的理解,如果有理解错误,欢迎指正。