FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
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!!! |
#3
|
|||
|
|||
muchas gracias por la bienvenida !
ya edite mi mensaje para tratar de hacerlo mas compresible, gracias por los consejos |
#4
|
|||
|
|||
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; |
#5
|
|||
|
|||
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; |
|
|
|