这个问题很奇怪,关于Strings的

COKING 2011-03-01 11:58:05
取出一个ListBox1的第1行数据。
第一个正确,第2行会编译错误。
貌似Strings 重载了[]。还不行??

String S1=ListBox1->Items->operator[](0);
String S2=ListBox1->Items[0];
...全文
81 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cbm6666 2011-03-02
  • 打赏
  • 举报
回复
这是我的代码 读取方式有点不同 但能完全正确的读取 逐笔写入 ini文件

String aa;

void __fastcall TForm1::Button5Click(TObject *Sender)
{
if (List1->Count>0)
{
for (int i=0;i<=List1->Count-1;i++)
{
aa=List1->Items->Strings[i];
IniWrite("歌曲清单",IntToStr(i),aa,IniName);
}
}
}
COKING 2011-03-02
  • 打赏
  • 举报
回复
OK明白!结贴!
勉励前行 2011-03-02
  • 打赏
  • 举报
回复
ListBox1->Items 是一个属性:__property Classes::TStrings* Items
该属性是一個指针, TStrings虽然重载了[]操作符,但对指针是无效的.
所以 ListBox1->Items[0]这样用是错误的.
要使用重载的[]操作符的话,这样用:
ListBox1->Items->operator[](0); 或 //在指针是使用[],只能是数组的用法.
(*ListBox1->Items)[0] ; //对对象使用[]操作符才能有效.

ListBox1->Items->Strings 是一个属性: __property AnsiString Strings[int Index],该属性使用时,需要配合[]操作符一起用.否则编译器该报错.与类TStrings重载的操作符[]是同样的效果.

这与Delphi语法有些不一样.delphi中的写法确实简单些,但没能区分指针与对象,需要参考上下文才知道是指针或是对象,delphi虽然带来了语法上的直观,但容易隐藏错误.属性就是这样,方便了用户,带来了灵活性,但同时也带来问题(隐藏的编译期无法检查的类型错误). 与C++那强壮严谨的作风,不大兼容.

jone7319 2011-03-02
  • 打赏
  • 举报
回复
String S1=ListBox1->Items->operator[](0);
String S2=ListBox1->Items->Strings[0];

13,873

社区成员

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

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