Hier steckt schonmal ein Fehler:
Delphi-Quellcode:
else if j mod luckynr = 0 then begin
primes.Delete(primes.IndexOf(inttostr(j)));
n:=n+1
end
else if luckynr = strtoint(primes[primes.count-1]) then begin
Das Delete löscht ja den aktuellen Eintrag. Dann darf das n nicht erhöht werden, sonst überspringst du einen Wert.
Im Übrigen überprüfst du die Abbruchkriterien zu spät, daher die Range-Fehler.
Weiterhin sind deine IndexOf-Aufrufe tödlich für die Performance. Wenn man berücksichtigt, daß j ja die Zahl an Stelle n in der StringList darstellt, dann gilt n = primes.IndexOf(inttostr(j)). Somit vereinfacht sich dein Code auf unter Berücksichtigung der Bereichsgrenzen auf:
Delphi-Quellcode:
i := 0;
{ der letzte Eintrag braucht niemals überprüft zu werden }
while i < primes.count - 1 do begin
luckynr := strtoint(primes[i]);
n := i + 1;
while n < primes.Count do begin
j := strtoint(primes[n]);
if j mod luckynr = 0 then begin
primes.Delete(n);
end
else begin
n := n + 1;
end;
end;
i := i + 1;
end;