首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

自定义属性的有关问题,

2012-02-09 
自定义属性的问题,高手请进!!在继承类中加入了如下属性:private:TList*listpublic:__propertyTStringList

自定义属性的问题,高手请进!!
在继承类中加入了如下属性:
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里声明吧!

热点排行