发信人: hyy (活着便精彩), 信区: BorlandDev
标 题: 关于对象事件方法
发信站: BBS 哈工大紫丁香站 (Thu Oct 28 18:36:40 2004)
今天看书有个体会,发上来给大家看看
记得以前在做动态组件创建的时候,需要给这个组件添加一个事件处理函数,比如
var
myEdit : TEdit;
...
begin
myEdit := TEdit.Create;
myEdit.Parent :=self;
MyEdit.OnClick := MyOnClick; <-------
...
end;
这个添加的事件MyOnClick需要在窗体类中去定义,而不能是在Implement部分直接定义的
一个过程,以前一直困惑不明白为什么?今天看书才明白了其中的缘由,不知道体会的对
不对?
OnClick是类里的一个事件,其实就是一个特殊的属性。其用如下方法来声明
...
published
property OnClick TNotifyEvent read FOnClick write FOnClick;
private
FOnClick : TNotifyEvent;
...
而TNotifyEvent是这样定义的
type
TNotifyEvent = procedure(Sender:TObject) of Object;
end;
即标识一个对象方法指针类型,可以用对象方法指针来引用的是一个对象方法。
如:
var
method :TMethod;
Evt:TNotifyEvent;
begin
method.code := MethodAddress('ButtonClick');//取得ButtonClick方法的地址
method.Data := Self; //对象实例指针
Evt := TNotifyEvent(method); //把对象方法传递给对象方法指针
Evt(Sender); //调用这个ButtonClick方法
end;
对象方法变量就是一个记录(结构体),它存储了两个地址:1、对象方法代码的地址2、
对象实例的地址。其定义如下:
type
TMethod = record
Code, Data: Pointer;
end;
就是说传递给对象方法指针的函数需要有self指针,而一般的函数是不具备这个参数的,
所以无法作为事件处理函数的。而对象的方法则具备了隐含的self指针。
--
________ ________
/| \ / |\
/|| \ / ||\
||| | |||
||| 向你推荐 | Delphi |||
||| | |||
※ 来源:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM: 202.118.235.183]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.791毫秒