Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-01-2004
nahuel nahuel is offline
Registrado
 
Registrado: ene 2004
Posts: 6
Poder: 0
nahuel Va por buen camino
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;

Última edición por nahuel fecha: 25-01-2004 a las 07:34:33.
Responder Con Cita
  #2  
Antiguo 25-01-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
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!!!
Responder Con Cita
  #3  
Antiguo 25-01-2004
nahuel nahuel is offline
Registrado
 
Registrado: ene 2004
Posts: 6
Poder: 0
nahuel Va por buen camino
muchas gracias por la bienvenida !

ya edite mi mensaje para tratar de hacerlo mas compresible, gracias por los consejos
Responder Con Cita
  #4  
Antiguo 25-01-2004
Julià T. Julià T. is offline
Miembro
 
Registrado: may 2003
Ubicación: en el teclado
Posts: 314
Poder: 22
Julià T. Va por buen camino
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.
Responder Con Cita
  #5  
Antiguo 25-01-2004
nahuel nahuel is offline
Registrado
 
Registrado: ene 2004
Posts: 6
Poder: 0
nahuel Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:37:11.


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
Copyright 1996-2007 Club Delphi