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

Материал из DRKB

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


Файл с множеством записей[править | править код]

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


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;


Source: http://delphiworld.narod.ru/



Добавление записи в файл[править | править код]

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.


Source: http://delphiworld.narod.ru/
ID: 03137



Запись и чтение из файла массива записей[править | править код]

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


Source: http://delphiworld.narod.ru/
ID: 03138



Запись и чтение из файла массива записей[править | править код]

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;


Source: http://delphiworld.narod.ru/
ID: 03139