自制组件,TStrings 属性问题!!!急

klggg 2003-10-29 05:46:54
自制组件,其中有个属性是TStrings ,目的是产生一个例表供选择.
我在.h里做了以下定义.
TStrings *FFieldList;
__published:
__property TStrings *FieldList = { read = FFieldList, write =SetFieldList };
SetFieldList 函数是这样的
void __fastcall gggCodeSelect::SetFieldList(TStrings *str)
{
FFieldList=str;
}
编译安装包成功后。拖入自制的控件测试。在对象观察器里后到的 FieldList 属性,当点击该属性欲进行修改时提示:

---------------------------
Error
---------------------------
Cannot assign a nil to a TRichEditStrings.
---------------------------
OK
---------------------------

我试了一个下午了。请大家指点了!
...全文
35 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
klggg 2003-10-30
  • 打赏
  • 举报
回复
今早过来我试了一下。可以了!
大家都说出了实现的道理。其中 Lewolf(无名) 说的比较详细。
{
声明使用TStrings,实例化使用TStringList,我一般是这样的,因为Strings的编辑器是针对父类TStrings的,实例化可以是任何派生类的,当然自己派生的要注意一些的,系统提供的派生类都和父类有一样的特征。

}
ljianq(泉深水清) 和 aliker(吹口琴的猫) 的代码都可以正常通过.
geniusdhc也说得很对。真的很感谢大家,给我上了一堂课!结分..
ljianq 2003-10-30
  • 打赏
  • 举报
回复
修改一下:

TStringList *FFieldList;
__published:
__property TStrings *FieldList = { read = FFieldList, write =SetFieldList };

构造函数
__fastcall gggCodeSelect::gggCodeSelect()
{
FFieldList=new TStringList();
}

void __fastcall gggCodeSelect::SetFieldList(const TStrings *str)
{
FFieldList->Text=str->Text;
//原来的写法有问题,你传入的是指针,如果你在外面删除了str,则FFieldList变成NULL。
}
Lewolf 2003-10-29
  • 打赏
  • 举报
回复
声明使用TStrings,实例化使用TStringList,我一般是这样的,因为Strings的编辑器是针对父类TStrings的,实例化可以是任何派生类的,当然自己派生的要注意一些的,系统提供的派生类都和父类有一样的特征。
aliker 2003-10-29
  • 打赏
  • 举报
回复
TStrings是虚类吧!不能实例化,用TStringList吧!
void __fastcall gggCodeSelect::SetFieldList(TStrings *str)
{
FFieldList=new TStringList; //要有存放的空间
FFieldList->Assign(str);
}
yjy1001 2003-10-29
  • 打赏
  • 举报
回复
“TStringList 来做的。但常出现内存的问题”
一般情况下不会吧,是不是你写得有问题
贴出来 给高手们帮你看看吧(偶不是高手 ^-^)
yjy1001 2003-10-29
  • 打赏
  • 举报
回复
ccrun(老妖) 6:00才下班??
geniusdhc 2003-10-29
  • 打赏
  • 举报
回复
TStrings 是虚类不能够实例化,声明为TStrings 不一定就要用TStrings 构造实例呀。
klggg 2003-10-29
  • 打赏
  • 举报
回复
忘了说了。我用一开始就是用 TStringList 来做的。但常出现内存的问题。
根本通不过。我见系统里的控件都是声明成TStrings 类型的。
我想应该是通过 TStrings 来解决。
很希望有这方面的实例。我在网上打了,这方面的资料不太多呀:(
pp616 2003-10-29
  • 打赏
  • 举报
回复
TStrings *FFieldList;只是一个指针。不能直接用的。
Lewolf 2003-10-29
  • 打赏
  • 举报
回复
TStrings 是不能实例化的,这一点没有问题,从你的错误信息来看,你在构造函数中对这个属性没有实例化,因此编译时没有报错,但是属性编辑的时候,就会出现这个错误!

正确的做法是使用TStringList,并且在构造函数中需要加入

FFieldList = new TStringList;

对属性的存储数据进行实例化。
sfemil 2003-10-29
  • 打赏
  • 举报
回复
TStrings 是虚类不能够实例化,你修改成TStringList试试
BoyMgl 2003-10-29
  • 打赏
  • 举报
回复
为什么不用TStringList这个派生类?偶认为这个好用!
ccrun.com 2003-10-29
  • 打赏
  • 举报
回复
试试FFieldList->Assign(str);


要下班了。闪人。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧