Lazarus Resources/ru

From Free Pascal wiki
Jump to: navigation, search

Deutsch (de) English (en) español (es) français (fr) 한국어 (ko) русский (ru)

Введение

Файл ресурсов содержит данные, встраиваемые в исполняемый файл. Это могут быть изображения, строки, информация о версии, Manifest (Windows) и формы. Сюда включены данные, к которым программист может обратиться из кода. Использование ресурсов может быть удобно, если вы хотите распространять автономные исполняемые файлы.

До FPC 2.4 не было возможности использовать "нормальные" файлы ресурсов (*.res) в Lazarus, потому что они Win32 специфичны. Смотрите ниже #Lazarus ресурсы.

Нормальные ресурсы доступны в последней версии FPC (включая все последние версии Lazarus). Смотрите ниже #FPC ресурсы.

Lazarus ресурсы

Для того чтобы использовать файлы как ресурсы Lazarus, нужно пересоздать их при помощи lazres. Lazres можно найти в папке "Tools", расположенной в установочной директории Lazarus (C:\Lazarus\Tools\).

Теперь можно скомпилировать файлы ресурсов Lazarus (*.lrs) при помощи командной строки. Синтаксис lazres:

lazres <имя файла ресурсов> <включаемые файлы (file1 file2 file3 ...)>

Пример:

lazres mylazarusresource.lrs image.jpg

Для использования файла ресурсов Lazarus в вашем проекте, подключите его используя дирекстиву компилятора $I в разделе initialization вашего модуля.

Вы можете получить доступ к данным ресурса сразу или с использованием метода переменных LoadFromLazarusResource, которые после этого будут хранить данные. LoadFromLazarusResource принимает на вход один строковый параметр, который указывает, какой объект должен быть загружен из файла ресурсов. Пример:

procedure ExampleProc;
var
  Image: TImage
begin
  Image := TImage.Create;
  Image.Picture.LoadFromLazarusResource('image'); // Обратите внимание, что расширение файла не указывается
end;
 
initialization
  {$I mylazarusresource.lrs}

Этот код подключает файл mylazarusresource.lrs к проекту. В процедуре ExampleProc создан объект TImage и в него загружено изображение "image" из ресурса. Файл, который был встроен в ресурс, возможно был назван image.jpg.

Все класс, наследованные от TGraphic, имеют процедуру LoadFromLazarusResource.

Lazarus Resource Form File

Lazarus генерирует .LRS файлы c файлами формы .LFM.

Когда файл формы (*.lrs) отсутствует, FPC выдает следующее сообщение об ошибке: ERROR: unit1.pas(193,4) Fatal: Can't open include file "unit1.lrs"

Чтобы решить эту проблему вы можете:

  • использовать lazres: c:\lazarus\tools\lazres.exe unit1.lrs unit1.lfm
  • (проще): немного изменить дизайн формы и сохранить его; это пересоздаст .lrs файл без необходимости запускать lazres.

Получение данных из LRS ресурса

Вы можете извлекать данные из ресурса так:

uses ...LResources...;
 
...
procedure TForm1.FormCreate(Sender: TObject);
var
  r: TLResource;
  Data: string;
begin
  r := LazarusResources.Find('datafile1');
  if r = nil then 
    raise Exception.Create('Resource datafile1 is missing');
 
  Data := r.Value;
  //...что-то делать с данными...
end;

FPC ресурсы

Начиная с версии FPC 2.4 вы можете использовать стандартные .rc (Resource Script) файлы для подключения ресурсов в ваших проектах. Для превращения .rc скрипта в бинарный ресурс (.res файл), FPC запускает внешний компилятор (windres или GoRC). Поэтому, компилятор ресурсов должен быть установлен и в переменной окружения PATH, должен быть прописан путь к нему. Для получения дополнительной информации см.: FPC Programmer's guide, chapter 13 "Using Windows resources"

Для упрощения процесса компиляции, можно использовать уже скомпилированные файлы ресурсов (.res). Вы можете предварительно скомпилировать ресурсы любым доступным компилятором - windres (доступен на Unix и Windows), GoRC (только Windows), Microsoft Resource Compiler (rc.exe входит в Visual Studio), Borland Resource Compiler (brcc32.exe входит в Delphi, C++ Builder или продукты Rad Studio) или любой другой.

Используйте директиву {$R filename.rc} или {$R filename.res} для включения файла ресурсов в исполняемый файл. FPC RTL предоставляет как низкоуровневые функции, так и высокоуровневые классы для работы с ресурсами.

Низкоуровневые функции:

  • EnumResourceTypes
  • EnumResourceNames
  • EnumResourceLanguages
  • FindResource
  • FindResourceEx
  • LoadResource
  • SizeofResource
  • LockResource
  • UnlockResource
  • FreeResource

Они совместимы с Windows API функциями Resource Functions.

Базовым классом, работающим с ресурсами, является TResourceStream. LCL использует его для загрузки встроенных растровых изображений, иконок, и форм. Посмотрите на TGraphic.LoadFromResourceID или TIcon.LoadFromResourceHandle чтобы понять, как они используются в LCL.

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

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

Сначала мы должны сообщить компилятору, какие файлы включить в ресурс. Делаем это в .rc файле:

Файл mydata.rc

MYDATA         RCDATA "mydata.dat"

Здесь MYDATA это имя ресурса, RCDATA это тип ресурса (подробнее смотрите Resource Types) и "mydata.dat" это файл с данными.

Давайте скажем компилятору подключить ресурс к программе:

program mydata;
 
{$R mydata.rc}
begin
end.
Незаметно, FPC указывает компилятору ресурсов, распространяемому вместе с ним, компилировать .rc скрипт в бинарный файл ресурсов .res. После, компоновщик включит его в исполняемый файл. Хотя это не заметно для программиста, но вы можете, если хотите, создать свой собственный .res файл при помощи, например, Borland Resource Compiler. Тогда, вместо использования
{$R mydata.rc}
нужно использовать
{$R mydata.res}
.

Установлен ли windres

На Linux/OS X, вам нужно убедиться, что компилятор ресурсов windres, который входит в состав инструментов mingw32, у вас установлен. Например на Debian вы можете выполнить:

aptitude install mingw32-binutils
# this installs e.g. /usr/bin/i586-mingw32msvc-windres
# but FPC expects just windres, so:
ln -s /usr/bin/i586-mingw32msvc-windres /usr/bin/windres
# alternatively (and probably more "official") use -FCi586-mingw32msvc-windres in your calls to fpc or
# add -FCi586-mingw32msvc-windres to your fpc.cfg

На Windows, компиляторы ресурсов windres и gorc устанавливаются вместе с FPC и Lazarus.

Использование ресурсов в вашей программе

Давайте сейчас извлечем сохраненный ресурс в файл, например mydata.dat:

program mydata;
uses
  SysUtils, Windows;
{$R mydata.res}
var
  S: TResourceStream;
  F: TFileStream;
begin
  // create a resource stream which points to our resource
  S := TResourceStream.Create(HInstance, 'MYDATA', RT_RCDATA);
  // Please be aware of writing an apostrophes in resource type - source will not be axtracted!!!
  try
    // Создание файла mydata.dat в папке приложения
    F := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'mydata.dat', fmCreate); 
    try
      F.CopyFrom(S, S.Size); // Копирование данных из ресурса в файл
    finally
      F.Free; // destroy the file stream
    end;
  finally
    S.Free; // destroy the resource stream
  end;
end.