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 是类过程(类函数),用法如下:
、与普通函数相同点:可以像一般的函数和过程一样在类的实例里作为对象方法调用;
、与普通函数不同点:可以不通过对象,而是通过类来直接调用。
也就是说,一般函数和过程必须通过类的实例(对象)来调用,而类过程(类函数)则可以不必通过该类的实例来调用。通过类来调用函数或者过程,可以定义和实现一些不能或者不适合作为某一特定对象行为的方法。
应用:
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();
ap := CCC;
ap();
end; unit Unit1; interface uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, AdvEdit; type
TForm1 = class(TForm)
edt1: TAdvEdit;
edt2: TAdvEdit;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
procedure myonExit(sender:tobject);
end; var
Form1: TForm1; implementation {$R *.dfm}
procedure TForm1.myonExit(sender: tobject);
begin
if tadvedit(sender).Text='a' then
begin
ShowMessage('a');
end
else
if tadvedit(sender).Text='b' then
begin
ShowMessage('b');
end;
end; procedure myonExit2(sender:tobject) ;
begin
if tadvedit(sender).Text='c' then
begin
ShowMessage('c');
end
else
if tadvedit(sender).Text='d' then
begin
ShowMessage('d');
end;
end; procedure TForm1.btn1Click(Sender: TObject);
type
x1=procedure(sender:tobject)of object;
x2=procedure(sender:tobject);
var
y1:x1;
y2:x2;
begin
y1:= myonExit; //带隐藏的self
y2:= myonExit2;//不带隐藏的self y1(edt1); //edt框是a或b 时弹出 a或b消息框
y2(edt1); //edt框是c或d 时弹出 c或d消息框 //edt1.OnExit:= myonExit; //not can use myonExit2
end; end.

delphi的procedure of object的更多相关文章

  1. Delphi 中的 procedure of object

    转载:http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 总结:TMyEvent = procedure of object; ...

  2. Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good

    其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...

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

    Delphi通过inherited 可以调用父类的方法,但是没有提供直接调用父类的父类的方法(爷爷类),通过变通的方式实现如下: 假设父类是TFather,爷爷类TGrand,调用爷爷类的Write方 ...

  4. procedure of object 对象的函数指针

    应用:http://www.cnblogs.com/del88/p/6361117.html 有 class of object ----- 类的类型 那么自然有 方法的类型,方法的类型 分为两种: ...

  5. 在 DELPHI 中 procedure 型变量与 method 型变量的区别

    Procedure型变量: 在DELPHI中,函数.过程的地址可以赋给一个特殊类型的变量,变量可用如下方式声明: var p : procedure(num:integer); //过程 或: var ...

  6. delphi project of object

    http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构 ...

  7. Delphi:与VCL同步(Synchronize()、用消息来同步)

    看本文时,可以同时参考:Delphi中线程类 TThread实现多线程编程(事件.临界区.Synchronize.WaitFor……) 先说一下RTL和VCL RTL(Run-Time library ...

  8. delphi 一个线程和主界面的交互的演示代码

    求一个线程和主界面的交互的演示代码求一个线程和主界面的交互的演示代码.线程和主界面处于两个Unit.线程中的user中不能引用主窗口.我只是想学习一下,线程和主界面交互的方法.去网上查了好几天资料,能 ...

  9. Delphi中的函数指针判断是否为空

    delphi函数指针 只有@@p才代表了函数指针本身的地址   assigned(p) 判断是否为空 或者用 @p=nil 来判断函数指针是不是为空 Delphi中的函数指针实际上就是指针,只是在使用 ...

随机推荐

  1. openCV 3.4 windows下的配置说明

    链接: https://pan.baidu.com/s/1dkS_G8ZSBD8EnhYeEFZxhQ 密码: xu99 (从官网下的, 但360会提示有毒, 哈哈哈) 运行exe, 解压openCV ...

  2. 微信小程序—显示当前时间

    问题:  在页面上显示当前时间(日期) 方法: 1.在util.js (创建项目自动生成)中: // util.js const formatTime = date => { const yea ...

  3. imp.load_source的用法

    imp.load_source(name,pathname[,file])的作用把源文件pathname导入到name模块中,name可以是自定义的名字或者内置的模块名称. 假设在路径E:/Code/ ...

  4. 012.CI4框架CodeIgniter, 加载并调用自己的Libraries库

    01. 在Libraries目录创建一个Mylib文件,内容是一个简单的类 <?php namespace App\Controllers; class Home extends BaseCon ...

  5. Web application architecture overview

  6. 《ES6标准入门》(阮一峰)--6.正则的扩展

    1.RegExp 构造函数 在 ES5 中,RegExp构造函数的参数有两种情况. 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag). var regex = new Re ...

  7. 关于安装openfiler

    简介 Openfiler 由rPath Linux驱动,它是一个基于浏览器的免费网络存储管理实用程序,可以在单一框架中提供基于文件的网络连接存储 (NAS) 和基于块的存储区域网 (SAN).Open ...

  8. Ubuntu不会放弃32位应用程序

    Ubuntu 开发人员澄清,人们以为 Ubuntu 将在 Ubuntu 19.10 和后续版本中放弃对运行 32 位应用程序的支持,但“根本不是这种情况”.那么这究竟是怎么一回事呢?前几天 Ubunt ...

  9. oracle查询SQL优化相当重要

    如果表中的时间字段是索引,那么时间字段不要使用函数,函数会使索引失效. 例如: select * from mytable where trunc(createtime)=trunc(sysdate) ...

  10. FULLTEXT INDEX全文索引

    给现有的wxinfo表的sourceUrl 字段创建全文索引 ALTER TABLE wxinfo ADD FULLTEXT INDEX sourceUrl (sourceUrl) 创建全文索引前: ...