关于类型对像定义及引用问题,请大家帮忙!(100分)

顺顺

Unregistered / Unconfirmed
GUEST, unregistred user!
最近在分析一段代码,发现一个有意思的事.

在一个单元里,有如下定义
type
TCompareFunc = function (aData1, aData2 : pointer) : integer;
TDisposeProc = procedure (aData : pointer);
我不知道这样定义作用如何,不过在这个单元里也找不到 TDisposeProc,TCompareFunc 的过程/函数体代码.

然而在另一个单元对TTestClass 定义时,在 Create 时,却使用了TDisposeProc,TCompareFunc ,
TTestClass = class
private
FBinTree : TtdBinaryTree;
FCompare : TCompareFunc ;
FCount : integer;
FName : String;
protected

public
constructor Create(aCompare : TCompareFunc;
aDispose : TDisposeProc);
destructor Destroy
override;

procedure Clear;
end;

请问一下我要如何引用 TtestClass.create? 为什么
type
TCompareFunc = function (aData1, aData2 : pointer) : integer;
TDisposeProc = procedure (aData : pointer);
里没有过程代码?
 
什么有意思了?
最基本的的事件指针问题了。不过我还凑合明白一点。
如果你要开发控件,你就得又事件,事件是怎么做的呢,当然是一个属性了。
比如:
我们通常在在属性里能够看到比如onkeydown,onkeyup里面的许多参数都是通过声明一个过程类来实现的。
TOnclick=procedure(sender:tobject);
在你声明的类里你的属性是通过get,set函数进行传递的。其中对事件的传递使用的就是上面的类指针。
比如:声明一个类
txbutton=class
...
f1:TOnclick;
property Onclick:TOnClick read F1 write f1;
end;
//里面设置属性都需要这个指针。
当然也可以使用object关键字。不大常用。

通过上面可以知道,
TCompareFunc = function (aData1, aData2 : pointer) : integer;
TDisposeProc = procedure (aData : pointer);
这两个类型不需要传递self或者sender的一般函数的事件。。
具体比如我要声明一个事件
Type=class...我打字慢了,省略了。。。
procedure doOnCompare(.....);
property OnCompare:TCompareFunc write FCompareFun write FCompareFun;
而如果要使用doOnCompare进行通过IDE定义这个事件。。
procedure doOnCompare(....)
if Assigned (FOncomparefun) then
Foncomparefun (self, dsurface)

这个使我的理解。。希望各位大侠指正。

其实他的执行循序是这样的,先看你是不是通过属性写了这个事件,通过属性读写,指针到了Fcomparefun里面,最后连接到doCompare事件,最后你可以写你要覆写的函数。
中间的参数传递,通过你上面的指针声明来传递。

当然灵活的还可以当成一般的函数指针处理。。这个没有对象指针SENDER完全可以看成函数指针。
 
type
TCompareFunc = function (aData1, aData2 : pointer) : integer;
TDisposeProc = procedure (aData : pointer);
这种声明是定义了两个 “方法类型” 就如你定义 a = array of string;是数组类型一样。
之后的 FCompare : TCompareFunc 是声明一个变量。 FCompare是个TComparenFunc的变量,可以理解为TCompareFunc 是类型,Fcompare是它的变量。
这个变量必须有一个方法赋给它, FCompare才有效。

例如有这样2个方法

function getLength(aData1, aData2 : pointer) : integer;
begin
...
result := 0;
end;

procedure SetSomething(aData : pointer);
begin
...
end;

那么就可以这样初始化你的类。

var
ta: TTestClass;
begin
ta := Ttestclass.create(getLength, SetSomething);
/////
ta.free;

end;

如果还不明白就看看这个例子。 。

http://www.delphibbs.com/keylife/iblog_show.asp?xid=20484
 
谢谢大家了~ 平均分配
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
514
import
I
顶部