You might find this handy, I stumbled across it on my harddrive unintentionally. It's a code unit for InnoSetup by Jordan Russel, so credit him if you use it.

Code:
unit SimpleStringList;

interface

uses
  Windows, SysUtils;

type
  PSimpleStringListArray = ^TSimpleStringListArray;
  TSimpleStringListArray = array[0..$1FFFFFFE] of String;
  TSimpleStringList = class
  private
    FList: PSimpleStringListArray;
    FCount, FCapacity: Integer;
    function Get (Index: Integer): String;
    procedure SetCapacity (NewCapacity: Integer);
  public
    destructor Destroy; override;
    procedure Add (const S: String);
    procedure AddIfDoesntExist (const S: String);
    procedure Clear;
    function IndexOf (const S: String): Integer;

    property Count: Integer read FCount;
    property Items[Index: Integer]: String read Get; default;
  end;

implementation

{ TSimpleStringList }

procedure TSimpleStringList.Add (const S: String);
begin
  if FCount = FCapacity then
    SetCapacity (FCapacity + 8);
  FList^[FCount] := S;
  Inc (FCount);
end;

procedure TSimpleStringList.AddIfDoesntExist (const S: String);
begin
  if IndexOf(S) = -1 then
    Add (S);
end;

procedure TSimpleStringList.SetCapacity (NewCapacity: Integer);
begin
  ReallocMem (FList, NewCapacity * SizeOf(Pointer));
  if NewCapacity > FCapacity then
    FillChar (FList^[FCapacity], (NewCapacity - FCapacity) * SizeOf(Pointer), 0);
  FCapacity := NewCapacity;
end;

procedure TSimpleStringList.Clear;
begin
  if FCount <> 0 then Finalize &#40;FList^&#91;0&#93;, FCount&#41;;
  FCount &#58;= 0;
  SetCapacity &#40;0&#41;;
end;

function TSimpleStringList.Get &#40;Index&#58; Integer&#41;&#58; String;
begin
  Result &#58;= FList^&#91;Index&#93;;
end;

function TSimpleStringList.IndexOf &#40;const S&#58; String&#41;&#58; Integer;
&#123; Note&#58; This is case-sensitive, unlike TStringList.IndexOf &#125;
var
  I&#58; Integer;
begin
  Result &#58;= -1;
  for I &#58;= 0 to FCount-1 do
    if FList^&#91;I&#93; = S then begin
      Result &#58;= I;
      Break;
    end;
end;

destructor TSimpleStringList.Destroy;
begin
  Clear;
  inherited Destroy;
end;

end.