发信人: 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)
页面执行时间:1.996毫秒