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

Чтение и запись переменных типа 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;
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.


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


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;


DelphiWorld 6.0

{...здесь должен быть расположен код инициализации MyArray...} как этот код к примеру выглядет?

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...