If you have a list, use a dynamic array of anything, even a record as follows:
This needs no classes, no freeing and access to it is very fast. Even if it needs to grow you can do this - see below. Only use TList or TStringList if you need lots of size changing flexibility.
type
  TMyRec = record
    SomeString : string;
    SomeValue : double;
  end;
var
  Data : array of TMyRec;
  I : integer;
..begin
  SetLength( Data, 100 ); // defines the length and CLEARS ALL DATA
  Data[32].SomeString := 'Hello';
  ShowMessage( Data[32] );
  // Grow the list by 1 item.
  I := Length( Data );
  SetLength( Data, I+1 );
..end;