delphi的procedure of object
- 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的更多相关文章
- Delphi 中的 procedure of object
转载:http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 总结:TMyEvent = procedure of object; ...
- Delphi 中的 procedure of object (类方法存在一个隐藏参数self),简单深刻 good
其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构,看下李维的VCL架构剖析可以很好理解type TMyEvent = procedure of object;这是一种数据类型 ...
- Delphi调用爷爷类的方法(自己构建一个procedure of Object)
Delphi通过inherited 可以调用父类的方法,但是没有提供直接调用父类的父类的方法(爷爷类),通过变通的方式实现如下: 假设父类是TFather,爷爷类TGrand,调用爷爷类的Write方 ...
- procedure of object 对象的函数指针
应用:http://www.cnblogs.com/del88/p/6361117.html 有 class of object ----- 类的类型 那么自然有 方法的类型,方法的类型 分为两种: ...
- 在 DELPHI 中 procedure 型变量与 method 型变量的区别
Procedure型变量: 在DELPHI中,函数.过程的地址可以赋给一个特殊类型的变量,变量可用如下方式声明: var p : procedure(num:integer); //过程 或: var ...
- delphi project of object
http://www.cnblogs.com/ywangzi/archive/2012/08/28/2659811.html 其实要了解这些东西,适当的学些反汇编,WINDOWS内存管理机制,PE结构 ...
- Delphi:与VCL同步(Synchronize()、用消息来同步)
看本文时,可以同时参考:Delphi中线程类 TThread实现多线程编程(事件.临界区.Synchronize.WaitFor……) 先说一下RTL和VCL RTL(Run-Time library ...
- delphi 一个线程和主界面的交互的演示代码
求一个线程和主界面的交互的演示代码求一个线程和主界面的交互的演示代码.线程和主界面处于两个Unit.线程中的user中不能引用主窗口.我只是想学习一下,线程和主界面交互的方法.去网上查了好几天资料,能 ...
- Delphi中的函数指针判断是否为空
delphi函数指针 只有@@p才代表了函数指针本身的地址 assigned(p) 判断是否为空 或者用 @p=nil 来判断函数指针是不是为空 Delphi中的函数指针实际上就是指针,只是在使用 ...
随机推荐
- 机器学习(ML)八之正向传播、反向传播和计算图,及数值稳定性和模型初始化
正向传播 正向传播的计算图 通常绘制计算图来可视化运算符和变量在计算中的依赖关系.下图绘制了本节中样例模型正向传播的计算图,其中左下角是输入,右上角是输出.可以看到,图中箭头方向大多是向右和向上,其中 ...
- JAVA Main方法中调用非静态方法
在JAVA中静态方法中只能调用其他,静态方法.main方法都是静态方法,如果想调用其它的方法,要么只能是其它的静态方法.还有一种方法就是将当前类实例化在调用它的非静态方法 public class t ...
- 剑指offer自学系列(一)
题目描述:输入n个整数,找出其中最小的k个数,例如,输入{4,5,1,6,2,7,3,8}这8个数字,最小的4个数字是1,2,3,4 题目分析:首先我能想到的是先对数组排序,从小到大,然后直接输出想要 ...
- Spring配置数据源的三种方法
前言:今天接触新项目发现用的是JNDI配置数据源,用度娘倒腾了一会也没弄好,只好用平常用的方法,结果发现BasicDataSource和DriverManagerDataSource也是不同的,所以记 ...
- 实验吧-隐写术-刷新 刷新 快刷新(f5-steganography)
题目:刷新 刷新 快刷新 其实这就算是很好的提示了,刷新的时候就是F5嘛,这个题就是F5隐写,用f5-steganography来解题. 题中的图片: f5-steganography下载链接:htt ...
- HDU - 2602 Bone Collector(01背包讲解)
题意:01背包:有N件物品和一个容量为V的背包.每种物品均只有一件.第i件物品的费用是volume[i],价值是value[i],求解将哪些物品装入背包可使价值总和最大. 分析: 1.构造二维数组: ...
- UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)
题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...
- 如何生成 SSH keys, 并在 Github 或 Gitlab 等上添加密钥
1 打开 Git Bash $ 2 输入 dir, 确认当前文件夹,并切换到想存密钥文件即pub文件的路径 $ dir 3 生成 密钥命令 ssh-keygen -t rsa -C "{ y ...
- C语言预处理理论2
C语言预处理理论1.头文件包含(1)#include <>和#include ""区别:<>专门用来包含系统提供的头文件(就是系统自带的,不是程序员自己写的 ...
- cf 758D - Ability To Convert
从后往前贪心就好了.各种各样0的情况太BT了.. (各种爆long long,f**k) #include<bits/stdc++.h> #define LL long long #def ...