在TControl中有WM_LBUTTONUP的消息响应函数,如下:
procedure TControl.WMLButtonUp(var Message: TWMLButto[
][
][
]nUp);
begin
inherited;
if csCaptureMouse in ControlStyle then MouseCapture := False;
if csClicked in ControlState then
begin
Exclude(FControlState, csClicked);
if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
//调用 TControl.Click 函数
end;
DoMouseUp(Message, mbLeft);
end;
而TControl.Click 函数如下:
procedure TControl.Click;
begin
if Assigned(FOnClick) and (Action <> nil) and (@FOnClick <> @Action.OnExecute) then
FOnClick(Self)
else if not (csDesigning in ComponentState) and (ActionLink <> nil) then
ActionLink.Execute(Self)
else if Assigned(FOnClick) then
FOnClick(Self);
//调用 FOnClick 指向的事件响应函数
end;
也就是说,当控件接收到左键释放消息时,将调用TControl.WMLButtonUp函数,
此时如果鼠标坐标在客户区内TControl.WMLButtonUp将调用TControl.Click函数,
TControl.Click函数检查FOnClick成员,如其不为空就调用其指向的过程,也就调用了
控件的OnClick消息响应函数。可见Delphi中的OnClick事件不是一个系统消息的响应,
而是[
][
]通过指针进行的过程调用。