我在删除ListBox中的某一项数据时出现异常,提示“List index out of bound(100)”说是下标越界(100)了,程序如下,大家帮忙瞧瞧,//lbSource和lbTarget为ListBox
procedure TfrmEmport.FormCreate(Sender: TObject);
begin
  data.dstSource.Open;
  lbSource.Clear;
  while not data.dstSource.Eof do
  begin  
    lbSource.Items.Add(data.dstSource.FieldValues['bh']);
    data.dstSource.Next; 
  end;
end;for i := 0 to (lbSource.Items.Count - 1) do
  
  if lbSource.Selected[i] then
  begin
    lbTarget.Items.Add(lbSource.Items.Strings[i]);
    lbSource.DeleteSelected;
  end;

解决方案 »

  1.   

    你在删除lbSource列表中的记录时,lbSource.items.count的值就一直减少了。但当进入for i := 0 to (lbSource.Items.Count - 1) do时,(lbSource.Items.Count - 1)就相当于一个常量。
    所以才会出现下标越界.
      

  2.   

    (*//
    声明:
      本人保证所提供的方法是所知的最好方法
      解答问题纯属公益性质
      所以请不要向我追问
      如果有时间自会关注后续问题
    分析:
      执行TListBox.DeleteSelected()方法后已经减少了列表的元素
      但for循环已经在第一次运行的时候就决定了循环次数
      即,还是没有删除前的次数,所以回导致访问下标出界
    问题:如何转移TListBox选中的项?
    设计:Zswang
    日期:2002-10-07
    方案1:追加完再删除 //具清晰性
    方案2:向前循环 //执行速度快//扩充性好//建议使用
    附言:理解一下for循环为什么比while循环执行速度快!
    //*)///////Begin No.1
    for i := 0 to lbSource.Items.Count - 1 do
      if lbSource.Selected[i] then
        lbTarget.Items.Add(lbSource.Items.Strings[i]);
    lbSource.DeleteSelected;
    ///////End No.1///////Begin No.2
    for i := lbSource.Items.Count - 1 downto 0 do
      if lbSource.Selected[i] then
      begin
        lbTarget.Items.Add(lbSource.Items.Strings[i]);
        lbSource.Items.Delete(i);
      end;
    ///////End No.2