var i:integer;
begin
    for i:= alllistbox.Items.Count-1 downto 0 do //倒过来循环
        begin
          if alllistbox.Selected[i]  then
            begin
              alllistbox.Items.Delete(i);
              allzdbm.Delete(i);  //所有的字段
              allglbzd.Delete(i);  //所有的管理表字段
              dbnameglb.Delete(i);  //所有的管理表名
            end;
        end;end;

解决方案 »

  1.   

    //.........
        for i:= alllistbox.Items.Count-1 downto 0  do //反过来循环看看
    //.........
      

  2.   

    用反过来循环就好了!
    for i:= listbox1.Items.Count-1 downto 0  do
    出错原因:
    比如说你的listbox有2项,index分别是0,1
    所以循环是
     for i:=0 to 1 do
    当循环到第二次时,要删除的自然是 items[1],但是此时第一条记录已经被山除了,所以此时listbox只有一条记录,即items[i]的最大下标是0,下标是1的记录已经变成了0,而在循环中我们做的操作还是Items.Delete(1);所以结果一定是listi index out of bound      !
      

  3.   

    不错,就是倒过来循环才行。按照你原来的程序,删除一项后,该项后面的items的ItemIndex全都变了,所以会边界超范围。
      

  4.   

    >>谢谢,不过可不可以说说这是问什么呀??
    假设Listbox1有5条!for i:=0 to ListBox1.Items.Count-1 do
    begin
      ///Delete
    end;
    开始
    i:=0,Count-1 =4,后来删除了一个,这样,实际上Items只有4个了!但是for循环是编译的时候就固定了次数的,因此到最后还会访问Items.string[4],而Items.Strings[4]已经不存在了,变成了Items.Strings[3],当然Out Bounds了!
    而for i:=ListBox1.Items.COunt-1 downto 0 do
    就不一样了,开始
    i:=4,删除一个,这个时后,i也减少了,因此i永远会<=ListBox1.Items.COunt,这样当然不会出现错误了。