Исходник не смотрел. Скажу одно. можно и без циклов
Используем case of end для подсчета количества той или иной цифры + процедура допустим NextCh.

Как то так:
Код:
case str of
1:
begin
что то делаем;
NextCh;
end;
,:
begin
что то делаем;
NextCh;
end;
.....
end
Для мемо делал так
Код:
procedure NextCh;{ Читать следующий символ }
begin
if Line = MainForm.MemoListing.Lines.Count
then Ch := chEOT // если достигнут конец текста, то в Ch заносим признак "конец текста"
else
if Pos > Length(MainForm.MemoListing.Lines.Strings[Line])
then // если достигнут конец строки, то ...
begin
Ch := chEOL; // в Ch заносим признак "конец строки"
Line := Line + 1; // и переходим к следующей строке
lineNum:=line; //Сохраняем номер строки
Pos := 1; // Установили начальную позицию в новой строке
end
else // иначе обрабатываем следующий символ в строке
begin
Ch := MainForm.MemoListing.Lines.Strings[Line][Pos];
Pos:= Pos+ 1; //Переходим на новую позициию
lineNum:=line+1; //Сохраняем номер строки
end;
end;