Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-11-2005
liriko liriko is offline
Miembro
 
Registrado: nov 2005
Posts: 27
Poder: 0
liriko Va por buen camino
Unhappy problema con ficheros

hola amigos ¡

Estoy intentando hacer una agenda,para almacenar datos de mis contactos(Nombre,Direccion,Telefono), todos ellos que iran almacenados en un fichero .DAT. Hasta ahi no hay problema. el problema me viene cuando abro el programa y abro un fichero para tratar con el. Cada vez k intento dar un alta,lo que hace es sobreescribirme algun registro de los que tenia almacenado. el error se cual es,no me posiciono al final del fichero,pero...¿Como puedo posicionarme al final del fichero para que cada vez que vaya a dar una alta no me sobreescriba ningun registro de los que tengo almacenados??En serio e probado 20mil cosas y no doy con la tecla......
Responder Con Cita
  #2  
Antiguo 28-11-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Pon el código que utilizas, lo más probable es que no estes abriendo el fichero en modo añadir, y por eso te borra lo anterior.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #3  
Antiguo 28-11-2005
liriko liriko is offline
Miembro
 
Registrado: nov 2005
Posts: 27
Poder: 0
liriko Va por buen camino
codigo

Código Delphi [-]
procedure TForm2.BT_AceptarClick(Sender: TObject);
 begin
   vagenda.nombre:=TE_nombre.text;
   vagenda.direccion:=TE_direccion.text;
   vagenda.telefono:=TE_telefono.text;
   write(Nuevo_fichero,vagenda);
   showmessage('Alta realizada con exito');
   form2.doDestroy;
   form2.Close
 end;
Este es el codigo(sin controlar errores por si me mete algun campo vacio)

Última edición por dec fecha: 29-11-2005 a las 00:43:41. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita
  #4  
Antiguo 28-11-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Si pero te falta poner el código que abre el fichero, para saber en que modo lo estás abriendo.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #5  
Antiguo 28-11-2005
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
La pregunta es que seguramente estás utilizando Rewrite, cuando tendrías que utilizar Reset.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #6  
Antiguo 28-11-2005
liriko liriko is offline
Miembro
 
Registrado: nov 2005
Posts: 27
Poder: 0
liriko Va por buen camino
Problemas con ficheros

El Reset se usa para abrir el fichero,cuando mi programa llega a ese punto el fichero ya lo tengo abierto. Sigo sin encontrar el camino
Responder Con Cita
  #7  
Antiguo 28-11-2005
liriko liriko is offline
Miembro
 
Registrado: nov 2005
Posts: 27
Poder: 0
liriko Va por buen camino
Problemas con ficheros

Quizas no me haya explicado con claridad. Vamos a ver.
En el Programa tengo una opcion que es para Abrir un fichero.

Código Delphi [-]
 procedure TForm5.Button1Click(Sender: TObject);
 begin
    assignfile(Nuevo_fichero,edit1.Text);
    filemode:=2;
    reset(Nuevo_fichero);
    form5.Close;
 end;
Una vez abierto,tengo dos opciones, Visualizar o añadir datos.
Para visualizar uso dos botones (para ir hacia delante e ir hacia detras)

Código Delphi [-]
 procedure TForm4.BTB_AdelanteClick(Sender: TObject);
 begin
   //rewrite(nuevo_fichero);
   seek(nuevo_fichero,sum);
   read(nuevo_fichero,vagenda);
   LB_nombre.Caption:=vagenda.Nombre;
   LB_direccion.Caption:=vagenda.Direccion;
   LB_telefono.Caption:=vagenda.Telefono;
   sum:=sum+1;
   if eof(nuevo_fichero)=true then
     BTB_adelante.Visible:=false;
   btb_atras.Visible:=true;
 end;
  
 procedure TForm4.BTB_AtrasClick(Sender: TObject);
 begin
     seek(nuevo_fichero,filepos(nuevo_fichero)-2);
     read(nuevo_fichero,vagenda);
     LB_nombre.Caption:=vagenda.Nombre;
     LB_direccion.Caption:=vagenda.Direccion;
     LB_telefono.Caption:=vagenda.Telefono;
     btb_adelante.Visible:=true;
     sum:=sum-1;
     if (sum=1) then
       btb_atras.Visible:=false;
 end;
Siendo el valor de Sum siempre 0 cuando entramos en esta opcion.
Ahora necesito meter un registro, uso el siguiente codigo:

Código Delphi [-]
 procedure TForm2.BT_AceptarClick(Sender: TObject);
 begin
   vagenda.nombre:=TE_nombre.text;
   vagenda.direccion:=TE_direccion.text;
   vagenda.telefono:=TE_telefono.text;
   write(Nuevo_fichero,vagenda);
   showmessage('Alta realizada con exito');
   form2.doDestroy;
   form2.close;
 end;

Aqui es donde empiezan los problemas,ya que me deja meter los registros que yo quiera, pero para que lo haga sin sobreescribirme ninguno, tengo que irme a la opcion de cisualizar y mostrarlos todos hasta el final. Si empiezo a visualizar datos y paro en el registro numero 3 de 20 que tengo me va a sobreescribir el registro numero 3 por el que añada. La solucion es decirle que cada vez que quiera dar un alta se vaya al ultimo registro de todos, pero no hay manera de que me salga eso.
Espero esta vez haberme explicado con claridad y siento cualquier molestia ocasionada, llebo tan solo 2 semanas intentando aprender POO y para mi todo esto es muy nuevo(partiendo de la base que no e programado en mi vida).Salu2 y enhorabuena por esta Web, ya que contestais extremadamente rapido.

Última edición por dec fecha: 29-11-2005 a las 00:44:42. Razón: ¡¡Encerrad el código fuente entre las etiquetas [DELPHI] ... [/DELPHI]!!
Responder Con Cita
  #8  
Antiguo 28-11-2005
Turboleta Turboleta is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 26
Poder: 0
Turboleta Va por buen camino
Por lo que veo estás trabajando con un fichero tipeado. Para crear el archivo por 1ª vez se utiliza el procedimiento Rewrite, para el resto de las veces se utiliza el procediemiento Reset, después se sitúa el puntero sobre el registro deseado con el procedimiento Seek, para leerlo, o si lo situas trás el último puedes hacer un write para añadir un registro.

Cuando abres un fichero tipeado, se usa Seek para posicionar el puntero, tanto para lectura como escritura. Sólo depende de que utilices el procedimiento Read o Wrire respectivamente. ´

Al abrir el archivo, el puntero se sitúa al principio del mismo. Si haces rewrite, para añadir un registro o varios, lo que estás haciendo es sobreescribir el fichero con lo que al cerrarlo habrás perdido la información anterior.

Espero haberte servido de ayuda.
Responder Con Cita
  #9  
Antiguo 28-11-2005
liriko liriko is offline
Miembro
 
Registrado: nov 2005
Posts: 27
Poder: 0
liriko Va por buen camino
Muy bien ¡

Por lo que me has dicho,mi programa ahora mismo va perfecto, la cuestion es....¿Como puedo poner un puntero justo detras del ultimo registro que tenga el fichero? Es decir, esta claro que tengo que hacer un Seek("Nombre_logico_de_mi_fichero",.......); pero no sé que poner en esos puntos suspensivos ¡¡
Responder Con Cita
  #10  
Antiguo 29-11-2005
liriko liriko is offline
Miembro
 
Registrado: nov 2005
Posts: 27
Poder: 0
liriko Va por buen camino
problemas con ficheros

Solucionado con algo tan simple como seek(nuevo_fichero,filesize(nuevo_fichero)); Debi poner el filesize.....
Responder Con Cita
  #11  
Antiguo 29-11-2005
Turboleta Turboleta is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 26
Poder: 0
Turboleta Va por buen camino
De todas formas las función Filesize siempre te devolverá un registro más de los que hayas metido, porque al crear el archivo siempre coloca en la cabecera del mismo el registro "0", en el cual, si te interesa, puedes almacenar información relativa al propio archivo.

Siento no haberte contestado antes. Estaba de viaje.
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 00:33:46.


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