Чтение и запись переменных типа Record

Previous  Top  Next

    
 

Файл с множеством записей

Обычно, я использую файл с заголовком, который я затем загружаю в память, и использую его для поиска необходимой мне записи.

 

Code:

type

TSaveHeader = record

   scene: Integer;

   hotspots: LongInt;

   talk: LongInt;

   hype: LongInt;

end;

 

var

SaveHeader: TSaveHeader;

 

procedure OpenSaveFile(fname: string);

var

f: file;

i: Integer;

begin

AssignFile(f, fname);

Reset(f, 1);

BlockRead(f, SaveHeader, Sizeof(TSaveHeader));

{ получаем один набор записи }

Seek(f, SaveHeader.hotspots);

for i := 1 to 50 do

   BlockRead(f, somevar, sizeof_hotspotrec);

{ и так далее }

CloseFile(f);

end;

 

{ предположим, что файл открыт }

 

procedure GetHotspotRec(index: LongInt; var hotspotrec: THotspot);

var

offset: LongInt;

begin

offset := SaveHeader.hotspots + index * Sizeof(THotSpot);

Seek(f, offset);

BlockRead(f, hotspotrec, Sizeof(THotspot));

end;

http://delphiworld.narod.ru/

DelphiWorld 6.0

 

 


 

Добавление записи в файл

Code:

unit apprec_;

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

StdCtrls, ExtCtrls;

 

type

TForm1 = class(TForm)

   Label1: TLabel;

   Label2: TLabel;

   Label3: TLabel;

   Edit1: TEdit; // спортсмен

   ComboBox1: TComboBox; // страна

   ComboBox2: TComboBox; // вид спорта

   RadioGroup1: TRadioGroup; // медаль

   Button1: TButton; // кнопка Добавить

   Label5: TLabel;

   Label4: TLabel;

   procedure FormActivate(Sender: TObject);

   procedure FormClose(Sender: TObject; var Action: TCloseAction);

   procedure Button1Click(Sender: TObject);

private

   { Private declarations }

public

   { Public declarations }

end;

 

// тип медали

TKind = (GOLD, SILVER, BRONZE);

 

// запись файла

TMedal = record

   country: string[20]; //  страна

   sport: string[20]; //  вид спорта

   person: string[40]; //  спортсмен

   kind: TKind; //  медаль

end;

 

var

Form1: TForm1;

f: file of TMedal; // файл записей - база данных

 

implementation

 

{$R *.DFM}

 

// активизация формы

 

procedure TForm1.FormActivate(Sender: TObject);

var

resp: word; // ответ пользователя

begin

AssignFile(f, 'a:\medals.db');

{$I-}

Reset(f); // открыть файл

Seek(f, FileSize(f)); // указатель записи в конец файла

{$I+}

if IOResult = 0

   then button1.enabled := TRUE // теперь кнопка Добавить доступна

else

begin

   resp := MessageDlg('Файл базы данных не найден.' +

     'Создать новую БД?', mtInformation, [mbYes, mbNo], 0);

   if resp = mrYes then

   begin

{$I-}

     rewrite(f);

{$I+}

     if IOResult = 0

       then button1.enabled := TRUE

     else ShowMessage('Ошибка создания файла БД.');

   end;

end;

end;

 

// щелчок на кнопке Добавить

 

procedure TForm1.Button1Click(Sender: TObject);

var

medal: TMedal;

begin

with medal do

begin

   country := ComboBox1.Text;

   sport := ComboBox2.Text;

   person := Edit1.Text;

   case RadioGroup1.ItemIndex of

     0: kind := GOLD;

     1: kind := SILVER;

     2: kind := BRONZE;

   end;

end;

write(f, medal); // записать содержимое полей записи в файл

end;

 

// завершение работы программы

 

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

begin

CloseFile(f); // закрыть файл

end;

 

end.

©Drkb::03137

http://delphiworld.narod.ru/

DelphiWorld 6.0

 


Запись и чтение из файла массива записей

Это не очень Delphi-подобно (тем не менее, работа происходит с действительно паскалевскими записями), но вы можете писать и читать записи из/в файл, используя паскалевские процедуры для работы с файлами:

 

 

Code:

type

TMyRec = record ;

   Field1: integer;

   Field2: string;

end;

 

TMyRecArray = array[0..9] of TMyRec;

 

var

MyArray: TMyRecArray;

MyRec: TMyRec;

RecFile: file of TMyRec;

 

begin

{...здесь должен быть расположен код инициализации MyArray...}

 

AssignFile(RecFile, 'MYREC.FIL');

ReWrite(RecFile);

for i := 0 to 9 do

begin

   Write(RecFile, MyRec[i]);

end;

CloseFile(RecFile);

end;

 

Также, вы можете использовать Read() для чтения записи из вашего файла, и Seek() для перемещения на его конкретную запись (начиная с 0). Для получения дополнительной информации обратитесь к разделу "I/O Routines" электронной справки по Delphi.

 

Если вы хотите делать это с Data Aware компонентами (компонентами для работы с базами данных), вы должны создать базу данных, где база данных "records" должна отражать структуру ваших паскалевских записей, при этом необходимо создать механизмы трансляции данных из одной среды в другую. Я не готов сейчас сказать вам, как это можно сделать, но, во всяком случае, всю функциональность можно инкапсулировать в отдельном специализированном компоненте.

 

©Drkb::03138

http://delphiworld.narod.ru/

DelphiWorld 6.0

 


 

Запись и чтение из файла массива записей

 

Code:

type TR=Record

       Name:string[100];

       Age:Byte;

       Income:Real;

      end;

var f:file of TR;

   r:TR;

 

begin

//assign file

assignFile(f, 'MyFileName');

//open file

if FileExists('MyFileName') then

   reset(f)

else

   rewrite(f);

//чтение 10й записи

seek(f,10);

read(f,r);

//запись 20й записи

seek(f, 20);

write(f,r);

closefile(f);

end;

©Drkb::03139

http://delphiworld.narod.ru/

DelphiWorld 6.0