Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Tablas planas
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-09-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
tarco35,

Cita:
Empezado por ecfisa
...podes usar un arreglo de registros para acceder a bloques de registros en un sólo acceso a disco...


Revisa este código:
Código Delphi [-]
 unit Unit1;
 
 interface
 
 uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, StdCtrls;
 
 type
   TForm1 = class(TForm)
     ListBox1: TListBox;
     Button1: TButton;
     Button2: TButton;
     Button3: TButton;
     Button4: TButton;
     procedure FormCreate(Sender: TObject);
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
     procedure Button3Click(Sender: TObject);
     procedure Button4Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
 
   TData = record
      Name : Array[0..29] of Char;
      PIN : Integer;
      DateData : TDateTime;
   end;
 
 const
   CountReg = 1000;
 
 var
   Form1: TForm1;
   ArrayData : Array[0..CountReg-1] of TData;
   FileData : File of TData;
   FileName : String;
 
 implementation
 
 {$R *.dfm}
 
 // Inicializa la Aplicación
 procedure TForm1.FormCreate(Sender: TObject);
 begin
    Randomize;
    FileName := ExtractFilePath(Application.ExeName) + 'Data.txt';
 end;
 
 // Genera un Arreglo de Registros de 1000 Elementos
 procedure TForm1.Button1Click(Sender: TObject);
 var
    i : Integer;
 begin
    FillChar(ArrayData,Length(ArrayData),0);
    for i := 0 to CountReg - 1 do
    begin
       StrPCopy(ArrayData[i].Name,'Name-' + IntToStr(i));
       ArrayData[i].PIN := Random(1000);
       ArrayData[i].DateData := Now + Random(365);
    end;
 end;
 
 // Graba 1000 Registros en una Sola Operación de Acceso a Disco
 procedure TForm1.Button2Click(Sender: TObject);
 begin
    AssignFile(FileData, FileName);
    Rewrite(FileData);
    BlockWrite(FileData, ArrayData, CountReg);
    CloseFile(FileData);
 end;
 
 // Lee 1000 Registros en una Sola Operación de Acceso a Disco y los Muestra en un ListBox
 procedure TForm1.Button3Click(Sender: TObject);
 var
    i : Integer;
 begin
    FillChar(ArrayData,SizeOf(ArrayData),0);
    AssignFile(FileData, FileName);
    Reset(FileData);
    Seek(FileData, 0);
    BlockRead(FileData, ArrayData, CountReg);
    for i := 0 to CountReg - 1 do
    begin
       ListBox1.Items.Add(ArrayData[i].Name
                          + ' '
                          + IntToStr(ArrayData[i].PIN)
                          + ' '
                          + DateTimeToStr(ArrayData[i].DateData));
    end;
    CloseFile(FileData);
 end;
 
 // Clear el ListBox de Registros
 procedure TForm1.Button4Click(Sender: TObject);
 begin
    ListBox1.Clear;
 end;
 
 end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, permite leer y grabar bloques de registros de un archivo en una sola operación de acceso a disco.

Nota: Excelente técnica ecfisa

Espero sea útil

Nelson.
Responder Con Cita
  #2  
Antiguo 04-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola nlsgarcia.

Es un resabio del viejo Turbo Pascal... , con Delphi ya podemos hacer:
Código Delphi [-]
...
const
  MAXDATA = 100;

type
  TReg = packed record
    dato: string[20];
    posi: integer;
  end;
  TFileReg = file of TReg;

var
  fr: TFileReg;
  rg: TReg;
  vr: array[0..MAXDATA] of TReg;
  FName: string;

// inicializar
procedure TForm1.FormCreate(Sender: TObject);
begin
  FName:= ExtractFilePath(Application.ExeName) + 'prueba.dat';
  AssignFile(fr, FName);
  try
    Reset(fr);
  except
    Rewrite(fr);
  end;
  CloseFile(fr);
  Randomize;
end;

// guardar
procedure TForm1.btnWriteClick(Sender: TObject);
var
  i: Integer;
begin
  // algunos datos...
  for i:= 0 to MAXDATA-1 do
  begin
    vr[i].dato:= Format('Registro %d',[i+1]);
    vr[i].posi:= i;
  end;

  // guardar 
  with TFileStream.Create(FName, fmOpenWrite) do
  try
    Position:= 0;
    Write(vr, MAXDATA * SizeOf(rg));
  finally
    Free;
  end;
end;

// leer
procedure TForm1.btnReadClick(Sender: TObject);
begin
  with TFileStream.Create(FName, fmOpenRead) do
  try
    Position:= 0;
    Read(vr, MAXDATA * SizeOf(rg));
  finally
    Free;
  end;
end;

// mostrar
procedure TForm1.btnShowClick(Sender: TObject);
var
  i: Integer;
begin
  with ListBox1.Items do
  begin
    Clear;
    for i:= 0 to MAXDATA-1 do
      Add(Format('%s %d',[vr[i].dato, vr[i].posi]));
  end;
end;
con el mismo resultado.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 05-09-2014
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 23
tarco35 Va por buen camino
Muchas gracias.... con esto y creando un fichero indice que me indique en que posición esta para poder hacer un acceso directamente a la posición de lo que quiero leer o modificar.
Pero si quiero añadir, como tendría que hacerlo?... un seek al final de fichero??? o como.

Gracias por su ayuda.
Responder Con Cita
  #4  
Antiguo 05-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola tarco35.
Cita:
Empezado por tarco35 Ver Mensaje
...
Pero si quiero añadir, como tendría que hacerlo?... un seek al final de fichero??? o como.
Exáctamente, posicionándote al final del archivo.

Agregar un registro:
Código Delphi [-]
  Seek(FileReg, FileSize(FileReg));
  Write(FileReg, Reg);

Leer último registro:
Código Delphi [-]
  Seek(FileReg, FileSize(FileReg)-1);
  Read(FileReg, Reg);

Mostrar posición del registro actual:
Código Delphi [-]
  ShowMessage(Format('Posición actual en el archivo: %d', [FilePos(FileReg)]));

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 05-09-2014 a las 21:27:45.
Responder Con Cita
  #5  
Antiguo 06-09-2014
tarco35 tarco35 is offline
Miembro
 
Registrado: sep 2003
Posts: 210
Poder: 23
tarco35 Va por buen camino
gracias....
Responder Con Cita
  #6  
Antiguo 07-09-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
tarco35,

Cita:
Empezado por ecfisa
...Es un resabio del viejo Turbo Pascal... , con Delphi ya podemos hacer...con el mismo resultado...


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    ListBox1: TListBox;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TData = record
     Name : Array[0..29] of Char;
     PIN : Integer;
     DateData : TDateTime;
  end;

const
  CountReg = 1000;

var
  Form1: TForm1;
  ArrayData : Array[0..CountReg-1] of TData;
  RegData : TData;
  FileName : String;
  F : TFileStream;

implementation

{$R *.dfm}

// Inicializa la Aplicación
procedure TForm1.FormCreate(Sender: TObject);
begin
   Randomize;
   FileName := ExtractFilePath(Application.ExeName) + 'Data.txt';
end;

// Genera un Arreglo de Registros de 1000 Elementos
procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;

begin

   FillChar(ArrayData,SizeOf(ArrayData),0);

   for i := 0 to CountReg - 1 do
   begin
      StrPCopy(ArrayData[i].Name,'Name-' + IntToStr(i));
      ArrayData[i].PIN := Random(1000);
      ArrayData[i].DateData := Now + Random(365);
   end;

end;

// Graba 1000 Registros en una Sola Operación de Acceso a Disco
procedure TForm1.Button2Click(Sender: TObject);
begin

   F := TFileStream.Create(FileName, fmCreate, fmShareExclusive);
   F.Write(ArrayData, SizeOf(ArrayData));
   F.Free;

end;

// Lee 1000 Registros en una Sola Operación de Acceso a Disco y los Muestra en un ListBox
procedure TForm1.Button3Click(Sender: TObject);
var
   i : Integer;

begin

   FillChar(ArrayData,SizeOf(ArrayData),0);

   F := TFileStream.Create(FileName, fmOpenRead, fmShareDenyNone);
   F.Read(ArrayData, SizeOf(ArrayData));
   F.Free;

   for i := 0 to CountReg - 1 do
   begin
      ListBox1.Items.Add(ArrayData[i].Name
                         + ' '
                         + IntToStr(ArrayData[i].PIN)
                         + ' '
                         + DateTimeToStr(ArrayData[i].DateData));
   end;

end;

// Clear el ListBox de Registros
procedure TForm1.Button4Click(Sender: TObject);
begin
   ListBox1.Clear;
end;

// Muestra la data de un registro n 
procedure TForm1.Button5Click(Sender: TObject);
var
   NumReg : String;
   DataReg : string;
   PosReg : Integer;
   MsgApp : String;

begin

   NumReg := InputBox('Número de Registro a Consultar', 'NumReg', '1');

   F := TFileStream.Create(FileName, fmOpenRead, fmShareDenyNone);
   
   if StrToIntDef(NumReg,1) > F.Size div SizeOf(RegData) then
   begin
      MsgApp := Format('Número de Reg Invalido, El Archivo tiene %d Reg',[F.Size div SizeOf(RegData)]);
      MessageDlg(MsgAPP,mtInformation,[mbOK],0);
      F.Free;
      Exit;
   end;

   PosReg := (StrToIntDef(NumReg,1) - 1) * SizeOf(RegData);

   F.Seek(PosReg, soFromBeginning);
   F.Read(RegData, SizeOf(RegData));
   DataReg := RegData.Name
              + ' '
              + IntToStr(RegData.PIN)
              + ' '
              + DateTimeToStr(RegData.DateData);

   ShowMessage(DataReg);

   F.Free;

end;

end.
El código anterior en Delphi 7 bajo Windows 7 Professional x32, permite leer y grabar bloques de registros de un archivo en una sola operación de acceso a disco con TFileStream y consultar registros individuales de forma aleatoria.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 07-09-2014 a las 16:59:15.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Importar estructura de tablas paradox en Firebird Matorral Firebird e Interbase 2 23-12-2010 12:43:03
Copiar la estructura de paradox a mysql seoane MySQL 6 18-02-2008 23:25:33
Obtener estructura de Tablas Paradox Coco_jac Varios 6 09-02-2007 05:14:59
Copiar estructura Paradox ? Coco_jac Varios 5 07-12-2005 16:31:11
Comparar estructura tablas paradox Joana Tablas planas 0 14-05-2004 10:47:26


La franja horaria es GMT +2. Ahora son las 22:47:57.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi