Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ayuda programa con archivos binarios (https://www.clubdelphi.com/foros/showthread.php?t=6849)

nahuel 25-01-2004 00:19:31

ayuda programa con archivos binarios
 
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:



Código:


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:
Código:

  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.

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.


La franja horaria es GMT +2. Ahora son las 01:27:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi