Search code examples
delphirecordtlist

Delphi TList of records


I need to store a temporary list of records and was thinking that a TList would be a good way to do this? However I am unsure how to do this with a TList and was wondering if this is the best was and also if anyone has any examples of how to do this?


Solution

  • The easiest way is to create your own descendant of TList. Here's a quick sample console app to demonstrate:

    program Project1;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils, Classes;
    
    type
      PMyRec=^TMyRec;
      TMyRec=record
        Value: Integer;
        AByte: Byte;
      end;
    
      TMyRecList=class(TList)
      private
        function Get(Index: Integer): PMyRec;
      public
        destructor Destroy; override;
        function Add(Value: PMyRec): Integer;
        property Items[Index: Integer]: PMyRec read Get; default;
      end;
    
    { TMyRecList }
    
    function TMyRecList.Add(Value: PMyRec): Integer;
    begin
      Result := inherited Add(Value);
    end;
    
    destructor TMyRecList.Destroy;
    var
      i: Integer;
    begin
      for i := 0 to Count - 1 do
        FreeMem(Items[i]);
      inherited;
    end;
    
    function TMyRecList.Get(Index: Integer): PMyRec;
    begin
      Result := PMyRec(inherited Get(Index));
    end;
    
    var
      MyRecList: TMyRecList;
      MyRec: PMyRec;
      tmp: Integer;
    begin
      MyRecList := TMyRecList.Create;
      for tmp := 0 to 9 do
      begin
        GetMem(MyRec, SizeOf(TMyRec));
        MyRec.Value := tmp;
        MyRec.AByte := Byte(tmp);
        MyRecList.Add(MyRec);
      end;
    
      for tmp := 0 to MyRecList.Count - 1 do
        Writeln('Value: ', MyRecList[tmp].Value, ' AByte: ', MyRecList[tmp].AByte);
      WriteLn('  Press Enter to free the list');
      ReadLn;
      MyRecList.Free;
    end.
    

    This eliminates a couple of things:

    • It handles freeing the memory.
    • You don't have to typecast everything to use it.

    As Remy and Warren both said, it's a little more work because you have to allocate the memory when you add new records.