+3  A: 

Use a secondary TStringList:

procedure TForm2.Button1Click(Sender: TObject); 
var 
  I:Integer; 
  pages:Integer; 
  items: TStringList;
begin 
  pages := ceil(Memo1.Lines.Count/100); 
  Memo2.Lines.add('Total Pages: ' + IntToStr(pages)); 
  Memo2.Lines.add('Total Items: '+ IntToStr(Memo1.Lines.Count)); 

  items := TStringList.Create;
  try
    for I := 0 to Memo1.lines.Count - 1 do 
    begin 
      items.Add(Memo1.Lines.Strings[i]); 
      if (items.Count mod 100) = 0 then
      begin
        // process the current list of items...
        Memo2.Lines.AddStrings(items);
        items.Clear;
      end;
    end; 
    if items.Count > 0 then
    begin
      // process the remaining items...
      Memo2.Lines.AddStrings(items);
    end;
  finally
    items.Free;
  end;
end;
Remy Lebeau - TeamB
Thanks Remy, That works perfectly, I had tried something similar to this, but I had a Senior moment.. LOL
Brad
A: 

A secondary stringlist is nice... but if performance is an issue at all, just use nested loop

procedure TForm2.Button1Click(Sender: TObject); 
var 
  I:Integer; 
  pages:Integer; 
  str:string; 
begin 
  pages:= ceil(memo1.Lines.Count/100) ; 
  memo2.Lines.add('Total Pages: '+inttostr(pages)); 
  memo2.Lines.add('Total Items: '+inttostr(memo1.Lines.Count)); 


  // Should just do in batches of 100 VS entire list 
  for I := 0 to pages - 1 do 
  begin 
     For J := I * 100 to Min(I*100 + 99,memo1.lines.Count) do
     begin
       if str > '' then 
         str:= str+#10+ memo1.Lines.Strings[J] 
       else 
         str:= memo1.Lines.Strings[J]; 
     end;
     //Process Here
  end; 
  //I need to stop here every 100 items, then process the items. 
  memo2.Lines.Add(str); 

end;
Ken Bourassa