Хранение данных в EXE-файле

Можно включить любой тип данных как RCDATA или пользовательский тип ресурса. Это очень просто. Данный совет поясняет общую технику создания такого ресурса.

type
  TStrItem = String[39];           { 39 символов + байт длины -> 40 байт }
  TDataArray = array [0..7, 0..24] of TStrItem;

const
  Data: TDataArray = (
                     (' ', ' ', ... ' '),            { 25 строк }
                     { всего 8 таких строк }
                     (' ', ' ', ... ' ');            { 25 строк }
Данные размещаются в вашем сегменте данных и занимают в нем 8 Kбайт. Если этого слишком много для вашего приложения – поместите реальные данные в ресурс RCDATA. Следующие шаги демонстрируют данный подход. Создайте небольшую безоконную программку, объявляющую типизированную константу, как показано выше, и запишите результат в файл на локальный диск:

program MakeData;

type
  TStrItem = String[39];           { 39 символов + байт длины -> 40 байтов }
  TDataArray = array [0..7, 0..24] of TStrItem;

const
  Data: TDataArray = (
                     (' ', ' ', ... ' '),             { 25 строк }
                     { всего 8 таких строк }
                     (' ', ' ', ... ' '));            { 25 строк }

var
  F: File of TDataArray;

begin
  Assign(F, 'data.dat');
  Rewrite(F);
  Write(F, Data);
  Close(F);
end.
Теперь подготовьте файл ресурса и назовите его DATA.RC. Он должен содержать только следующую строчку:

DATAARRAY RCDATA "data.dat"
Сохраните файл, откройте сессию DOS, перейдите в каталог, где вы сохранили data.rc (там же, где и data.dat) и выполните следующую команду:

brcc data.rc   (brcc32 для Delphi 2.0 и выше)
Теперь можно подключить файл DATA.RES к своему Delphi-проекту. Во время выполнения приложения можно сгенерировать указатель на данные этого ресурса и получить к ним доступ, что и требовалось.

type
  TStrItem = String[39];           { 39 символов + байт длины -> 40 байт }
  TDataArray = array [0..7, 0..24] of TStrItem;
  PDataArray = ^TDataArray;

const
  pData: PDataArray = Nil;          { в Delphi 2.0 используем Var }

implementation

{$R DATA.RES}

Procedure LoadDataResource;
var
  dHandle: THandle;
begin
{ pData := Nil; если pData - Var }
  dHandle := FindResource(hInstance, 'DATAARRAY', RT_RCDATA);
  if dHandle <> 0 then begin
    dHandle := LoadResource(hInstance, dHandle);
    if dHandle <> 0 then
      pData := LockResource(dHandle);
  end;
  if pData = Nil then
{ неудача, получаем сообщение об ошибке с помощью WinProcs.MessageBox, без помощи
  VCL, поскольку здесь код выполняется как часть инициализации программы, и VCL,
  возможно, еще не инициализирована! }
end;

initialization
  LoadDataResource;
end.
[News Group]