Телефон: +7 (926) 245-03-63

Хранение данных в 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) и выполните следующую команду:

Теперь можно подключить файл 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
  begin
    // неудача, получаем сообщение об ошибке с помощью WinProcs.MessageBox,
    // без помощи VCL, поскольку здесь код выполняется
    // как часть инициализации программы, и VCL, 
    // возможно, еще не инициализирована!
  end;
end;
initialization
LoadDataResource;
end.
Интересное в интернете: москва такси эконом