Советы по Delphi

         

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


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

TypeTStrItem = String[39]; { 39 символов + байт длины -> 40 байтов }TDataArray= Array [0..7, 0..24] of TStrItem;
ConstData : TDataArray = (('..', ...., '..' ), { 25 строк на строку }... { 8 таких строк }('..', ...., '..' )); { 25 строк на строку }

Данные размещаются в вашем сегменте данных и занимают в нем 8K. Если это слишком много для вашего приложения, поместите реальные данные в ресурс RCDATA. Следующие шаги демонстрируют данный подход. Создайте небольшую безоконную программку, объявляющую типизированную константу как показано выше, и запишите результат в файл на локальный диск:



Program MakeData;TypeTStrItem = String[39]; { 39 символов + байт длины -> 40 байтов }TDataArray= Array [0..7, 0..24] of TStrItem;
ConstData : TDataArray = (('..', ...., '..' ), { 25 строк на строку }... { 8 таких строк }('..', ...., '..' )); { 25 строк на строку }
VarF: File of TDataArray;BeginAssign( 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-проекту. Во время выполнения приложения вы можете генерировать указатель на данные этого ресурса и иметь к ним доступ, что и требовалось.

{ в секции interface модуля }TypeTStrItem = String[39]; { 39 символов + байт длины -> 40 байтов }TDataArray= Array [0..7, 0..24] of TStrItem;PDataArray= ^TDataArray;ConstpData: PDataArray = Nil; { в Delphi 2.0 используем Var }
Implementation{$R DATA.RES}
Procedure LoadDataResource;VardHandle: THandle;Begin{ pData := Nil; если pData - Var }dHandle := FindResource( hInstance, 'DATAARRAY' , RT_RCDATA );If dHandle <> 0 Then Begindhandle := LoadResource( hInstance, dHandle );If dHandle <> 0 ThenpData := LockResource( dHandle );End;If pData = Nil Then{ неудача, получаем сообщение об ошибке с помощьюWinProcs.MessageBox, без помощи VCL, поскольку здесь кодвыполняется как часть инициализации программы и VCLвозможно еще не инициализирован! }End;
InitializationLoadDataResource;End.

Теперь вы можете ссылаться на элементы массива с помощью синтаксиса pData^[i,j].

- Peter Below [000964]



Содержание раздела