存储自定义结构出错
typedef struct AList
{
int iNO;
AnsiString aName;
} TAList;
每次把结构存储到文件中,再重新读去的时候就出错,是不是ansiString不能放到结构种?
问题点数:50、回复次数:8Top
1 楼netsys2(来电!)回复于 2005-12-26 09:31:31 得分 20
是ansiString是个类,存储的是类对象地址,是没有用的,应该改为
typedef struct AList
{
int iNO;
char aName[80];
} TAList;Top
2 楼constantine(飘遥的安吉儿)回复于 2005-12-26 09:45:48 得分 0
同意,bcb中好像不可以像delphi中一样是用shortstring,不然也可以使用Top
3 楼hongss(笑霸王)回复于 2005-12-26 09:57:39 得分 2
呵呵,我前几天也碰到这个问题。
在几位星星的指导下完成了。
就像netsys2(来电!)大大那样做就可以了。
Struct不支持复杂类型。Top
4 楼whitelion(www.ccproj.com)回复于 2005-12-26 10:00:18 得分 4
我一直用String变量
将你的代码写成
typedef struct AList
{
int iNO;
String aName;
} TAList;
Top
5 楼constantine(飘遥的安吉儿)回复于 2005-12-26 10:07:21 得分 4
typedef AnsiString String; //
应该是ShortString吧,我记得bcb也有的,不过用起来不太一样
String 从上面看不是等价 AnsiString 码Top
6 楼orcher(orcher)回复于 2005-12-26 10:19:58 得分 0
那如果aName是不定长的呢,有可能超过自己定义的任何量啊Top
7 楼netsys2(来电!)回复于 2005-12-26 10:36:10 得分 0
如果aName是不定长的呢,有可能超过自己定义的任何量啊
----->
方法一:估计最长的数据长度来设置char aName[80];
方法二:重新设计结构
typedef struct AList
{
int iNO;
int iNameLen;
char *aName;
} TAList;
写文件时,先写前面的
int iNO;
int iNameLen;
然后再根据iNameLen写aName,
就是说每次写盘操作得做两次。
读也是一样,先读int iNO;int iNameLen;
再根据iNameLen读出aName数据。
Top
8 楼songhtao(三十年孤独)回复于 2005-12-26 10:56:25 得分 20
你可以从TComponet继承写一个类然后用持久化的方法保存。
This example shows how to use the built-in VCLCLX component streaming support to convert any component into a string and convert that string back into a component.
AnsiString ComponentToString(TComponent c)
{
AnsiString as;
TMemoryStream* pms = new TMemoryStream();
TStringStream* pss = new TStringStream(as);
try
{
pms->WriteComponent(&c);
pms->Seek(0, soFromBeginning);
ObjectBinaryToText(pms, pss);
pss->Seek(0, soFromBeginning);
as = pss->DataString;
}
catch(...)
{
ShowMessage("Streaming error.");
}
delete pms;
delete pss;
return as;
}
TComponent StringToComponent(AnsiString as)
{
TMemoryStream* pms = new TMemoryStream();
TStringStream* pss = new TStringStream(as);
TComponent *pc;
try
{
ObjectTextToBinary(pss, pms);
pms->Seek(0, soFromBeginning);
}
catch(...)
{
ShowMessage("Streaming error.");
}
pc = pms->ReadComponent(NULL);
delete pms;
delete pss;
return *pc;
}
Top




