Motto

В тихом саду здравомыслия
Пусть на вас постоянно падают
кокосовые орехи пробужденности.
Чогьям Трунгпа РИНПОЧЕ


Версия для мобильного


суббота, 23 ноября 2013 г.

Добавление ресурсов в программу

В этой публикации я побуду Капитаном Очевидность и расскажу о паре способах добавления ресурсов в программу.

Определение: Ресурсы — данные, встроенные в EXE, DLL, CPL и (начиная с Windows Vista) MUI-файлы. Доступ к этим данным можно получить через функции Windows API. (из Википедии).

В Delphi XE5 аналогичный механизм используется и для хранения ресурсов в Android приложениях. Насчёт iOS приложений я не проверял, но полагаю, что должно работать и там.

Вообще, ресурсы в Delphi – это фундамент, на котором строится вся программа. Именно в ресурсы пакуются все ваши DFM файлы (видели же строку “{$R *.DFM}” в .pas файлах форм? это оно самое), иконки, курсоры, и строки (resourcestring). Именно благодаря ресурсам работает локализация программ с помощью Translation Manager. Всё это происходит автоматически.

Также, именно ресурсы рекомендуется использовать для встраивания в программу дополнительных файлов - картинок, аудиофайлов, текстов.

Для чтения ресурсов можно использовать класс TResourceStream. А о том, как добавить ресурсы в программу, мы и поговорим.

Начиная с Delphi 2009 в IDE появился диалог, позволяющий добавить ресурсы в проект.

Диалог Resources в Delphi XE5

Этот диалог даёт возможность включить в проект сразу несколько файлов (проверял в XE5).

При сборке проекта, эти файлы компилируются в .res файл. А при линковке (компоновке), встраиваются в программу.

 

Но как же программисты жили раньше? Как добавляли в прог��аммы картинки, звуки и большие текстовые файлы?

Я уверен, что вы знаете ответ на этот вопрос. А если даже и нет, то способны найти ответ меньше чем за минуту.

Ответ скорее всего будет звучать так:

  1. Создайте текстовый файл с расширением .RC
  2. Добавьте туда список ресурсов в формате: resource_name RCDATA “filename”
  3. Запустите компилятор ресурсов: brcc32 ваш_файл.rc
  4. Добавьте в программу строку: {$R ваш_файл.res}
  5. Пересоберите программу
  6. Если вам понадобится изменить ваш .rc файл, повторите шаги 2-5.

Но, чтобы не собирать этот файл вручную, можно добавить RC файл прямо в проект.

В очень старых версиях Delphi (6,7) файл с ресурсами (RC) было проще создать в блокноте, а потом добавить в проект (Add to project).

В современных версиях Delphi, отлично работает способ создания прямо из IDE:

File –> New –> Text file –> .rc Resource file

Сохраним созданный файл как animals.rc

В результате в наш .dpr файл сверху добавится строка

{$R 'animals.res' 'animals\animals.rc'}

И теперь, при каждой компиляции, пересобираться и файл animals.rc и в программе всегда будет актуальная версия.

С уважением, ваш Капитан Очевидность.

Ссылки по теме

7 комментариев:

  1. Кстати, у меня настолько вошло в привычку создавать rc-файлы вручную, что я этой возможностью (добавление ресурсов через диалог) так почти и не пользуюсь..

    ОтветитьУдалить
  2. В ранних версиях Delphi использовал RX Library. Там был похожий диалог.

    ОтветитьУдалить
  3. 1. Пишем в блокноте RC-файл, куда прописываем все нужные нам программы, например:


    ARJ EXEFILE C:\ARHIVERS\ARJ.EXE

    2. Компилируем его в ресурс при помощи Brcc32.exe. Получаем RES- файл.

    3. Далее в тексте нашей программы:



    implementation
    {$R *.DFM}
    {$R test.res} //Это наш RES-файл

    // Процедура для извлечения ресурса в указанный файл
    procedure ExtractRes(ResType, ResName, ResNewName : String);
    var
    Res : TResourceStream;
    begin
    Res := TResourceStream.Create(Hinstance, Resname, Pchar(ResType));
    Res.SavetoFile(ResNewName);
    Res.Free;
    end;

    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    // Записывает в текущую папку arj.exe
    ExtractRes('EXEFILE', 'ARJ', 'ARJ.EXE');
    end;

    ОтветитьУдалить
  4. Очень интересная статейка. Я уже делал однажды это но уже забыл. Теперь вы мне помогли вспомнить это.

    ОтветитьУдалить
  5. Спасибки! То что надо! А то в гугле 2 дня промучался чтобы найти как картинку загрзуить! СПАСИБО!!!

    ОтветитьУдалить

Постоянные читатели