关于THashedStringList.AddObject求助

kaman007 2012-11-29 07:48:14
会点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。请达人解惑
...全文
222 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wirner 2013-07-24
  • 打赏
  • 举报
回复
引用 1 楼 ccrun 的回复:
给你造成困惑的主要原因就是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]);
当然,还有个重要的地方,记住数据用完或者需要重新添加数据到List中的时候,需要用一个循环来释放 妖哥, 能解释一下吗
kaman007 2012-11-29
  • 打赏
  • 举报
回复
引用 1 楼 ccrun 的回复:
给你造成困惑的主要原因就是AnsiString的.c_str()返回值不确定,这个问题在以前讨论过许多次,AnsiString的.c_str()返回的指针,只在当前使用时有效,如果你将这个指针赋给一个char *对象,在后面继续使用的话,其指向的数据,可能已经不再是预想中的字符串,所以,循环代码改成: C/C++ code??123456789101112AnsiStr……
十分感谢ccrun,感觉c++的指针确实复杂,以后还要请教。
ccrun.com 2012-11-29
  • 打赏
  • 举报
回复
给你造成困惑的主要原因就是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]);

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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