由于工作关系使用delphi已经有一年时间,在使用中我也在不断的摸索,在以后的实践中我会陆续把心得写下来,以备查阅。本文的主题是Delphi中 record类型使用中的几点总结。
我们知道Delphi的记录类型与C/C++的struct类型有相似之处,也有不同。我觉得最大的不同便是关于字段的初始化赋值,delphi不允许在声明记录类型时赋值字段,而C/C++允许在声明时复制字段。当然今天不讨论这一点,今天的重点是Delphi 中 record 类型中函数指针的使用技巧。
过程或函数(方法)指针是一种数据类型,“数据类型是指一个值的集合以及定义在这个值集上的一组操作“(引自《百度百科》”数据类型“词条)。简单地讲,过程或函数(方法)指针就是一种简单的类,即过程、函数(方法)的”类“,这种”类“简单到只定义了符合”类“的格式。
举例1:
type TFun1 = procedure(sender: ClassA); TFun2 = function(sender: ClassA): ClassB; end;
例1中TFun1是一个过程的指针数据类型,TFun2 是一个方法(函数)的指针数据类型:
TFun1这个数据类型对应的过程格式是
procedure (sender: ClassA);
而TFun2这个数据类型对应的函数(方法)格式是
function(sender: ClassA): ClassB;
举例2:
var
sd:ClassA; fun1:TFun1; fun2:TFun2;
例2中声明了两个指针变量,然而却没有赋值,接下来我们可以声明并定义相应过程和函数:
procedure fun1def(sender:ClassA); begin //填写执行代码 end;
function fun2def(sender:ClassA):ClassB; begin //填写执行代码 end;
fun1 := fun1def; fun2 := fun2def;
引用fun1、fun2时可以直接这样做fun1(sd)、fun2(sd)。以上便是过程、函数(方法)指针的用法。下面进入主题:用record来做class做的事。
我们知道,类与结构体(记录类型)的最大区别就是在于类可以包含方法和函数,但是声明类有时候又过于繁琐,所以我想用声明和使用简单的记录类型来做”类“可以做的事。首先声明一个record和它的一个指针,在这个record中可以声明一个函数指针,指针指向的函数的参数也声明在这个record中,或者更简单的是我们可以直接在声明指针类型的时候把这个类型的函数(过程)的参数设为上面声明的record的指针,这样更为简单。
废话少说,上菜。。一个完整的例子
举例3:
unit Usrct; interface type PTstruct = ^Tstruct; TFun1 = procedure(sender: PTstruct); TFun2 = procedure(); Tstruct = record sender: TObject; fun1: TFun1; fun2: TFun2; end; procedure fun1def(sender: PTstruct); procedure fun2def(); procedure funRun(); var srct: Tstruct; implementation procedure fun1def(sender: PTstruct); begin //要执行的代码 end; procedure fun2def(); var scr: PTstruct; begin scr := @srct; //要执行的代码 end; procedure funRun(); begin srct.fun1 := fun1def; srct.fun2 := fun2def; end; end.在使用中需要注意的是record、指针类型、结构体指针的声明顺序。