[转]delphi的procedure of object

delphi的procedure of object(一个特殊的指针类型)

理论:     //适用于实现不是某一特定过程或函数
          type
               TNotifyEvent = procedure(Sender: TObject) of object;
      首先:procedure 也是类型,可以理解为过程类型,定义过程的参数结构,而具体的实现可以动态赋值
 onclick那样例子:
    
声明:  onclick= procedure(Sender: TObject,a :integer) of
object;以后你就可以把TNotifyEvent作为过程用了,而不用考虑它实现什么功能,你想onclik  里用户写了什么,都是一样的
        if assign(onclick) then
          onclick;
     这样只要TNotifyEvent可以执行,程序就去执行它,控件就是这样实现事件的
     procedure 指针占4个字节,保存在过程的地址. procedure of object占8个字节,保存过程的地址和类的地址
     procedure of object 是类过程(类函数),用法如下:
         1、与普通函数相同点:可以像一般的函数和过程一样在类的实例里作为对象方法调用;
         2、与普通函数不同点:可以不通过对象,而是通过类来直接调用。
    也就是说,一般函数和过程必须通过类的实例(对象)来调用,而类过程(类函数)则可以不必通过该类的实例来调用。通过类来调用函数或者过程,可以定义和实现一些不能或者不适合作为某一特定对象行为的方法。
  应用:
     delphi中经常见到以下两种定义
     Type
         TMouseProc = procedure (X,Y:integer);  //一种普通的过程
         TMouseEvent = procedure (X,Y:integer) of Object;//一种对象方法的类型

两者样子差不多但实际意义却不一样,两者的区别就在于TMouseEvent类型的方法必须在一个对象里。类方法存在一个隐藏参数self,也就是说两者形参不一样,所以不能相互转换 .
   TMouseProc只是单一的函数指针类型;
   TMouseEvent是对象的函数指针,也就是对象/类的函数/方法

procedure   TForm1.BBB(I:   Integer);
begin
    showmessage( ‘BBB: ‘   +   IntToStr(I));
end;

procedure   TForm1.CCC(I:   Integer);
begin
    showmessage( ‘CCC: ‘   +   IntToStr(I));
end;

procedure   TForm1.Button1Click(Sender:   TObject);
    type
        Taaa   =   procedure   (i:integer)   of   object   ;
var
    ap:   Taaa;
begin
    ap   :=   BBB; //这里有一个隐含Self,完整格式: self.BBB;这里把BBB这个方法赋给ap这个变量,注意BBB与ap的声明原型要一样,不然会有错
    ap(1);
    ap   :=   CCC;
    ap(2);
end;

时间: 2024-10-03 20:36:55

[转]delphi的procedure of object的相关文章

Delphi 中的 procedure of object

其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型的定义,他定义了一个可以在类中使用的函数类型区别于type TMyProc = procedure; TMyEvent 和 TMyProc 都定义了一个函数类型,他们的差别是,TMyProc 不可以用在类中定义事件,TMyEvent 却可以. 如果你想知道问什么,那就需要深入了解事件类型以及函数类型

Delphi(procedure&procedure .... of object )函数指针与方法指针 .

Delphi(procedure&procedure .... of object )函数指针与方法指针 . delphiobjectbuttonintegerdelphi中经常见到以下两种定义 Type TMouseProc = procedure (X,Y:integer); TMouseEvent = procedure (X,Y:integer) of Object; 两者样子差不多但实际意义却不一样, TMouseProc只是单一的函数指针类型; TMouseEvent是对象的函数指针

Delphi调用爷爷类的方法(自己构建一个procedure of Object)

Delphi通过inherited 可以调用父类的方法,但是没有提供直接调用父类的父类的方法(爷爷类),通过变通的方式实现如下: 假设父类是TFather,爷爷类TGrand,调用爷爷类的Write方法: 1 2 3 4 5 6 7 8 9 type   TWriteProc=procedure of Object; var   WriteProc:TWriteProc; ....   TMethod(WriteProc).Code:[email protected].Write;   TMet

procedure of object 对象的函数指针

有 class of object ----- 类的类型 那么自然有 方法的类型,方法的类型 分为两种: 普通方法: function abc(): string; 类的方法 function TLei.abc(): string; 所以定义方法的类型的时候 就有如下区别: 根据英文意思你就知道了,procedure of object(一个对象的过程) 看测试代码: procedure TForm1.BBB(I: Integer); begin showmessage('BBB:' + Int

[Delphi]过程Procedure动态调用

过程也可以像通用变量一样声明.调用 procedure HelloWorld; begin ShowMessage('HI'); end; procedure HelloWorld2(a:String); begin ShowMessage('HI'); end; procedure TFormSplash.FormCreate(Sender: TObject); var     myproc:Procedure;    myproc2:Procedure(a:String); begin my

delphi project of object

http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type  TMyEvent = procedure of object;这是一种数据类型的定义,他定义了一个可以在类中使用的函数类型区别于type  TMyProc = procedure; TMyEvent 和 TMyProc 都定义了一个函数类型,他们的差

DELPHI中的多线程【深入VCL源码】

线程的基础知识 线程的组成.线程有两部分组成. 1.一个是线程的内核对象,操作系统用它来对线程实施管理.内核对象也是系统用来存放线程统计信息的地方. 2.另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量. 进程从来不执行任何东西,它只是线程的容器.线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中.这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作.因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空

TMsgThread, TCommThread -- 在delphi线程中实现消息循环(105篇博客,好多研究消息的文章)

在delphi线程中实现消息循环 在delphi线程中实现消息循环 Delphi的TThread类使用很方便,但是有时候我们需要在线程类中使用消息循环,delphi没有提供. 花了两天的事件研究了一下win32的消息系统,写了一个线程内消息循环的测试. 但是没有具体应用过,贴出来给有这方面需求的DFW参考一下.希望大家和我讨论. {----------------------------------------------------------------------------- Unit

Delphi子类调用祖父类的虚函数

因为看Delphi书的时候,就产生了疑惑.老讲调用父类虚函数,但是万一需要调用祖父虚函数怎么办?后来又经常在C++里看到,就更疑惑了 type TA = class procedure ShowMsg; virtual; end; TAClass = class of TA; TB = class(TA) procedure ShowMsg; override; end; TShowMsg = procedure of object; TC = class(TB) private FGrandF