代码之家  ›  专栏  ›  技术社区  ›  Thunderx

如何将字符串从StringList复制到多个Memo

  •  0
  • Thunderx  · 技术社区  · 9 年前

    我有一个文本文件和10个StringLists,我想打开10个String Lists中的txt文件,例如,文本文件有1000行,我想要StringList1中的第一行100行,StringLists2中的第二行100行等等,我的想法是得到文本文件行数并除以10,然后在10个StrinkLists中复制每100行

    var
     i, x :integer;
     U : TStrings;
     DatFile ,ExePath:string;
    
    begin
     U := TStringList.Create;
     ExePath := ExtractFilePath(Application.ExeName);
     DatFile := ExePath + 'Test.txt';
     U.LoadFromFile(DatFile);
     x := U.Count Div 10;
     Edit1.Text := IntToStr(x);
     /// Stoped here
    end;
    

    如何继续?

    2 回复  |  直到 9 年前
        1
  •  1
  •   Remy Lebeau    9 年前

    您可以使用数组保存Memo指针,然后循环文件的行,计算每行要添加的数组索引,例如:

    var
      i, LinesPerMemo, LinesAdded: integer;
      U : TStrings;
      DatFile: string;
      Memos: array[0..9] of TMemo;
      CurMemo: TMemo;
    begin
      Memos[0] := Memo1;
      Memos[1] := Memo2;
      Memos[2] := Memo3;
      Memos[3] := Memo4;
      Memos[4] := Memo5;
      Memos[5] := Memo6;
      Memos[6] := Memo7;
      Memos[7] := Memo8;
      Memos[8] := Memo9;
      Memos[9] := Memo10;
    
      DatFile := ExtractFilePath(Application.ExeName) + 'Test.txt';
    
      U := TStringList.Create;
      try
        U.LoadFromFile(DatFile);
    
        LinesPerMemo := U.Count div 10;
        if (U.Count mod 10) <> 0 then
          Inc(LinesPerMemo);
    
        Edit1.Text := IntToStr(LinesPerMemo);
    
        J := 0;
        CurMemo := Memos[J];
    
        try
          LinesAdded := 0;
          for I := 0 to U.Count-1 do
          begin
            CurMemo.Lines.Add(U[I]);
            Inc(LinesAdded);
            if (LinesAdded = LinesPerMemo) and (J < 9) then
            begin
              CurMemo.Lines.EndUpdate;
              Inc(J);
              CurMemo := Memos[J];
              CurMemo.Lines.BeginUpdate;
              LinesAdded := 0;
            end;
          finally
            CurMemo.Lines.EndUpdate;
          end;
        end;
      finally
        U.Free;
      end;
    end;
    

    或者,使用temp TStringList

    var
      i, LinesPerMemo: integer;
      U, Lines : TStrings;
      DatFile: string;
      Memos: array[0..9] of TMemo;
    begin
      Memos[0] := Memo1;
      Memos[1] := Memo2;
      Memos[2] := Memo3;
      Memos[3] := Memo4;
      Memos[4] := Memo5;
      Memos[5] := Memo6;
      Memos[6] := Memo7;
      Memos[7] := Memo8;
      Memos[8] := Memo9;
      Memos[9] := Memo10;
    
      DatFile := ExtractFilePath(Application.ExeName) + 'Test.txt';
    
      U := TStringList.Create;
      try
        U.LoadFromFile(DatFile);
    
        LinesPerMemo := U.Count div 10;
        if (U.Count mod 10) <> 0 then
          Inc(LinesPerMemo);
    
        Edit1.Text := IntToStr(LinesPerMemo);
    
        Lines := TStringList.Create;
        try
          J := 0;
          for I := 0 to U.Count-1 do
          begin
            Lines.Add(U[I]);
            if (Lines.Count = LinesPerMemo) and (J < 9) then
            begin
              Memos[J].Lines.Assign(Lines);
              Inc(J);
              Lines.Clear;
            end;
          end;
          Memos[J].Lines.Assign(Lines);
        finally
          Lines.Free;
        end;
      finally
        U.Free;
      end;
    end;
    
        2
  •  0
  •   Christophe Fardeau    9 年前

    为了加快速度,如果需要,可以使用Texfile和Tstringstream创建Tmemo。

    type
      TForm1 = class(TForm)
        Button1: TButton;
        ScrollBox1: TScrollBox;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        function getNewMemo(const aStream : Tstream) : TMemo;
      public
        { Déclarations publiques }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    const nblines : Integer = 100;
    var F : TextFile;
        sLine, sfile : string;
        cpt : Integer;
        Memo : TMemo;
        tmp : TStringStream;
    begin
      sfile := 'C:\TEMP\Test.txt';
    
      tmp := TStringStream.Create;
      AssignFile(F, sFile);
      Reset(F);
      try
        LockWindowUpdate(ScrollBox1.Handle);
        cpt := 0;
        while not Eof(F) do begin
          Readln(F, sLine);
          Inc(cpt);
    
          tmp.WriteString(sLine + #13);
          if (cpt mod nbLines = 0) then begin
            Memo := getNewMemo(tmp);
            tmp.Clear;
          end;
        end;
    
        if tmp.Size > 0 then begin
          Memo := getNewMemo(tmp);
          tmp.Clear;
        end;
      finally
        CloseFile(F);
        tmp.Free;
        LockWindowUpdate(0);
      end;
    end;
    
    function TForm1.getNewMemo(const aStream : Tstream): TMemo;
    begin
      Result := TMemo.Create(ScrollBox1);
      Result.Parent := ScrollBox1;
      Result.Top := High(integer);
      Result.Align := alTop;
      Result.Height := 150;
      Result.ScrollBars := ssBoth;
      if aStream <> nil then begin
        aStream.Seek(0, soFromBeginning);
        Result.Lines.LoadFromStream(aStream);
      end;
    end;
    
    end.