窗体上有一个listbox,从数据库查询一系列地区名称。然后现在的业务处理时从一个文件夹查询一系列excel文件,文件名称就是地区名,然后我需要实现的是如果发现文件夹中的文件的名称和listbox中不一样,有可能这些excel文件的总数大于listbox中的count数。
我现在的实现逻辑是用tstringlist将excel文件名称读取出来,然后和listbox比较,然后发现有相同的,则删除,现在就出了index溢出的错误。大家帮忙看看,然后不知道是否还有更好的思路来处理。谢谢
  for nI:=0 to FList.Count-1  do //Flist 是读取excel文件名的TstringList 类
  begin
     for mI:=lst1.Items.Count-1 downto 0   do   //lst1 是listbox ,读取数据库中地区的名称
     begin
       if LeftStr(FList.Strings[nI],10) = LeftStr(lst1.Items.Strings[mI],10) then //经常在这里lst1就提示溢出错误
       begin
          try
             lst1.Items.Delete(mI);//删除后listbox的count减一,因此只要找到就退出mi循环
          except
            on e:Exception do
            begin
               ShowMessage(e.message);
            end;
          end;
          Break;
       end;
     end;
  end;

解决方案 »

  1.   

    由于有可能的delete操作,lst1列表的下标是会变化的,这就是“溢出错误”(下标越界)的原因从描述看就是两个列表的比较,可以利用TStringList.IndexOf
      

  2.   

    既然是找到就退出,应该不会出现索引越界的。
    indexof是全字符匹配, 向例子中的部分字符如何匹配呢?
      

  3.   

    用TStringList.IndexOf比較必要時設置斷點show出從哪裡溢出的
      

  4.   

    由于是删除listbox,所以报错的是LeftStr(lst1.Items.Strings[mI],10)这个。而不是tstringlist,所以有点搞不懂
      

  5.   

     lst1.Items.Delete(mI);后lst1的items.count会变化,后面循环不会有问题吗?
      

  6.   

    在删除下标的时候会弄乱总数据值大小
    试试for downto吧
      

  7.   

    现在的解决办法就是如果发现有相同的,就将listbox1.item.[i]的值设置为'  ',然后再将item的值为空的删除,就可以了。