TCollection(50分)

  • 主题发起人 主题发起人 qf0421
  • 开始时间 开始时间
Q

qf0421

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样让控件使用TCollection和TCollectionitem类的属性?
 
先看看帮助?我没用过……
 
TCustomGrid的Columns就是TCollection。我还未仔细看。
 
To qf0421:
TCollection 正式的称呼应该是集合类,它能够包含 TCollectionItem 类型
的集合元素。
该类主要用于控件的制作,如果一个控件拥有一个 TCollection (子)类型的
Property,Delphi 会自动为这个 Property 注册该属性的属性编辑器,即当
在 Object Inspector 中选中该属性时,右边会自动出现 ... 按钮。当点击
该按钮时,会弹出一个子属性编辑窗口,默认有“新建”、“删除”两个按钮。
当点击“新建”时,会生成一个 TCollectionItem (子)类的子对象。

选择这个子对象时,在 Object Inspector 中就可以编辑该子对象的属性。

但是 Delphi 如何知道 TCollection 的 子对象 TCollectionItem 的类型
呢?因为控件往往是继承了 TCollectionItem ,如 TDBGrid 的 TDBGridColumns
拥有 TColumn 类的子对象。原因在这里,请看 TCollection 类的构造函数:

constructor TCollection.Create(ItemClass: TCollectionItemClass);
begin
FItemClass := ItemClass; // 在这里注册了子对象的类型
FItems := TList.Create;
end;

TDBGrid 是这样做的:

constructor TCustomDBGrid.Create(AOwner: TComponent);
begin
...
FColumns := CreateColumns;
...
end;

function TCustomDBGrid.CreateColumns: TDBGridColumns;
begin
Result := TDBGridColumns.Create(Self, TColumn);
end;

constructor TDBGridColumns.Create(Grid: TCustomDBGrid; ColumnClass: TColumnClass);
begin
// 调用 TCollection 类构造函数注册子对象的类型
inherited Create(ColumnClass);
FGrid := Grid;
end;

说的不当之处,请多指教。:-)
From: BaKuBaKu

 
BaKuBaKu,可以转载吗?
 
Sure.

From: BaKuBaKu
 
对照vcl,自己作一个
 
接受答案了.
 
后退
顶部