请解释TNotifyEvent用来做什么?(200分)

  • 主题发起人 主题发起人 blue_morning
  • 开始时间 开始时间
B

blue_morning

Unregistered / Unconfirmed
GUEST, unregistred user!
问题有两个: (第一个完整回答完的FW得分,有特点的补充5-20分)
1.谁给我解释一下TNotifyEvent和下面这段程序的意思。(50分)
2.谈谈关于VCL对Win API的包装和消息处理机制 (100分)提供资料或URL链接(一个10分)

property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;

procedure TCustomLabel.CMMouseEnter(var Message: TMessage);
begin
inherited;
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self); //这里如何解释
end;
 
我的理解
type TNotifyEvent = procedure (Sender: TObject) of object;
它是一个带有一个tobject参数的过程类。
onMouseEnter是个属性,当你要读他的时候,就把FOnMouseEnter返回,当你给这个属性赋值时,
就存在FOnMouseEnter变量中。

FOnMouseEnter(Self);就是调用你定义的onMouseEnter事件,执行。当然调用前要先判断一下是否定义if assigned()。
 
Delphi对winapi的调用,大部分都在windows单元中,通过动态链接库调用,把winapi的参数转换为Delphi的变量
基本上没有任何特数变化,名字都一样。
 
to: Brave
type TNotifyEvent = procedure (Sender: TObject) of object;
它是一个带有一个tobject参数的过程类。
有什么用呢?一般用做什么?

这段程序来自VCL的源码(关于TTable),inherited去做什么了(没有必要关心吗),在TCustomLabel中没有关于MoseClick的操作,
在TTlable中为什么申明一下就可以了?
 
type
TMyProc = procedure(Sender: TObject); //声明函数类型
TMyMethod = procedure(Sender: TObject) of object; //声明方法类型

方法就是对象中的函数,所以要of object.

事件实际上是对象中的函数的指针,所以它的类型要of object.

inherited用在override继承的方法中,用来调用父类的方法。

procedure TCustomLabel.CMMouseEnter(var Message: TMessage);
begin
inherited; //相当于inherited CMMouseEnter(Message); 这时调用父类的方法
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self); //因为FOnMouseEnter是方法指针所以,和方法一样调用
end;
 
A: type TNotifyEvent = procedure (Sender: TObject) of object;
它是一个带有一个tobject参数的过程类。
有什么用呢?一般用做什么?
Q: 定义一个类型.
通过这个定义,使得你对此类型变量定义变得简单.(相当于内部定义了Integer,TForm等)
在很多VCL控件中你都可以看到用它定义的变量(也就是事件),如FOnMouseEnter,FOnClick等.
A:FOnMouseEnter(Self); //这里如何解释
Q:如果你在Label的OnMouseEnter事件里加入了自己处理的代码,则FOnMouseEnter 会不等于nil
则Assigned(FOnMouseEnter) 为真.则表示TCustomLabel的CMMouseEnter(它是一个消息处理函数)不单要
完成系统所指定的工作还要调用你的OnMouseEnter事件中的代码.
A:谈谈关于VCL对Win API的包装和消息处理机制
Q:这个问题太大了.整体说来就是VCL控件为用户提供了一个可视化的编程环境,从本质上来说
每一个能获得焦点的VCL控件都是一个窗口类(inherited from TWinCtrol),它封装接管了所有
Windows消息,它通过virtual函数WndProc来实现消息的分发与处理.所以可能通过override此函数
来重新建立自己的消息处理机制.另在delhpi里也可以象vc中一样通过建立自己的消息处理映射来而不
重载wndproc来实现特定消息的处理.所以你在很在很多vcl控件的函数定义后面可以看到message关键词,
这就表示message后面指定的消息由这个函数处理.但它的优先级低于wndproc中处理的.再就是delphi中还是一
个特殊的消息处理函数defaulthandler.它用来处理所有未特殊处理的函数.你也可以通过重载它来扩展
自己的消息处理.
好了,不多说了,如果你想了解更多的我建议你找找书看看.打好基础,冰冻三尺非一日之寒
另,好象论坛里有一个贴子好象专门讲到vcl的消息处理机制.
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
541
import
I
I
回复
0
查看
674
import
I
后退
顶部