muchas gracias a todos por haberse molestado en tratar de ayudarme, les comento que ya encontre cual era el problema, como decis vos julia T , en el procedimiento de guardar no habia ningun error, el problema estaba en el procedimiento de posicion que era el que se fijaba si el nombre ya existia o no, y de acuerdo a eso sobreescribia el existente o lo agregaba al final , respectivamente, como la variable para leer los registros era del tipo global, siempre me cambiaba el nuevo registro con el primero que leia para verificar si existia o no, gracias a los watches me pude dar cuenta.
Código:
function posicion(n:string40):integer;
var
res:boolean;
begin
res:=false;
seek(arch,0);
while not eof(arch) and not res do
begin
read(arch,reg);// aca estaba el problema
res:=AnsiUpperCase(reg.Nombre)=AnsiUpperCase(n);
end;
if res then
posicion:=filepos(arch)-1
else
posicion:=-1;
end;
entonces lo que hice fue poner una variable local al procedimiento que sea la que lea los registros y listo.