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