昨天获得了关于将字符串列表的内容与单个字符串匹配的帮助,但是如果我想从字符串列表中删除匹配,然后保存到文件怎么办?在下面的例子中,我尝试向后计数以防止索引越界,但是当我删除时我仍然得到索引超出界限而我不确定为什么..由于循环中的Break,删除在循环之外,不是吗?工作示例将是伟大的,并解释为什么这样,所以我终于可以学习这个......
var
i: Integer;
Found: Boolean;
SL: tStringlist;
Str: ansistring;
begin
SL := Tstringlist.Create;
SL.LoadFromFile('filter.txt');
Str := Edit1.Text;
Found := False;
for i := SL.Count -1 downto 0 do
if AnsiContainsText(Str, SL[i]) then
begin
Found := True;
Break;
end;
if Found then
ShowMessage('MATCH FOUND: ' +SL[i]);
SL.Delete(i); // index out of bounds
SL.SaveToFile('filter.txt');
SL.Free;
end;
答案 0 :(得分:1)
for使用的变量i在for循环之外没有可靠的值。它们的使用应限于循环内部。即使找不到匹配项,也会执行SL.Delete(i)。如果你想在if块中包含几个语句,请使用begin end。
将其更改为以解决此问题:
var
i: Integer;
Found: Boolean;
SL: tStringlist;
Str: ansistring;
begin
SL := Tstringlist.Create;
try
Found := False;
SL.LoadFromFile('filter.txt');
Str := Edit1.Text;
for i := SL.Count -1 downto 0 do
if AnsiContainsText(Str, SL[i]) then
begin
ShowMessage('MATCH FOUND: ' +SL[i]);
SL.Delete(i); // index out of bounds
Found := True;
Break;
end;
if Found then
SL.SaveToFile('filter.txt');
finally
SL.Free; // Assure the SL is freed.
end;
end;
另一种方法是删除found并添加一个分配给-1的整数参数。如果找到匹配项,则将其设置为i的当前值,并在循环外使用该参数。或者你可以使用while循环。