TListView问题

sxqinge 2012-05-09 10:44:01
以为自己对这个控件有所了解了,今儿个随意测试了个玩意,居然出了问题,百思不得其解,汗颜之,特发出来请大家给与指点。
程序思路如下,表格共有10列,放个定时器每秒钟横向填入一个数字,直至该行填完,然后再增加一行,如此循环:

void TfrmTest::tmr1Timer(TObject *Sender)
{
int Row = lv->Items->Count-1;
TListItem* Item = lv->Items->operator [](Row);
if( NULL == Item ) {
Item = lv->Items->Add(); Item->Caption = "0";
}
else {
int nCount = Item->SubItems->Count;
if( nCount >= 10 ) {
Item = lv->Items->Add(); Item->Caption = "0";
}
}

Item->SubItems->Add("1");//问题产生的行, ERROR:List Index out of bounds.
}
...全文
1035 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhimingcom 2013-01-09
  • 打赏
  • 举报
回复
BCB就是这样的,设定了11列。 SubItems里面不一定有10项(除去标题列), 手动插入后才会有。
ccrun.com 2012-05-09
  • 打赏
  • 举报
回复
我的测试工程中,ListView有10列,你的有多少列?
sxqinge 2012-05-09
  • 打赏
  • 举报
回复
谢谢妖哥的详细指点,但是我觉得我们的代码实现的内容基本差不多呢?我的可能是看起来比较生涩难懂了点。。。但是执行完这个函数后还是提示同样的错误,不得其解了。。。

//在定时器中的函数。执行完后报list index out of bounds.
void TfrmMain::AddDatas(TAdvListView* lv, const AnsiString Str, int &Value)
{
int Port = Str.ToIntDef(0);
if( Port <= 0 ) return;
if( m_CommForms[Port]->MeasValue == Value ) return;
Value = m_CommForms[Port]->MeasValue;//这个值可以实时抄读上来的,没有问题。

// int Row = lv->Items->Count-1;
// TListItem* Item = lv->Items->operator [](Row);
// if( NULL == Item ) {
// Item = lv->Items->Add(); Item->Caption = "1";
// }
// else {
// int nCount = Item->SubItems->Count;
// if( nCount >= 10 ) {
// Item = lv->Items->Add(); Item->Caption = "1";
// }
// }
//
// AnsiString tmp = IntToStr(Value);
// Item->SubItems->Add(tmp);
TListItem* li;
static int i = 0;
if( lv->Items->Count > 0 )
li = lv->Items->Item[lv->Items->Count-1];
else {
li = lv->Items->Add(); li->Caption = i++;
}

if( li->SubItems->Count >= 9 ) {
li = lv->Items->Add(); li->Caption = i++;
}
else li->SubItems->Add(Value);
}
ccrun.com 2012-05-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
///////////////////////////////////////////////
额,妖哥我这逻辑怎么混乱了呢?若是方便的话麻烦帮忙分析下
[/Quote]

刷新,使劲刷新一下先。然后看3楼代码。
ccrun.com 2012-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
TListItem* Item = lv->Items->operator [](Row);

这一句是啥意思?
[/Quote]

TListItem* Item = lv->Items->operator [](Row);
作用相当于:
TListItem* Item = lv->Items->Item[Row];

这样写增加了代码的非简单性,加强了代码的非自然风格,符合了我们一贯的:“将简单的事情复杂化,将复杂的事情困难化,将困难的事情不可能化”的原则。
sxqinge 2012-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
TListItem* Item = lv->Items->operator [](Row);

这一句是啥意思?
[/Quote]
获取表格最后一行的Item信息。lv是TListView的指针。

///////////////////////////////////////////////
额,妖哥我这逻辑怎么混乱了呢?若是方便的话麻烦帮忙分析下
ccrun.com 2012-05-09
  • 打赏
  • 举报
回复
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
static int i = 0;

TListItem *li;

if (lv->Items->Count > 0)
{
li = lv->Items->Item[lv->Items->Count - 1];
}
else
{
li = lv->Items->Add();
li->Caption = i++;

return;
}

if (li->SubItems->Count >= 9)
{
li = lv->Items->Add();
li->Caption = i++;
}
else
li->SubItems->Add(i++);
}
银点 2012-05-09
  • 打赏
  • 举报
回复
TListItem* Item = lv->Items->operator [](Row);

这一句是啥意思?
ccrun.com 2012-05-09
  • 打赏
  • 举报
回复
你这个逻辑看着混乱啊。
sxqinge 2012-05-09
  • 打赏
  • 举报
回复
很奇怪的是,如果我在增加一行时,把子项的每项都进行初始化,那就没问题了:

for( int i=0; i<10; i++ )
Item->SubItems->Add("0");//此处还得设置个值,如果Add里面的内容是空的话,
//(即Add("")赋值方式)也是提示同样错误。

现在我就不想给其初始化,这是不是我的控件哪个项的参数需要改变下呢?
sxqinge 2012-05-09
  • 打赏
  • 举报
回复
我的共有11列,第一列(Caption)给隐藏了的。
应该不存在超出列的事情,对此感觉很困惑。。。

13,825

社区成员

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

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