Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

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

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

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

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;

https://delphiworld.narod.ru/

DelphiWorld 6.0


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

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.

https://delphiworld.narod.ru/

DelphiWorld 6.0


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

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

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" должна отражать структуру ваших паскалевских записей, при этом необходимо создать механизмы трансляции данных из одной среды в другую. Я не готов сейчас сказать вам, как это можно сделать, но, во всяком случае, всю функциональность можно инкапсулировать в отдельном специализированном компоненте.

https://delphiworld.narod.ru/

DelphiWorld 6.0


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

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;

https://delphiworld.narod.ru/

DelphiWorld 6.0