procedure of object(一个特殊的指针类型)
2012-12-04 17:41
351 查看
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 是类过程(类函数),用法如下:
1、与普通函数相同点:可以像一般的函数和过程一样在类的实例里作为对象方法调用;
2、与普通函数不同点:可以不通过对象,而是通过类来直接调用。
也就是说,一般函数和过程必须通过类的实例(对象)来调用,而类过程(类函数)则可以不必通过该类的实例来调用。通过类来调用函数或者过程,可以定义和实现一些不能或者不适合作为某一特定对象行为的方法。
应用:
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(1);
ap := CCC;
ap(2);
end;
绿色通道: 好文要顶 关注我 收藏该文与我联系
墨者工作室
关注 - 1
粉丝 - 13
+加关注
0
0
(请您对文章做出评价)
« 博主上一篇:Delphi
插件(Plug-ins)创建、调试与使用应用程序扩展
» 博主下一篇:Delphi中的容器类(一)
相关文章推荐
- procedure of object(一个特殊的指针类型)
- Frames : 一个特殊的窗口类型
- 类成员函数指针的特殊之处(成员函数指针不是指针,内含一个结构体,需要存储更多的信息才能知道自己是否virtual函数)
- 面试题---实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。
- GetStockObject是一个HGDIOBJ类型
- 有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
- string类型其实就是一个指针
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
- object-c的特殊数据类型sel-怎样理解?
- C++输出时指针类型自动转换为bool类型输出的一个小疑问
- SWF运行时判断两个DisplayObject是否同个类型,属于flash professional库中的同一个元件
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- type-id必须是一个指针、引用、算术类型
- 对一个程序的思考2(各编译器指针类型)
- C++ 指针(任何一个指针本身的类型都是unsigned long int型)
- 函数指针数组的应用,但在类内作为成员使用,需要特殊处理,指针类型要匹配
- 4.11_3 写一个程序打印出各种基本类型、几个指针类型
- 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
- C Primer plus 10.2 初始化一个double类型的数组,然后把该数组的内容拷贝至3个其它的数组中,使用带数组的表示方法的函数进行第一份拷贝,使用带指针表示方法和指针递增的函..
- js里怎么判断一个对象是否是日期类型,即Date,用typeof返回的是object