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