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. 习题两则的简化(利用for循环)

    习题一.打印26个英文字母 public class PrintChars { public static void main(String[] args) { char ch = 'a'; int ...

  2. Django(五)1 - 4章实战:从数据库读取图书列表并渲染出来、通过url传参urls.py path,re_path通过url传参设置、模板语法

    一.从数据库读取图书数据并渲染出来 1)app1/views.py函数books编写 [1]从模型下导入bookinfo信息 [2]从数据库获取图书对象列表 [3]把获取到的图书对象赋值给books键 ...

  3. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-time

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  4. maven启动报错No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?

    [INFO] Scanning for projects... [WARNING] [WARNING] Some problems were encountered while building th ...

  5. Spring Cloud 支付宝支付的流程

    沙箱环境又称沙盘,为了开发与调试所提供的环境,它与生产环境互相隔离,但具有生产环境几乎完全相同的功能蚂蚁金服开放平台——开发者中心1.https://openhome.alipay.com2.提供的调 ...

  6. metaspace 元空间

    为何移除持久代 它的大小是在启动时固定好的, 很难进行调优 -XX:MaxPermSize(默认64M) HotSpot 的内部类型也是Java对象: 它可能会在Full GC中被移动, 同时它对应用 ...

  7. 【LGR-(-8)】洛谷入门赛 #5 题解

    比赛链接 9道题. 注:题目名称中链接为题目链接,题号中链接为比赛内链接 题目编号 洛谷题号 题目名称 题目难度 A P5713 [深基3.例5]洛谷团队系统 \(\color{red}{入门}\) ...

  8. ACM-DFS Template

    自己写的DFSTemplate: // DFS_Template.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //DFS的思想是:一直向 ...

  9. springMVC:SSM整合

    环境要求 环境: IDEA MySQL 5.7.19 Tomcat 9 Maven 3.6 要求: 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识: 数 ...

  10. oracle11g数据库的安装

     先在 Oracle官网上下载11g  oracle Database 11g 第 2 版 (11.2.0.1.0) 标准版.标准版 1 以及企业版,适用于 Microsoft Windows (x6 ...