【问题标题】:What is the best way to load two text files into one TMemo component in Delphi?在 Delphi 中将两个文本文件加载到一个 TMemo 组件中的最佳方法是什么?
【发布时间】:2017-10-24 06:14:17
【问题描述】:

假设我有两个文本文件 (.txt),并且我有一个带有一个 TMemo 组件的表单。将两个文本文件快速加载到同一个备忘录中的最佳方法是什么?

【问题讨论】:

    标签: delphi


    【解决方案1】:

    使用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]);
    

    【讨论】:

      【解决方案2】:

      类似这样的:

      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;
      

      【讨论】:

      • 通过使用 AddStrings,您可以避免创建可能非常大的中间字符串,而不是使用 Text。在调用 LoadFromFile 之前无需清除 sl。但备忘录可能需要清除。
      • 此外,最终结果是一个包含两个字符串的备忘录,它们本身可能包含换行符。
      • @DavidHeffernan, “最终结果是一个包含两个字符串的备忘录,它们本身可能包含换行符” - 你确定吗?我想你可能错了。
      • @DavidHeffernan,试试:Memo1.Clear; Memo1.Lines.Add('1'#13#10'2'); Memo1.Lines.Add('3'#13#10'4'); -> Memo1.Lines.Count 是 4。还是我错过了什么?
      • @DavidHeffernan,您对TStringList 的看法是正确的。有趣的是,我什至不知道它可以容纳包含换行符的单行。
      【解决方案3】:

      没有任何 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

      当设置文本时,每当遇到回车或换行时,将通过分隔成子字符串来解析值。 (两者不需要成对)。

      这种方法提高了可读性,但会消耗大量内存。

      【讨论】:

      • 我看到与@Ago 答案相同的问题,但我认为,这是最短的方法:一行 pro 文件 :)
      猜你喜欢
      • 2023-03-18
      • 2011-07-16
      • 2011-11-19
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 2010-10-02
      • 2010-11-06
      • 2023-03-22
      相关资源
      最近更新 更多