Search code examples
stringdelphidelphi-xe

How to copy strings from StringList to multiple Memos


i have a text file and 10 StringLists, i want to open the txt files in the 10 StringLists, for example the text file has 1000 line, i want the first 100 line in StringList1 and the second 100 in StringLists2 and so on, my idea is to get text file lines count and divide it by 10 then copy each 100 in the 10 StringLists

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;

how to continue this?


Solution

  • You can use an array to hold the Memo pointers, and then loop through the lines of the file, calculating which array index to add each line to, eg:

    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;
    

    Alternatively, use a temp TStringList to collect the lines for each Memo:

    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;