PDA

Ver la Versión Completa : ayuda programa con archivos binarios


nahuel
25-01-2004, 00:19:31
hola, este es mi primer post en este foro, queria pedirles ayuda con este codigo ya que lo ejecute paso a paso muchas veces y no logro encontrarle el error, el problema es que siempre me guarda el primer registro, aunque cambie los datos siempre me guarda el primer registro que he cargado,por ejemplo cargo el primer registro con el nombre de "juan" completo los otros datos y cuando agrego otro registro distinto, por ejemplo "pedro" en el archivo se guardan 2 registros "juan" con todos los datos del primer registro cargado. quisas el problema este en que la variable de registro sea global?, desde ya muchas gracias y pido disculpas por no haber leido las recomendaciones de estilo antes de escribir en el foro :)
aca les dejo el codigo:





procedure TForm4.Button2Click(Sender: TObject); //boton guardar

var
cerrar:boolean;
v1,v2,v3,v4,v5,v6,v7,v8,v9:integer;
Comp:TValueRelationship;
fechaactual:TDateTime;
j:integer;

begin
cerrar:=True;
fechaactual:=date;
try
if Edit1.text<>'' then
reg.Nombre:=Edit1.Text;

if Maskedit1.text<>' / / ' then
begin
reg.CLU:=StrToDate(Maskedit1.Text);
mostrar(v1,Comp,fechaactual,reg.CLU,label12);
end;
if Maskedit2.text<>' / / ' then
begin
reg.Port:=StrToDate(Maskedit2.Text);
mostrar(v2,Comp,fechaactual,reg.Port,label13);
end;
if Maskedit3.text<>' / / ' then
begin
reg.Med:=StrToDate(Maskedit3.Text);
mostrar(v3,Comp,fechaactual,reg.Med,label14);
end;
if Maskedit4.text<>' / / ' then
begin
reg.Psi:=StrToDate(Maskedit4.Text);
mostrar(v4,Comp,fechaactual,reg.Psi,label15);
end;
if Maskedit5.text<>' / / ' then
begin
reg.Reinc:=StrToDate(Maskedit5.Text);
mostrar(v5,Comp,fechaactual,reg.Reinc,label16);
end;
if Maskedit6.text<>' / / ' then
begin
reg.Mor:=StrToDate(Maskedit6.Text);
mostrar(v6,Comp,fechaactual,reg.Mor,label17);
end;
if Maskedit7.text<>' / / ' then
begin
reg.AntProv:=StrToDate(Maskedit7.Text);
mostrar(v7,Comp,fechaactual,reg.AntProv,label18);
end;
if Maskedit8.text<>' / / ' then
begin
reg.CredProv:=StrToDate(Maskedit8.Text);
mostrar(v8,Comp,fechaactual,reg.CredProv,label19);
end;
if Maskedit9.text<>' / / ' then
begin
reg.CredCap:=StrToDate(Maskedit9.Text);
mostrar(v9,Comp,fechaactual,reg.CredCap,label20);
end;
except
showmessage('fecha/s invalida/s');
cerrar:=false;
end;

if cerrar then
begin
j:=posicion(reg.Nombre);
if j=-1 then
begin
seek(arch,filesize(arch));
write(arch,reg);
label21.Caption:=intToStr(filesize(arch));//////////////////////debug
label22.Caption:=intToStr(filepos(arch));///////////////////////////
end
else
begin
showmessage('encontrado!');
seek(arch,j);
write(arch,reg);
end;


end;

end;

__cadetill
25-01-2004, 04:29:39
Ya que eres nuevo, un par de recomendaciones

Si vas a publicar tanto código, y aunque fuese poco, te recomiendo el uso de la etiqueta "[ code ] aquí mi código [ /code ] (sin los espacios en blanco). Así es prácticamente imposible de seguir el código.

Mira de editar tu mensaje y pon las etiquetas, a ver si lo podemos seguir algo mejor y podemos ayudarte

También te aconsejaría la lectura de la guía de estilos (ver firma)

Por otra parte, ¡¡¡bienvenido a los foros!!!

nahuel
25-01-2004, 16:32:40
muchas gracias por la bienvenida !

ya edite mi mensaje para tratar de hacerlo mas compresible, gracias por los consejos

Julià T.
25-01-2004, 17:29:11
Tal y como veo yo como funciona:

j:=posicion(reg.Nombre);
if j=-1 then
begin
seek(arch,filesize(arch));
write(arch,reg);
//si j=-1 se añade 1 registro al final del fichero
end
else
begin
seek(arch,j);
write(arch,reg);
//si j<>-1 se cambia el registro j por el nnuevo
end;


En ningun caso se añaden 2 registros como indicas.

nahuel
25-01-2004, 17:55:20
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.


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.