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内 对象被删除了一个
.....
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内 对象被删除了一个
建议 if FFields.Items[i].Name = FieldName then //当符合条件时
结束循环,然后删除FFields.delete(i);
再重新开始循环查找。
知道某次全部循环完毕,没有满足FieldName的数据。
这样就OK了
这里肯定是有 多个重复的 情况 会删一个或多个 你的意思是 先循环 保存符合条件的 index 然后循环全部结束后 再一起删除 ?
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;
是有这个问题的,改成
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;从后向前循环。