读书人

自定义属性的有关问题

发布时间: 2012-02-09 18:22:27 作者: rapoo

自定义属性的问题,高手请进!!
在继承类中加入了如下属性:
private:
TList * list;
public:
__property TStringList* List[int] = {read = rlist; write = wlist};

void __fastcall wlist(int i,TStringList*s)
{
if(!list)list = new TList();
if(i > = list-> Count)
for(int n = list-> Count; n < i+1; n++)list-> Add(new TStringList());
*(list-> Items[i])= *s;
delete s;
}

TStringList* __fastcall rlist(int i)
{
if(!list)list = new TList();
if(i > = list-> Count)
for(int n = list-> Count; n < i+1; n++)list-> Add(new TStringList());
return (TStringList*)list-> Items[i];
}

在将该控件拖到窗口上时,跳出“控件 ' '无父窗口”的报警,而在窗口类中
private:里已经定义了该组件。
当我把该属性从控件中删除时,控件无一点问题。
而该属性的方法和属性都没有在控件的其它方法中调用

现在觉得是在构造该属性的时候存在问题,
望各位高手帮忙,并能给出原因,在下不胜感激。


[解决办法]
怎么这么怪异,你有没有声明读写方法?
[解决办法]
初始list应该放在构造函数
[解决办法]
学习
[解决办法]
我此表示疑:
跳出“控件 ' '无父窗口”的报警,但当我把该属性从控件中删除时,控件无一点问题。


看看在控件初始化列表有: list(NULL)
同,查有有其他有初始化的指。


[解决办法]
由于控件被声明成了属性,所以会被存储到DFM文件中,程序运行时,将从DFM文件中初始化组件,有的VCL组件是必须需要父窗口的,而且父窗口必须是一个FORM,比如说TTOOLBAR组件中的小按钮,估计你的这个属性也是属于这一种.
当它从DFM文件中初始化时,它的父窗口并不存在,或者是父窗口的父窗口的....为NIL,造成了它检测到它的顶级窗口不存在,就出错了.


不知道你的控件是从基类继承的,可能基类存不使用DFM,所以也不会在LOADED时,Parent为Null的时候初始化.而你加了属性后,就会先于Parent初始化,造成错误.

不如你把类声明的代码贴全


[解决办法]
__property TStringList* List[int] = {read = rlist; write = wlist};
这个要在__publish里声明吧!

读书人网 >C++ Builder

热点推荐