Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problema con ficheros (https://www.clubdelphi.com/foros/showthread.php?t=27679)

liriko 28-11-2005 14:39:37

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......:(

marcoszorrilla 28-11-2005 14:42:30

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.

liriko 28-11-2005 14:45:12

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)

marcoszorrilla 28-11-2005 14:49:16

Si pero te falta poner el código que abre el fichero, para saber en que modo lo estás abriendo.

Un Saludo.

marcoszorrilla 28-11-2005 14:53:05

La pregunta es que seguramente estás utilizando Rewrite, cuando tendrías que utilizar Reset.

Un Saludo.

liriko 28-11-2005 15:59:20

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

liriko 28-11-2005 16:21:34

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.

Turboleta 28-11-2005 23:08:10

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.

liriko 28-11-2005 23:40:57

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 ¡¡:confused:

liriko 29-11-2005 13:08:53

problemas con ficheros
 
Solucionado con algo tan simple como seek(nuevo_fichero,filesize(nuevo_fichero)); Debi poner el filesize.....:confused:

Turboleta 29-11-2005 17:57:09

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.


La franja horaria es GMT +2. Ahora son las 13:19:58.

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