搜索字符串列表,删除匹配并保存到文件

时间:2014-02-06 09:44:15

标签: delphi-7

昨天获得了关于将字符串列表的内容与单个字符串匹配的帮助,但是如果我想从字符串列表中删除匹配,然后保存到文件怎么办?在下面的例子中,我尝试向后计数以防止索引越界,但是当我删除时我仍然得到索引超出界限而我不确定为什么..由于循环中的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;

1 个答案:

答案 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循环。