Thunderx
Thunderx

Reputation: 169

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?

Upvotes: 0

Views: 1757

Answers (2)

Christophe Fardeau
Christophe Fardeau

Reputation: 224

To speed up, you can use Texfile and Tstringstream with creating Tmemo if needed.

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.

Upvotes: 0

Remy Lebeau
Remy Lebeau

Reputation: 596928

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;

Upvotes: 1

Related Questions