在ListView中建几个Columnitem := lstTest.items.add;
item.caption := str1;
item.subitems.add(str2);
item.subitems.add(str3);执行到item.caption := str1;时报错:list index out of bounds(2)
我建了5个Column,不至于溢出呀
请高人指点

解决方案 »

  1.   


    我一直都用得好好的,突然就不行了.
    我看了一下,我一共5个Column,添加的时候居然是从第4个Column开始写,所以会out of bounds(2)可为什么item.caption会从第4个开始呢,怎么都查不出原因
      

  2.   


    没办法贴图呢,就是报这个错,抱错的同时能看到把第一个caption的值写到了第4个Column
      

  3.   

    仔细看了一下,我这段代码是写在IdServer.Excute里面,测试的时候客户端只发送了一条信息就报错了,所以应该不存在同步的问题,而且我后来加了M_Lock.Enter和M_Lock.Leave保护ListView,还是报同样的错
      

  4.   

    TThread.synchronize 同步函数
      

  5.   

    靠, 前后码才几十行,有什么不可贴的??
    你这样子还不如不问问题。
    到了第7楼才出现IdServer谁知道你怎么添加怎么删除?
    listview你不用线程操作本来就有错。
      

  6.   


    procedure TServer.IdServerExecute(AThread: TIdPeerThread);
    var
      msg: String;
    begin
      msg := AThread.Connection.ReadLn;
      if msg = '' then exit;  ReadMsg(msg);
    end;procedure TServer.ReadMsg(msg: String);
    var
      item: TListItem;
    begin
      M_Lock.Enter; //M_Lock是全局变量TCriticalSection
      item := ListView1.Items.Add;
      item.Caption := '0';  //单步执行到这里报错
      item.subItems.Add('1');
      item.subItems.Add('2');
      item.subItems.Add('3');
      item.subItems.Add(msg);
      M_Lock.Leave;
    end;
    重新开个进程同样报错
      

  7.   

    写错了,是重开个线程来执行ReadMsg,同样会报错呢。
      

  8.   


    用Synchronize解决问题,原来VCL的可显示控件只能用主线程来控制。我在Execute里面另外初始化一个用来处理消息的线程类,再把ListView添加的过程函数放在Synchronize里面,问题就解决了。