Ich vermute mal das der Denkfehler im letzten Parameter von Copy liegt
Copy(<sourcestring>,FromPosition,lengthtocopy)
Der letzte Parameter gibt die
Länge an (also wieviele Zeichen kopiert werden sollen), nicht bis zu welcher
Position kopiert werden soll
Wenn also k in beiden Fällen 4 ist passiert folgendes:
copy(value,i+1,k-1) -> Ergebnis "5;" (Der Compiler checkt von selbst, das nach dem ";" der String zu ende ist und hört auf)
copy(value,i+1,k-3) -> Ergbnis "5"
Um immer den String zwischen zwei Positionen zu bekommen nimm:
copy(value,i+1,(k-i)-1);