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

关于THashedStringList.AddObject

2012-12-16 
关于THashedStringList.AddObject求助会点delphi,接触c++时间不长,问题如下:sl在Form的Create函数里初始化

关于THashedStringList.AddObject求助
会点delphi,接触c++时间不长,问题如下:sl在Form的Create函数里初始化(sl= new THashedStringList;)

AnsiString aa=Qry1->FieldByName("xm")->AsString;
char* p=aa.c_str();
sl->AddObject("a",(TObject*)"1");
sl->AddObject("b",(TObject*)"2");
sl->AddObject("c",(TObject*)p);
sl->AddObject("d",(TObject*)(String*)"6");
int i=sl->IndexOf("c");
if (i!=-1)
ShowMessage(sl->Strings[i]+"="+(char*)sl->Objects[i]);
能正常显示选定的记录的值。但是放到循环里就不行了。
for (int i=0;i<5;i++)
{
AnsiString dztm= Qry1->FieldByName("dztm")->AsAnsiString;
AnsiString sXM= Qry1->FieldByName("xm")->AsAnsiString ;
char * pXM;
pXM =   sXM.c_str() ;
sl->AddObject(dztm,(TObject*)pXM) ;
Qry1->Next();
}
下面是用一个按钮显示List里的值:
void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
int nIndex=sl->IndexOf(AnsiString(Edit1->Text)) ;
if (nIndex!=-1)
{
AnsiString xm=(char *) sl->Objects[nIndex];
ShowMessage(xm );
}
else ShowMessage(IntToStr(nIndex)+"Err");
}
显示的结果为空,偶尔有乱码,总之不是正确的结果。Qry1是没有问题的,有1w条数据,且都有xm。请达人解惑
[最优解释]
给你造成困惑的主要原因就是AnsiString的.c_str()返回值不确定,这个问题在以前讨论过许多次,AnsiString的.c_str()返回的指针,只在当前使用时有效,如果你将这个指针赋给一个char *对象,在后面继续使用的话,其指向的数据,可能已经不再是预想中的字符串,所以,循环代码改成:
AnsiString dztm, sXM;
for (int i = 0; i < 5; i++)
{
    dztm = Qry1->FieldByName("dztm")->AsAnsiString;
    sXM = Qry1->FieldByName("xm")->AsAnsiString;
    char *p = new char[sXM.Length() + 1];
    strcpy(p, sXm.c_str());
    p[sXM.Length] = 0x0;
    sl->AddObject(dztm, (TObject *)p);

    Qry1->Next();
}


当然,还有个重要的地方,记住数据用完或者需要重新添加数据到List中的时候,需要用一个循环来释放Object中占用的资源,如:
for (int i = 0; i < 5; i++)
    delete [](char *)(sl->Objects[i]);

[其他解释]
引用:
给你造成困惑的主要原因就是AnsiString的.c_str()返回值不确定,这个问题在以前讨论过许多次,AnsiString的.c_str()返回的指针,只在当前使用时有效,如果你将这个指针赋给一个char *对象,在后面继续使用的话,其指向的数据,可能已经不再是预想中的字符串,所以,循环代码改成:
C/C++ code??123456789101112AnsiStr……

十分感谢ccrun,感觉c++的指针确实复杂,以后还要请教。

热点排行