Это вот эти строки:
f.Read(buf,n-(k-1)*40960);f2.Write(buf,n-(k-1)*40960);
Если в математическом выражении присутствует опреции, отличные от целочисленных (сложение, вычитание и т. д.), то результатом всего выражения будет не цело число, а число типа real (float), даже если результат с нулевой дробной частью... а функции Read и Write требуют целочисленного вторго аргумента... Тебе надо преобразовать результат выражения
n-(k-1)*40960
в integer.
Можно сделать это так:
f.Read(buf,integer(n-(k-1)*40960));f2.Write(buf,integer(n-(k-1)*40960));