Well, in my card routine library I have never used a stringlist for a card deck, so you’ll have to modify the following code to suit your needs.

First we have to fill the deck…..I use an array of integers (could optimise to bytes, of course, but memory in card games is not usually a problem)
Code:
procedure filldeck(var mydeck:array of integer;decksize:integer);
var t:integer;
begin
	for t:=0 to decksize-1 do mydeck[t]:=t;
end;
Each card in the deck has a numbered ID from 0 to decksize-1; Thus 0=Ace of Clubs, 1= 2 of Clubs, …. and so forth.

If I wanted to have 2 decks in a single pile (maybe for a double-decked patience game), I would use the following….
Code:
procedure filldecks(var mydeck:array of integer; decksize,deckcount:integer);
var s,t:integer;
begin
    for s:=0 to deckcount-1 do 
        for t:=0 to decksize-1 do mydeck[(decksize*s)+t]:=t;
end;
to shuffle the deck (of any size) we swap each entry in the array with another element chosen at random….
Code:
procedure shuffledeck(var mydeck:array of integer; cardcount:integer);
var s,t,u:integer;
begin
  for s:=0 to cardcount-1 do      //we swap each element at least once
  begin
	t:=random(cardcount);
	u:=mydeck[s];
	mydeck[s]:=mydeck[t];
	mydeck[t]:=u;
  end;
end;
Hope this helps a little.