Delphi 中的 procedure of object

news/2024/7/5 23:21:43

理论:     //适用于实现不是某一特定过程或函数

          type 
               TNotifyEvent = procedure(Sender: TObject) of object; 
      首先:procedure 也是类型,可以理解为过程类型,定义过程的参数结构,而具体的实现可以动态赋值 
 onclick那样例子: 
     声明:  οnclick= 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.οnclick=buttonclick; (buttonclick为本地函数,button2.onclick为类方法)的原因!


http://www.niftyadmin.cn/n/1414926.html

相关文章

js堆栈内存的释放

### JS中的堆栈内存> 俗称叫做作用域(全局作用域/私有作用域)> - 为js代码提供执行的环境(执行js代码的地方)> - 基本数据类型值是直接存放在栈内存中的> **堆内存**> 存储引用数据类型值的(相当于一个…

AssignmentManager.java及其相关代码浅析(1)

分析源代码,一般可以依循项目的功能结构自顶向下或者自底向上进行分析,像HBase我们可以从顶部client发起访问开始,也可以从最小物理存储结构Cell开始分析。或者是由于某种契机,从中间发散开来进行分析,比如由发生异常的…

asp.net2.0中的DataSource概述

在asp.net2.0中提供了新一代的数据访问工具--DataSource。它为简单的数据库开发提供了便捷的方式。一、DataSource & ADO.NetADO.Net是微软先进的数据库访问技术,那它和DataSource控件相比有哪些区别呢?1、ADO.Net是微软新一代的数据库访问技术&…

图像处理质量评价标准之PSNR

<span style"font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">PSNR&#xff08;Peak Signal to Noise Ratio&#xff09;峰值信噪比&#xff0c;是一种全参考的图像质量评价指标。计算公式如下&#xff1a;</span>其…

hibernate 复合主键

2019独角兽企业重金招聘Python工程师标准>>> hibernate 复合主键 转载于:https://my.oschina.net/u/2308739/blog/425051

是谁偷了手机的电量——LTE空闲态管理

UE在LTE系统内的移动性分为空闲态的移动性和激活态的移动性&#xff0c;在文章《LTE系统内切换流程分析》我们分析了UE激活态下的移动性管理&#xff0c;本文来说明空闲态下的UE移动性管理流程。 当UE开机但是没有与无线网络建立连接时的状态&#xff0c;称为UE处于空闲态。空…

如何查看端口+如何关闭开放端口

查看端口 在Windows 2000/XP/Server 2003中要查看端口&#xff0c;可以使用Netstat命令&#xff1a;依次点击“开始→运行”&#xff0c;键入“cmd”并回车&#xff0c;打开命令提示符窗口。在命令提示符状态下键入“netstat -a -n”&#xff0c;按下回车键后就可以看到以数字形…

Excel中如何转换时间为数字

如何将标准时间转换为以小时或者分钟为单位的数值呢&#xff1f; 如图中所示A1 B1的单元格格式修改为时间 C1的单元格格式设置为常规&#xff0c; 在C1中输入如下公式即可实现转换 HOUR(B1-A1)MINUTE(B1-A1)/60SECOND(B1-A1)/3600 HOUR(B1-A1)*60MINUTE(B1-A1)SECOND(B1-A1)/…