FFields:TObjectList;
.....
procedure TMarc.DelField(FieldName: ShortString);
var
  i: Integer;
begin
  for i := 0 to FFields.Count - 1 do
  begin
    
    if FFields.Items[i].Name = FieldName then //当符合条件时 
    begin
      FFields.delete(i);  //会删除一个对象 导致FFields.Count 变化
    end;
  end;
end;
大家有没有遇到过类似情况  for 循环中  当 FFields.delete(i); 而 FFields.Count 会变了(dec) 最终会导致 下标越界 
内存错误  因为FFields内 对象被删除了一个 

解决方案 »

  1.   

    这个应该属于正常的,符合条件删除了应该break来解决; 如有多个重复可能,就循环结束后一起删除。
      

  2.   

    这样当然会出问题。
    建议 if FFields.Items[i].Name = FieldName then //当符合条件时 
    结束循环,然后删除FFields.delete(i);  
    再重新开始循环查找。
    知道某次全部循环完毕,没有满足FieldName的数据。
    这样就OK了
      

  3.   


    这里肯定是有 多个重复的 情况 会删一个或多个 你的意思是 先循环 保存符合条件的 index  然后循环全部结束后 再一起删除 ?
      

  4.   


    procedure TMarc.DelField(FieldName: ShortString);
    var
      i: Integer;
    begin
      for i := FFields.Count - 1 downto 0  do  begin
        
        if FFields.Items[i].Name = FieldName then    begin
          FFields.delete(i);      end;
      end;
    end;
    是有这个问题的,改成
      

  5.   

    for i := FFields.Count - 1 downto 0  do
      

  6.   

    for i := FFields.Count - 1 downto 0 do晕,要很多下
      

  7.   

    procedure TMarc.DelField(FieldName: ShortString);
    var
      i: Integer;
    begin
      for i := FFields.Count - 1 downto 0 do
      begin
        
        if FFields.Items[i].Name = FieldName then //当符合条件时 
        begin
          FFields.delete(i);  //会删除一个对象 导致FFields.Count 变化
        end;
      end;
    end;从后向前循环。
      

  8.   

    downto 就可以了 看来自己太笨了  哎 习惯了递增循环了