点击表示另一个TCollection的TCollectionItem属性无响应问题
解决嵌套TCollection在设计器中无法弹出编辑对话框的问题
嘿,我完全懂你第一次折腾嵌套TCollection时的郁闷——代码编译全过,结果设计器里点那个三点按钮啥反应都没有,本来想着不就是点字符串类型的子项嘛,哪用得着啥特殊编辑器?其实这是Delphi设计器的一个小坑,默认编辑器对嵌套集合的支持真的不太行,哪怕子集合里都是简单类型也一样。
给你几个肯定能解决的步骤:
1. 注册子集合和子集合项的编辑器
Delphi的设计器不会自动识别自定义的嵌套集合类型,哪怕你用的是默认的TCollectionEditor也得手动注册。假设你的子集合是TMySubCollection,对应的项是TMySubItem,在单元的initialization段加上这段代码:
RegisterClass(TMySubItem); RegisterCollectionEditor(TMySubCollection, TMySubItem, TCollectionEditor);
TCollectionEditor是Delphi自带的默认集合编辑器,注册之后设计器才知道该用它来打开你的子集合。
2. 给父集合项的子集合属性加对特性
父集合项里的子集合属性必须加上[Collection]特性,而且要保证属性的读写逻辑正确初始化集合。举个例子:
type TMyParentItem = class(TCollectionItem) private FSubCollection: TMySubCollection; procedure SetSubCollection(Value: TMySubCollection); public constructor Create(Collection: TCollection); override; destructor Destroy; override; published // 关键是这里的[Collection]特性 property SubCollection: TMySubCollection read FSubCollection write SetSubCollection [Collection]; end;
然后在构造函数里初始化子集合,析构函数里释放:
constructor TMyParentItem.Create(Collection: TCollection); begin inherited; FSubCollection := TMySubCollection.Create(TMySubItem); end; destructor TMyParentItem.Destroy; begin FSubCollection.Free; inherited; end; procedure TMyParentItem.SetSubCollection(Value: TMySubCollection); begin FSubCollection.Assign(Value); end;
3. 别忘了注册父集合相关的类型
同样在initialization段注册父集合和父集合项:
RegisterClass(TMyParentItem); RegisterCollectionEditor(TMyParentCollection, TMyParentItem, TCollectionEditor);
最后提个小细节:做完这些之后最好重启一下Delphi IDE,有时候设计器的缓存会导致注册不生效。要是你把这些集合封装成组件了,记得重新安装组件才行。
内容的提问来源于stack exchange,提问作者Domus
相关产品推荐
相关产品推荐

