Difference between revisions of "Lazarus Resources/ru"

From Free Pascal wiki
Jump to navigationJump to search
m (Исправил внутренние ссылки)
m (Fixed syntax highlighting; deleted category included in page template)
 
(4 intermediate revisions by 3 users not shown)
Line 20: Line 20:
 
Вы можете получить доступ к данным ресурса сразу или с использованием метода переменных LoadFromLazarusResource, которые после этого будут хранить данные. LoadFromLazarusResource принимает на вход один строковый параметр, который указывает, какой объект должен быть загружен из файла ресурсов.  
 
Вы можете получить доступ к данным ресурса сразу или с использованием метода переменных LoadFromLazarusResource, которые после этого будут хранить данные. LoadFromLazarusResource принимает на вход один строковый параметр, который указывает, какой объект должен быть загружен из файла ресурсов.  
 
Пример:
 
Пример:
<syntaxhighlight>procedure ExampleProc;
+
<syntaxhighlight lang=pascal>procedure ExampleProc;
 
var
 
var
 
   Image: TImage
 
   Image: TImage
Line 43: Line 43:
 
Чтобы решить эту проблему вы можете:
 
Чтобы решить эту проблему вы можете:
 
* использовать lazres: c:\lazarus\tools\lazres.exe unit1.lrs unit1.lfm
 
* использовать lazres: c:\lazarus\tools\lazres.exe unit1.lrs unit1.lfm
* (проще): немного изменит дизайн формы и сохранить его; это пересоздаст .lrs файл без необходимости запускать lazres.
+
* (проще): немного изменить дизайн формы и сохранить его; это пересоздаст .lrs файл без необходимости запускать lazres.
  
 
==Получение данных из LRS ресурса==
 
==Получение данных из LRS ресурса==
Line 49: Line 49:
 
Вы можете извлекать данные из ресурса так:
 
Вы можете извлекать данные из ресурса так:
  
<syntaxhighlight>uses ...LResources...;
+
<syntaxhighlight lang=pascal>uses ...LResources...;
  
 
...
 
...
Line 97: Line 97:
  
 
Давайте скажем компилятору подключить ресурс к программе:
 
Давайте скажем компилятору подключить ресурс к программе:
<syntaxhighlight>program mydata;
+
<syntaxhighlight lang=pascal>program mydata;
  
 
{$R mydata.rc}
 
{$R mydata.rc}
Line 103: Line 103:
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
Незаметно, FPC указывает компилятору ресурсов, распространяемому вместе с ним, компилировать .rc скрипт в бинарный файл ресурсов .res. После, компоновщик включит его в исполняемый файл. Хотя это не заметно для программиста, но вы можете, если хотите, создать свой собственный .res файл при помощи, например, Borland Resource Compiler. Тогда, вместо использования <syntaxhighlight>{$R mydata.rc}</syntaxhighlight> нужно использовать <syntaxhighlight>{$R mydata.res}</syntaxhighlight>.
+
Незаметно, FPC указывает компилятору ресурсов, распространяемому вместе с ним, компилировать .rc скрипт в бинарный файл ресурсов .res. После, компоновщик включит его в исполняемый файл. Хотя это не заметно для программиста, но вы можете, если хотите, создать свой собственный .res файл при помощи, например, Borland Resource Compiler. Тогда, вместо использования <syntaxhighlight lang=pascal>{$R mydata.rc}</syntaxhighlight> нужно использовать <syntaxhighlight lang=pascal>{$R mydata.res}</syntaxhighlight>.
  
 
== Установлен ли windres ==
 
== Установлен ли windres ==
Line 121: Line 121:
 
== Использование ресурсов в вашей программе ==
 
== Использование ресурсов в вашей программе ==
 
Давайте сейчас извлечем сохраненный ресурс в файл, например mydata.dat:
 
Давайте сейчас извлечем сохраненный ресурс в файл, например mydata.dat:
<syntaxhighlight>program mydata;
+
<syntaxhighlight lang=pascal>program mydata;
 
uses
 
uses
 
   SysUtils, Windows;
 
   SysUtils, Windows;
Line 144: Line 144:
 
   end;
 
   end;
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
 
[[Category:Tutorials]]
 
[[Category:Lazarus]]
 
[[Category:FPC]]
 

Latest revision as of 00:27, 19 February 2020

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.