【发布时间】:2017-10-24 06:14:17
【问题描述】:
假设我有两个文本文件 (.txt),并且我有一个带有一个 TMemo 组件的表单。将两个文本文件快速加载到同一个备忘录中的最佳方法是什么?
【问题讨论】:
标签: delphi
假设我有两个文本文件 (.txt),并且我有一个带有一个 TMemo 组件的表单。将两个文本文件快速加载到同一个备忘录中的最佳方法是什么?
【问题讨论】:
标签: delphi
使用TStringList 加载每个文件,然后使用AddStrings 方法将内容传输到备忘录。
var
Tmp: TStringList;
...
Memo1.Lines.BeginUpdate;
try
Memo1.Lines.Clear;
Tmp := TStringList.Create;
try
Tmp.LoadFromFile(FileName1);
Memo1.Lines.AddStrings(Tmp);
Tmp.LoadFromFile(FileName2);
Memo1.Lines.AddStrings(Tmp);
finally
Tmp.Free;
end;
finally
Memo1.Lines.EndUpdate;
end;
事实上,这可以很容易地推广到一个可能有用的方法,如下所示:
procedure AppendMultipleTextFiles(Dest: TStrings; const FileNames: array of string);
var
FileName: string;
Tmp: TStringList;
begin
Dest.BeginUpdate;
try
Tmp := TStringList.Create;
try
for FileName in FileNames do
begin
Tmp.LoadFromFile(FileName);
Dest.AddStrings(Tmp);
end;
finally
Tmp.Free;
end;
finally
Dest.EndUpdate;
end;
end;
然后你可以使用这样的方法:
Memo1.Lines.Clear;
AppendMultipleTextFiles(Memo1.Lines, [FileName1, FileName2]);
【讨论】:
类似这样的:
sl := TstringList.Create;
try
sl.LoadFromFile('1.TXT');
memo1.Lines.Add(sl.Text);
sl.Clear;
sl.LoadFromFile('2.TXT');
memo1.Lines.Add(s2.Text);
finally
sl.Free
end;
【讨论】:
Memo1.Clear; Memo1.Lines.Add('1'#13#10'2'); Memo1.Lines.Add('3'#13#10'4'); -> Memo1.Lines.Count 是 4。还是我错过了什么?
TStringList 的看法是正确的。有趣的是,我什至不知道它可以容纳包含换行符的单行。
没有任何 TStringList:
uses System.IOUtils;
Memo1.Text := TFile.ReadAllText('1.txt') + #13#10 + TFile.ReadAllText('2.txt');
当你将带换行符的字符串分配给 TStrings.Text 时,这个字符串会自动拆分成多个字符串,这可以通过以下控制台程序证明:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
System.Classes,
System.IOUtils;
var StringList: TStringList;
s: string;
begin
try
StringList := TStringList.Create;
StringList.Text := TFile.ReadAllText('1.txt');
for s in StringList do
begin
Writeln(s);
Writeln('-----');
end;
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
更多来自docwiki
当设置文本时,每当遇到回车或换行时,将通过分隔成子字符串来解析值。 (两者不需要成对)。
这种方法提高了可读性,但会消耗大量内存。
【讨论】: