Главная » Delphi » Произвольные ресурсы

0

Если вы поковыряетесь в файлах, созданных с помощью Delphi, с помощью одной из упомянутых ранее программ для доступа к ресурсам, то увидите, что все интерфейсные элементы задаются именно через ресурсы. С помощью определяемого пользователем ресурса типа rt_rcdata можно загрузить в ресурсы приложения практически любой объект. Вот какова может быть последовательность действий при размещении в ресурсах, например, нашей таблицы перекодировок из проекта Layout главы 5. Сначала мы создаем вспомогательную программу из одного модуля для записи таблицы в файл:

program Makefile;

const CharEngRus: array [32..126] of byte = ($20,521, $DD, $B9, S3B, $25, $3F, $FD, $28, $29, $2A, {*} $2B,$E1,$2D,$FE,$2E,$30,$31,$32,$33,$34,$35, {5} $36, $37,$38, $39, $C6, $E6, $Cl, $3D, $DE, $2c, $22, {<*} $D4,$C8,$D1,$C2,$D3,$C0,$CF,$D0,$D8,$CE,$CB, {K} 1, $DC, $D2, $D9, $C7, $C9, $CA, $DB, $C5, $C3, $CC, {V} , $D7, $CD,$DF,$F5,$5C,$FA,$3A,$5F,$B8,$F4,{aI , $F1, $E2, $F3, $E0, $EF, $F0, $F8, $EE, $EB, $E4, {!) $t’C, $F2,$F9, $E7, $E9, $EA, $FB, $E5, $E3, $EC, $F6, {w) $F7,$ED,$FF,$D5,$2F,$DA,$A8 ); var

fCode: file of array [32..126] of byte; begin

assign(fCode, ‘CharEngRus.dat’); rewrite(fCode); write(fCode, Cha rEngRus); close(fCode); end.

Обратите внимание на то, что для файла мы используем паскалевские процедуры assign и close — т. к. здесь нет никаких форм и других объектов, то нет и боязни, что мы случайно вызовем соответствующий метод какого- нибудь объекта. Однако "во избежание" делать этого в Delphi-программах не рекомендуется — так, и в программе-шпионе из главы б, и в переключателе клавиатуры из главы 7 мы применяли привычные assignfile и closefile, хотя там это тоже было безразлично.

Получив таким образом дисковый файл с таблицей, мы загружаем его в ресурсы. В нашем приложении создаем файл CharEngRus.rc со строкой

CharEngRus RCDATA "CharEngRus.dat"

Затем компилируем его с помощью rescomp.bat, подключаем полученный RES-файл к проекту и загружаем ресурс в секции initialization:

type

TCharEngRus=array [32..126] of byte; var

PCha rEngRus; ATCha rEngRus; CharEngRus: TCha rEngRus; inplementation ($R CharEngRus.res)

initialization

PCharEngRus:=LockResource(LoadResource(hlnstance,

(FindResource(hlnstance, 1CharEngRus’, RT_RCDATA)))); if PCharEngRus = nil then снеправильный ресурс^ else CharEngRus:=PCharEngRus/4; end.

Метод загрузки для произвольного ресурса, как видите, несколько сложнее, чем в случае BitMap или строки. Переменная PCharEngRus будет указывать на начало ресурса в исполняемом файле. Чтобы не мучиться потом с указателями, мы соорудили в программе переменную подходящего типа CharEngRus, которая сразу при запуске инициализируется значением массива из ресурса. Переменную можно заменить и на типизируемую константу, т. к. я уже говорил, что в Delphi различие между типизируемыми константами и переменными совершенно гомеопатическое.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии