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 15-07-2008
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Cool Ayuda con fichero binario

Hola a todos
Quiero almacenar un listado de usuarios en un fichero binario (o no se como se le llamaria a este tipo que yo mismo creo), pero no se como desplazarme por él.

El fichero lo creo de esta forma:

Código:
Type Usuarios = record
    Nombre  :String[25];
    Clave   :String[10];
    Permiso :Boolean;
 end;

 var
  MiFile  :File of Usuarios;
  Usuario :Usuarios;

.....
// Para escribir cada usuario en ek fichero

  AssignFile(MiFile, '.\ConActI2.cfg');
  Reset(MiFile);
  Write(MiFile, Usuario);
  CloseFile(MiFile);

//Aqui parece que me reescribe en un solo record, y yo quiero añadir 
//tantos usuarios como se desee
.....

//Para leer del fichero y actualizar un cuadro combinado

 While Not EOF(MiFile) do
  begin
    Read(MiFile, Usuario);
    ComboUser.Items.Add(Codifica(Usuario.Nombre,64));
  end;

....
El problema de aqui es que no se como moverme por el fichero para leer cada uno de los usuarios, solo me lee el ultimo


Última edición por JoAnCa fecha: 18-07-2008 a las 15:28:25. Razón: Intento poner las etiquetas par el codigo
Responder Con Cita
  #2  
Antiguo 15-07-2008
Avatar de Spynosa
Spynosa Spynosa is offline
Miembro
 
Registrado: nov 2004
Ubicación: Ecija - Sevilla
Posts: 99
Poder: 20
Spynosa Va por buen camino
prueba esto

Código Delphi [-]
AssignFile(MiFile, '.\ConActI2.cfg');
Reset(MiFile);
seek(mifile,filesize(mifile));
Write(MiFile, Usuario);
CloseFile(MiFile);
Responder Con Cita
  #3  
Antiguo 16-07-2008
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Cool

Spynosa, ya probe con Seek, pero lo que hace es saltarme la cantidad de bytes del fichero y No la cantidad de registros.
Es decir, en lugar de saltarme al segundo registro cuando hay uno, me salta 308 registros, que es el tamaño en bytes del fichero.
Responder Con Cita
  #4  
Antiguo 16-07-2008
Khronos Khronos is offline
Miembro
 
Registrado: abr 2007
Posts: 298
Poder: 18
Khronos Va por buen camino
Prueba con la clase TFileStream, es mucho más fácil

Salu2
Responder Con Cita
  #5  
Antiguo 18-07-2008
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Cool

Cita:
Empezado por Khronos Ver Mensaje
Prueba con la clase TFileStream, es mucho más fácil

Salu2
Disculpa por mi desconocimiento, pero como es que uso TFileStream
Como se si la instruccion Seek es la de TFileStream o la de TFile
Responder Con Cita
  #6  
Antiguo 18-07-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola Jose Caceres,
Si todavía estás interesado en tener tu File of Records, tal vez te interese este hilo. Ve al post 6, allí dejé a disposición un ejemplo de como proceder.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 21-07-2008
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Cool

Cita:
Empezado por Delphius Ver Mensaje
Hola Jose Caceres,
Si todavía estás interesado en tener tu File of Records, tal vez te interese este hilo. Ve al post 6, allí dejé a disposición un ejemplo de como proceder.

Saludos,
Gracias Delphius, tu ejemplo me fue de mucha utilidad, ya me funciona lo que queria hacer
Responder Con Cita
  #8  
Antiguo 24-07-2008
kabracity kabracity is offline
Registrado
 
Registrado: jul 2008
Posts: 5
Poder: 0
kabracity Va por buen camino
Cita:
Empezado por Delphius Ver Mensaje
Hola Jose Caceres,
Si todavía estás interesado en tener tu File of Records, tal vez te interese este hilo. Ve al post 6, allí dejé a disposición un ejemplo de como proceder.

Saludos,
Hola Delphius,

estoy empezando a trabajar con ficheros binarios tipados (File of records), y he llegado hasta el post donde ponías la agenda como ejemplo.
La sospecha que tenía parecía confirmarse... ¿no se puede borrar uno de los registros del fichero directamente con algún procedimiento?Me tiré un buen rato buscando alguna función del tipo Delete(handler,posicion), pero no he encontrado nada parecido.

He visto que tú lo que haces (si entendí bien) es situarte en la posición que desees borrar, y a partir de ahí con dos contadores ir moviéndote por todos los registros después de ese, y sobreescribiendo cada uno con el siguiente.
¿no afectaría mucho eso al rendimiento a medida que vamos teniendo bastantes registros? Casi no puedo creer que haya un método directo, al igual que está el reset+seek+write para editar, o el append para añadir.

¿Si edito el registro y lo cambio a '' en esa posición, podría valer?¿o me lo seguiría contando como 1 registro más?


¡Un saludo y gracias!
Responder Con Cita
  #9  
Antiguo 24-07-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por kabracity Ver Mensaje
Hola Delphius,

estoy empezando a trabajar con ficheros binarios tipados (File of records), y he llegado hasta el post donde ponías la agenda como ejemplo.
La sospecha que tenía parecía confirmarse... ¿no se puede borrar uno de los registros del fichero directamente con algún procedimiento?Me tiré un buen rato buscando alguna función del tipo Delete(handler,posicion), pero no he encontrado nada parecido.

He visto que tú lo que haces (si entendí bien) es situarte en la posición que desees borrar, y a partir de ahí con dos contadores ir moviéndote por todos los registros después de ese, y sobreescribiendo cada uno con el siguiente.
¿no afectaría mucho eso al rendimiento a medida que vamos teniendo bastantes registros? Casi no puedo creer que haya un método directo, al igual que está el reset+seek+write para editar, o el append para añadir.

¿Si edito el registro y lo cambio a '' en esa posición, podría valer?¿o me lo seguiría contando como 1 registro más?


¡Un saludo y gracias!
Efectivamente.
Lo que se hace cuando se presiona en eliminar es sustituir el primer registro por el siguiente, y asi sucesivamente hasta llegar al final. Un mecanismo parecido deberías aplicar tu para que se pueda hacer desde cualquier posición (asegurandote de chequear los puntos extremos claro).

Yo no recuerdo, ni encontré alguna función que elimine de una un registro en un archivo.

Si te lo contará. En efecto por más que se ponga un vacio, el registro sigue contando. Y al modificar un dato, si el contenido es de menor tamaño notarás que el anterior, notarás que si grabas los cambios. Dicho campo estará con basuras. Por ejemplo, supongamos que antes el campo Nombre tenía guardado: Marcelino. Ahora lo modificar por Carlos. Al final del proceso dicho regitro tendrá esto: Carlosino. Como ves... nos está sobrando el ino.

El manejo de estos archivos es un tanto complicado, y el ejemplo que yo hice es básico y solo sirve para comprender mejor algunas cosas en el manejo de estos archivos.

Si deseas emplear estos tipos de archivos debes prever muchas cosas, y por tando desarrollar los mecanismos adecuados para eliminar las inconsistencias que se producen por efecto de un cambio, ya sea porque se elimina un registro, como si se lo modificara.

Por estos motivos es que los gestores o motores de bases de datos emplean archivos con una estructura diferente. Se basan y se apoyan en técnicas de arboles balanceados para guardar, recorrer, eliminar, y demás operaciones sobre los datos. Sus datos no se guardan específicamente en el orden en que son insertados. Esto les facilita el trabajo enormemente.

Implementaciones basadas en archivos de registros obligan a uno recorrer desde el principio al final e implementar procedimientos de "limpieza".

No se si explico. Sino está claro por favor dimelo y veo el modo de ayudarte.

Ahora, como opción puedo recomendarte que emplees un STtringList. Esta clase posee los métodos de escritura y lectura y facilita la inserción y eliminación de datos. El tema está en que si deseas simular campos, vas a tener que implementar algún mecanismo de "marca". Algún caracter que te delimite un campo de otro. Por ejemplo:

dato1#dato2#dato3.

Y tu archivo quedará formado así:

dato1#dato2#dato3 // registro 1
dato1#dato2#dato3 // registro 2
....
dato1#dato2#dato3 // registro n

La otra opción a seguir es guardar cada dato, en una linea diferente, y "saltar" de a n lineas (siendo n la cantidad de campos) para ir de un registro a otro.

Ahora, si lo que estás haciendo es algo complejo y/o grande. Lo más recomendable es que emplearas alguna base de datos y te olvidaras de esto. Se lo dejas al motor que haga el trabajo duro por ti, y tu te limitas a realizar la consultas adecuadas.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 24-07-2008 a las 20:53:10.
Responder Con Cita
  #10  
Antiguo 28-07-2008
Avatar de JoAnCa
JoAnCa JoAnCa is offline
Miembro
 
Registrado: jul 2005
Ubicación: Cuba
Posts: 435
Poder: 19
JoAnCa Va por buen camino
Cool Sobre eliminar un record

Implementando el ejemplo de Delphius, la opcion de eliminar no funciona correctamente. Pues me deja repetido un registro, y deja registros vacios al final, como ya comento kabracity

Le hice unos arreglos y le agregue la funcion Truncate();, que su funcion es eliminar todos los registros a partir de la posicion actual.

Así fue como quedo en mi programa:
Código Delphi [-]
procedure TfrmClave.BotonDelUserClick(Sender: TObject);
 var
  Pos :Integer;

begin
 //Procedimiento para eliminar el registro seleccionado en el combobox
 Pos:=0; Seek(MiFile, 0);

 //Para ubicar la posicion en el fichero
 while Not Eof(MiFile) do
  begin
   Read(MiFile, Usuario);
   if Usuario.Nombre = ComboUser.Text then
    begin
      Pos:=FilePos(MiFile);   //Si lo encontre, guardo la posicion y salgo
      Break;
    end;
  end;

 //Este es el ejemplo de Delphius "arreglado"
 while Not Eof(MiFile) do
  begin
    Read(MiFile,Usuario);
    Seek(MiFile,Pos-1);
    Write(MiFile, Usuario);
    Inc(Pos);
    Seek(MiFile,Pos);
  end;

 Seek(MiFile,Pos-1);
 Truncate(MiFile);          //Funcion para eliminar los registros que sobran  

 //------ Actualizar el Combobox --------
 Seek(MiFile,0);  ComboUser.Items.Clear;
 While Not EOF(MiFile) do
  begin
    Read(MiFile, Usuario);
    ComboUser.Items.Add(Usuario.Nombre);
  end;
 ComboUser.Text:='';
end;

De esta forma me funciona perfecto, elimina bien.

kabracity
El uso de este tipo de ficheros, como decia Delphius, es para cosas sencillas, para algo mas complejo es mejor usar Bases de Datos.
En mi caso lo uso, pues solo almacenare un registro de usuarios, que siempre van a ser pocos (nunca seran mas de 10 o 20), no me afectaria el rendimiento.

Última edición por JoAnCa fecha: 28-07-2008 a las 18:36:36.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Localizar un array de bytes en un fichero binario. maro Varios 3 12-02-2008 11:58:12
Bloquear registro en fichero binario jonmendi API de Windows 3 13-11-2007 17:16:31
Ayuda con fichero de texto jadelphi Varios 4 07-10-2004 09:43:14
crear fichero de ayuda empty Varios 2 04-05-2004 23:12:21
Fichero de Ayuda jsc Varios 2 02-04-2004 15:19:38


La franja horaria es GMT +2. Ahora son las 03:09:56.


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