Assigned(FOnMouseLeave)和FOnMouseLeave(self),到底做了什么?(50分)

  • 主题发起人 主题发起人 daiwei
  • 开始时间 开始时间
D

daiwei

Unregistered / Unconfirmed
GUEST, unregistred user!
看到别人的程序,对button定义MouseLeave事件,如下:
1、
procedure TButton1.MouseLeave(var Msg: TMessage);
begin
if Assigned(FonMouseLeave) then
FOnMouseLeave(self);
end;
这两句作了什么,我发现其它的事件,如MouseUp,MouseDown,MouseMove基本上
都是这两句(参数不同外),这些都是不同的事件呀!

2、程序原来是如下定义的,多了第1-5行
procedure TButton1.MouseLeave(var Msg: TMessage);
begin
inherited; //1
if csLButtonDown in ControlState then //2
begin //3
self.MouseUp(mbLeft,[ssLeft],0,0); //4
end; //5
if Assigned(FonMouseLeave) then
FOnMouseLeave(self);
end;
我发现有没有第1-5句,都有MouseLeave的功能,怎么回事?
 
怎么没有人?
 
WINDOW消息不是太懂,听
 
onmouseentern 移入
onmouseleave 离开
捕捉鼠标移动进入buttnon和离开button的消息。
 
我发现核心的两句:
if Assigned(FonMouseLeave) then
FOnMouseLeave(self);

这两句作了什么,其它的事件,如MouseUp,MouseDown,MouseMove基本上也
都是这两句(参数不同外),谁能解释一下。这些都是不同的事件呀!

 
FonMouseLeave指向函数的指针,
if Assigned(FonMouseLeave) then
FOnMouseLeave(self);
是指如果FonMouseLeave<>nil那么,就调用FonMouseLeave所指向的函数.

 
Assigned(FonMouseLeave) 判断指针是否有效——即用户(程序)是否有处理这个事件的函数
FOnMouseLeave(self); 调用用户的处理函数,SELF为参数
inherited; 如果该事件父类已经有处理函数,调用

这是DELPHI处理事件的方法,你可以用这个方法来创建自己的事件
 
Assigned:函数:测试函数或过程变量是否为空
Assigned(FonMouseLeave) 判断指针是否为空
如果不为空则调用函数FOnMouseLeave(self);
 
无论MouseUp,MouseDown,MouseMove,都会发生onmouseleave事件,
因此当Assigned(FonMouseLeave)的时候,就执行预定义的FOnMouseLeave(self);
 
各位大侠:
其它的事件,如定义MouseUp,MouseDown,MouseMove事件基本上也
都是这两句(参数不同外),

如:
if Assigned(FonMouseUp) then
FOnMouseUp(self,x,x,x);
------------------------------------
if Assigned(FonMouseDown) then
FOnMouseDown(self,x,x,x);
-------------------------------------
if Assigned(FonMouseMove) then
FOnMouseMove(self);

这些都是不同的事件!谁能解释一下。FOnMouseLeave(self),FOnMouseMove(self);
FOnMouseDown(self,x,x,x),FOnMouseUp(self,x,x,x);指向了什么函数?
 
你先添加一个Form,然后放一个Button,然后为这个Button写一个事件,
在Form上点右键,选View as Text, 里面有
Object button1
...
onclick := button1click ;
这样的赋值,就是为这个指针赋值,
这个指针好像是在protected 里面以property ... :... TNotifyEvent的形式
出现的,而在Run-time,截获消息处理时,
if Assigned(FonMouseLeave) then
FOnMouseLeave(self);
如果你对这个指针赋了值(就是上面说的那个地方),就调用这个函数并传入参数.

语文不好,希望你能明白我说的
 
谢谢各位,大家看看csdn.net上的答复:

--------------------
这里的On...都是一个过程引用指针,你可以在控件定义中赵到这样的东西:

TABC..= class(..)
private
F...: ...
...
FOnMouseUp: TMouseEvent;
FOnMouseDown: TMouseEvnet;
FOnClick: TNotifyEvent;
protected
procedure DoClick; dynamic;
procedure DoMouseUp; dynamic;
....
public
...
published
property OnClick: TNotifyEvent read FOnClick write FOnClick;
...
end;

然后在控件的实现部分有这样的代码
procedure TAb.DoClick;
begin
if Assigned(FOnClick) then FOnClick(Self);
end;

这个例子说明:
1, 事件只是对用户定义过程的一个引用,如果用户没有为这个事件编写代码,则在控件中对过程引用的指针FOnClick等等为空指针。
2, 如果拥护编写了代码,则空间中的指针将指向这个过程,操作由下面的代码完成:
property OnClick: TNotifyEvent read FOnClick write FOnClcik;
3, 在适当的时候,比如空间接受到一个消息,这个消息说明鼠标在空间上点击了,那么空间应该调用拥护的事件过程。通过下面的代码实现
if Assigned(FOnClick) then //判断用户是否编写了事件
FOnClick(Self); //执行用户定义的事件过程

--------------------
 
听听不同程序员的理解和解释。反复几次,有助于我们新手更彻底的领悟。
 
多人接受答案了。
 
后退
顶部