急,请问做控件高手一个问题.(150分)(150分)

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
最近,我在做一个控件,研究了dbgrid的源码(delphi自带的),有一个问题我始终搞不懂:
以下是我截取的部分代码:

type
...................................
TCustomDBGrid = class;
...........................
TCustomDBGrid = class(TCustomGrid)
.................
很奇怪,TCustomDBGrid 怎么被定义了两次,想不通,而且TCustomDBGrid = class 有什么意义,
它什么也不继承.渴望高手指点迷津.
 
TCustomDBGrid = class;
相当于TCustomDBGrid = class(Tobject)
 
pink_wt朋友,您说的不错,我也知道这一点
可是后来又对TCustomDBGrid 进行了重新定义
TCustomDBGrid = class(TCustomGrid)
为什么要这样做?
有没有朋友先把dbgrid的源代码先研究一下,再帮帮我.
 
你最好看看类声明这方面的书!

之所以在
TCustomDBGrid = class(TCustomGrid)
之前声明
TCustomDBGrid = class;
是因为在 TCustomDBGrid = class(TCustomGrid) 之前和TCustomDbGrid=Class两行之间有其他的类引用TCustomDBGrid
所以如果少了TCustomDbGrid=Class这句,编译就通不过,故需要先声明TCustomDbGrid是一个Class,
否则编译器不知道TCustomDbGrid到底是什么东东


 
我同意:独孤剑的说法!补充:你可以看看TString 和TStringList 也许对你有帮助!
 
独孤剑朋友,您的讲法我也同意,只是为什么要这样做,感觉有点象程序设计里的递归,
type
...................................
TCustomDBGrid = class;
...........................
TCustomDBGrid = class(TCustomGrid)
您说把TCustomDBGrid = class换成其它的,比如: THello = class;
然后把在上面两行之间引用TCustomDBGrid的变量的类型全部改成THello ,是不是可以呢?
效果是不是一样呢?


 
在Delphi中,像TCustomDBGrid = class;这样的定义称为“forward declaration”,
它必须被一个“defining declaration”所说明,如
TCustomDBGrid = class(TCustomGrid) end;
注意:forward declaration没有end关键字,所以不是“完整的声明”,它的主要目的
是解决类的相互引用问题。
你上面说的全部改成THello是完全可以的,在Delphi中太多这样的例子了。
具体说明,可以参考Delphi帮助中的“Forward declarations
and mutually dependent classes”一节。
 
thx1180 朋友,您讲得很有道理,不过
“它的主要目的是解决类的相互引用问题。“
这句话,我有点不懂,表示什么意思啊。
 
一个类在没有被声明前是不可以被其它类引用的,即不能出现在其它的类的接口中,
现假设有两个类需要互相引用,即都需要在接口中出现对方.可是你写完后却发现编绎
不能通过,因为Delphi会告诉你类没有声明,所以找不到.可是,无论你把哪个类声明在前面
因为是互相引用,所以总有一个类是没有声明的.所以Delphi引入前置声明.
这样在一开始就声明了这两个类,然后这两个类就可以在接口中互相引用了.注意.在前置声明后
一定要真正完成这个类的声明.否则编绎器报错.
 
是我按下了编辑框上的 B 所至, 我以为会把 “相互”变成黑体。
 
确实是为了前置引用:
比如
TAA=Class;
TBA=Class(TComponent)
FA:TAA;
end;
TAA=Class(TComponent)
Procedure dosomething(Param1:TBA);
end;
如果你不这样申明的话,在TAA的方法dosomething里就无法定义使用TBA类型的数据
或者在TBA里就无法用到TAA类型的数据,这种情况一般用在某两个对象的内部属性或
方法中要交叉引用,比如TDBGridColumns与TCustomDBGrid之间、TColumn与TColumnTitle之间
就是这样
 
yunye朋友,您的这种说法,我像应该很正确。能告诉我您的eamil吗? 
我的EMAIL:yzdzc@163.com
 
后退
顶部