onclick是哪来的? (80分)

  • 主题发起人 主题发起人 mxsbt1
  • 开始时间 开始时间
M

mxsbt1

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟很是疑惑,onclick是指向事件处理过程的指针,这个过程到底是怎样触发的,
我只知道程序建立了一个消息循环,窗体可以得到消息,这个消息是怎样和onclick
联系上的,《delphi5开发人员指南》中对消息说了一大堆,但对onclick等事件的由
来一笔代过 请高人指点。
 
你可以看看VCL的源代码就知道了。(在delphi或bcb中使用find in files,选择source目录,查找onclick,你可以找到你想要的)
 
procedure TControl.Click;
begin
{ Call OnClick if assigned and not equal to associated action's OnExecute.
If associated action's OnExecute assigned then call it, otherwise, call
OnClick. }
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);
end;
你键入tcontrol,按ctrl后双击,也可以查看其他的tedit,tbutton
 
Click is called automatically when the user left-clicks the control. Component
or application code can call Click to simulate a user mouse click. This is often
done in menu actions and hotkey handlers.

As implemented in TControl, Click queries whether the OnClick event handler exists
and is different from the OnExecute handler for the control Action. If this is
true, the OnClick event handler is called. If this is false, and the Action OnExecute
event handler exists, the Action?
s Execute method is called. Override Click to provide additional behavior.
类定义中
TNotifyEvent = procedure Click; dynamic;
property OnClick: TNotifyEvent;
程序中
对象名.OnClick := NowClick;
执行某一对象的OnClick事件了。

 
我是说onclick是哪来的,而不是onclick怎样指向事件处理过程,也不是click方法怎
么定义的。
是不是onclick本身就是消息?
 
onclick事件实质上是一个属性,当鼠标点击时,属性获取消息执行代码。如:

procedure WMLButtonDblClk(var Message: TWMLButtonDown); message WM_LBUTTONDBLCLK;
 
上述代码我理解,上面的过程和onclick属性怎样联系的?
 
FOnClick: TNotifyEvent;
procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
procedure Click;
property OnClick: TNotifyEvent read FOnClick write FOnClick stored IsOnClickStored;
对于TControl类来说,WMLButtonUp(var Message: TWMLButtonUp)是响应WM_LBUTTONUP消息
的过程,此过程中它又调用了预先定义的Click动态过程,在Click过程定义中有:
is Assigned(FOnClick) then FOnClick(Self),FOnClick是一事件指针,根据属性定义
property OnClick: TNotifyEvent read FOnClick
FOnClick就等于OnClick,如果我们给OnClick赋了值,就意味着给FOnClick赋了值,这样层层
调用下来,当我们用鼠标单击构件时,它就会执行OnClick中的代码了
 
to 0738
果然是高手。多谢
 
在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事件不是一个系统消息的响应,
而是[:)][:)]通过指针进行的过程调用。
 
to 晓鹤
同样厉害,可惜分已经发了,下次一定多给,十分感谢
 
后退
顶部