zoukankan      html  css  js  c++  java
  • [转]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;

  • 相关阅读:
    Django-orm-自关联
    Android中像素相关
    Android导入项目工程时报错“ Invalid project description”
    汇编之64位操作系统安装debug.exe
    mygui初探(二)皮肤编辑器
    mygui初探(一)基础
    一种破解静态链接库(.lib)的简单方法
    工作这两年的经验与教训
    3D单机游戏《天鹰教》源码发布(二)
    HUSTOJ的Windows版评判内核(二)
  • 原文地址:https://www.cnblogs.com/minghang/p/5625241.html
Copyright © 2011-2022 走看看