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;//一种对象方法的类型 
    ------------------------------------------------------------
    TMyEvent = procedure of object;

    实际上,TMyEvent类型是包含两个域的一个记录,其中一个域是Code,也就是和TMyProc一样的,另一个域是Data,他保存着一个对象。

      Button2.OnClick := Button1Click;
    这样的赋值,实际上是将窗体类的对象form1给data域,将Button1Click这个函数的地址给Code域

    --------------------------

    TMouseProc = procedure (X,Y:integer);

    TMouseEvent = procedure (X,Y:integer) of Object;

    TMouseProc只是单一的函数指针类型;

    TMouseEvent是对象的函数指针,也就是对象/类的函数/方法

    区别在于类方法存在一个隐藏参数self,也就是说两者形参不一样,所以不能相互转换。

    这也就是为什么delphi中可以这样赋值 button1.onClick:=button2.onClick;

    却不能这样赋值 button1.onclick=buttonclick; (buttonclick为本地函数,button2.onclick为类方法)的原因!

  • 相关阅读:
    vue中computed计算属性和methods区别
    java解决跨域问题
    redis服务端开启
    使用excel生成商品条形码
    MySQL主键自增时SQL写法/当前时间写法
    修改MySQL数据库密码
    MySQL5.6.42解压版安装教程
    完全卸载MySQL数据库
    IDEA快捷键及xml文件中网址报错
    IDEA导入外部包
  • 原文地址:https://www.cnblogs.com/rogge7/p/4551841.html
Copyright © 2011-2022 走看看