"Не так" тут не понятый до конца механизм работы цикла for.В соответствии с заголовком цикла for n:=1 to Length(str) значение Length(str) вычисляется перед первым входом в цикл и в дальнейшем не перевычисляется. Вы же в теле цикла посредством delete(str,n,1); строку укорачиваете. Вполне естественно, что в какой-то момент параметр цикла i в str[n] будет указывать за пределы её текущей длины.