delphireversetstringlist

use Delphi to read in a text file to a TStringList but bottom to top


I was looking to read a text file in reverse so it would read in from the bottom of the text file first. I did find how to reverse it but it doesn't make sense to me. Can someone explain this to me, how it's working? Also if there is a better/quicker way? It seems to do all the work after the file is read in, like it would be quicker to just read it in from the bottom.

var
  datalist : TStringList;
  lines,i  : Integer;
  saveLine : String;
begin
  datalist := TStringList.Create;
  datalist.LoadFromFile(filename);   //loads file
  lines := datalist.Count;

  for i := lines-1 downto (lines div 2) do
    begin
      saveLine := datalist[lines-i-1];
      datalist[lines-i-1] := datalist[i];
      datalist[i] := saveLine;
    end;

Solution

  • (At least in Delphi 7, but more recent versions should act similarily)

    1. .LoadFromFile() calls
    2. .LoadFromStream(), which reads the whole stream/file into memory and then calls
    3. .SetTextStr(), which just calls per line
    4. .Add()

    Knowing this helps us to avoiding to reinvent the whole wheel and instead using an own class with one subtle change in the .Add() method:

    type
      TStringListReverse= class( TStringList )
        function Add( const S: String ): Integer; override;
      end;
    
    function TStringListReverse.Add( const S: String ): Integer;
    begin
      Result:= {GetCount} 0;  // Our change: always in front
      Insert( Result, S );
    end;
    

    And now we just use our own class:

    var
      l: TStringListReverse;
    begin
      l:= TStringListReverse.Create;
      l.LoadFromFile( 'C:\Windows\win.ini' );
      Memo1.Lines.Assign( l );
      l.Free;