En este ejemplo guardaremos registros con nombres de empresas, número ID y nombre de la base de datos, algo simple. Como buffer usaremos un array (vector o matriz unidimensional) de registros.
Código:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics,
Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
BGuardar: TButton;
BLeer: TButton;
BAgregar: TButton;
edID: TEdit;
EdEmpresa: TEdit;
EdBD: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Memo1: TMemo;
procedure BAgregarClick(Sender: TObject);
procedure BGuardarClick(Sender: TObject);
procedure BLeerClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
type
TReg=record
ID:Integer;
Empresa:string[100];
BD:string[100];
end;
var
Form1: TForm1;
archivo:String;
aReg:array[0..99] of TReg;
cantReg:Integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
archivo:=GetCurrentDir+PathDelim+'datareg.bin';
cantReg:=0;
if FileExists(archivo) then BLeerClick(Sender);
//Si el archivo existe lo carga al array
end;
procedure TForm1.BGuardarClick(Sender: TObject);
var
FReg:File of TReg; //Archivo que contendrá registros tipo TReg
i:Integer;
begin
AssignFile(FReg,archivo); //Vinculamos el archivo
Rewrite(FReg); //Lo vamos a sobreescribir
for i:=0 to cantReg-1 do //Recorremos el array y lo escribimos
//con Write
begin
Write(FReg,aReg[i]);
end;
CloseFile(FReg); //Cerramos el archivo
end;
procedure TForm1.BLeerClick(Sender: TObject);
var
FReg:File of TReg; //Archivo que contendrá registros tipo TReg
i:Integer;
begin
AssignFile(FReg,archivo); //Vinculamos el archivo
Reset(FReg); //Lo abrimos en modo solo lectura
i:=0;
while not (EOF(FReg)) do //Lo cargamos al array
begin
Read(FReg,aReg[i]);
Memo1.Lines.Add(IntToStr(aReg[i].ID)+' '+aReg[i].Empresa+' '+
aReg[i].BD);
Inc(i);
Inc(cantReg);
end;
CloseFile(FReg); //Cerramos el archivo
end;
procedure TForm1.BAgregarClick(Sender: TObject);
begin
aReg[cantReg].ID:=StrToInt(edID.Text);//Agregamos solo al array,
//no al archivo.
aReg[cantReg].Empresa:=EdEmpresa.Text;
aReg[cantReg].BD:=EdBD.Text;
Inc(cantReg);
Memo1.Lines.Add('aReg['+IntToStr(cantReg-1)+']: '+EdEmpresa.Text);
end;
end.
En el registro debemos definir la longitud de los strings.
El primer registro de un archivo binario está en la posición 0 (cero).
No hay forma de agregar un registro a un archivo binario, como sí podemos hacerlo con archivos de texto plano, siempre ha que sobreescribir todo el archivo, de ahí ReWrite.
Al utilizar AssignFile podemos acceder mediante Seek a un determinado registro conociendo su posición y leerlo.
Código fuente: archivosbinarios.7z (incluye e archivo binario con 5 registros).
o en GitLab

No hay comentarios:
Publicar un comentario