5

我正在使用最新版本的 Lazarus IDE,我的Memo1TForm1 上有一个。我必须加载一个文本文件,Memo1然后编辑备忘录的每一行(我使用Memo1.Lines.Strings[i] := ...)。最后,我必须将编辑后的备忘录保存在特定路径。

问题:我正在寻找更快的方式:

  1. 加载备忘录中的整个文本,编辑其内容并保存到一个新文件中(加载全部 -> 全部编辑 -> 全部写入)
  2. 执行一个while循环(直到我的*.txt文件末尾),逐行读取文件,编辑内容并将其保存在新文件中。(加载线 -> 编辑 -> 写入 | 加载 -> 编辑 -> 写入 | 加载线 -> 编辑 -> 写入 | ...)

我对 Delphi 开发还很陌生,而且我还阅读了一些关于TStringLists. 我的文本文件会有很多行(它可能有 5000 多行),我不希望我的程序失去性能。

有什么建议吗?我应该使用TStringList还是我之前列出的两种方法之一?

4

1 回答 1

9

5000行不是很多,除非字符串很长。

最简单的方法是使用TStringList. 除非用户需要查看或编辑内容,否则无需使用 GUI 控件。

var
  SL: TStringList;
  i: Integer;
begin
  SL := TStringList.Create;
  try
    SL.LoadFromFile(YourFileNameHere);
    for i := 0 to SL.Count - 1 do
    begin
      SL[i] := IntToStr(i) + ' ' + SL[i];
      // Do any other processing
    end;

    SL.SaveToFile(YourFileNameHere);
  finally
    SL.Free;
  end;
end;

如果(如您在上面的评论中所说)您需要TMemo出于测试目的执行此操作,则可以以相同的方式执行此操作:

Memo1.Lines.LoadFromFile(YourFileNameHere);
for i := 0 to Memo1.Lines.Count - 1 do
  Memo1.Lines[i] := IntToStr(i) + ' ' + Memo1.Lines[i];
Memo1.Lines.SaveToFile(YourFileNameHere);

当然,最简单的方法是编写一个接受TStrings任何类型的普通后代的过程:

procedure AppendValueToStrings(const SL: TStrings; 
  StartingValue: Integer);
var
  i: Integer;
begin
  Assert(Assigned(SL));  // Make sure a valid TStrings has been passed in
  for i := 0 to SL.Count - 1 do
  begin
    SL[i] := IntToStr(StartingValue) + ' ' + SL[i];
    Inc(StartingValue);
  end;
end; 

然后你可以用任何一个来调用它:

SL := TStringList.Create;
try
  SL.LoadFromFile(YourFileNameHere);
  AppendValueToStrings(SL, 10);
  SL.SaveToFile(YourFileNameHere);
finally
  SL.Free;
end;

Memo1.Lines.LoadFromFile(YourFileNameHere);
AppendValueToStrings(Memo1.Lines, 10);
Memo1.Lines.SaveToFile(YourFileNameHere);
于 2014-01-01T22:07:58.450 回答