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. 018、MySQL取满足日期在两个日期之间的所有数据

    #查询 SELECT GZJK_CREATEDATE FROM abc_table WHERE ( ( GZJK_CREATEDATE >= UNIX_TIMESTAMP( '2019-08-0 ...

  2. jQuery事件 - toggle() 方法

    1.切换元素的显示与隐藏状态 实例 切换 <p> 元素的显示与隐藏状态: $(".btn1").click(function(){ $("p").h ...

  3. oracle进入CDB

    第一步:使用sys登陆 CONN sys/change_on_install AS SYSDBA; 第二步:查看现在的容器名称 SHOW con_name; 第三步:改变容器为PDB ALTER SE ...

  4. yolov3.cfg参数解读

    对于模型的优化,我们可以通过适当修改网络基本配置信息完成训练上的优化. yolov3.cfg文件: [net]# Testing #测试模式 batch=1 subdivisions=1# Train ...

  5. Linux: 桥接 NET HOST-only

    桥接 虚拟机会利用真实的网卡和真实计算机之间通信  还能和同一局域网之间的计算机之间通信 缺点:会耗费一个ip地址 NET:虚拟机会通过VMnet8 虚拟的网卡与真实计算机之间通信    如果真实计可 ...

  6. PLC与单片机执行指令区别

    单片机执行指令方式与PLC执行指令方式对比 . 映射 对顺序功能图并行分支的理解.   PLC与单片机都是顺序执行指令方式的. PLC执行指令分为3个阶段. PLC的一个指令周期包括 输入采样 程序执 ...

  7. checkbox checked属性值

    记住我1<input type='checkbox' /> 记住我2<input type='checkbox' /> <button onclick='hehe();' ...

  8. 如何更改RStudio(或R)中的默认目录

    方法一: Session -> Set Working Directory -> Choose Directory ... or shortcut (Ctrl+Shift+H) 方法二 s ...

  9. php.laravel.log

    看代码,原厂代码写的比较清楚,版本(laravel5.7) 简单使用,方便调试,详细使用需要详细查看文档. 在config/app.php 添加 'log' => env('APP_LOG', ...

  10. 新手学Java,有哪些入门知识点?

    很多小伙伴们在刚接触Java的时候,会有些迷茫,不知道该从哪里入手,不管是做前端还是后端,程序员都会用到JAVA,那该掌握哪些必要的基础知识呢.今天就跟大家分享新手学Java,有哪些入门知识点? 下面 ...