Sign in Join
Wiki copytemporary

Lazarus Resources/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Lazarus Resources/ru

OldNewLine
1+# Введение
2+
3+Файл ресурсов содержит данные, встраиваемые в исполняемый файл. Это могут быть изображения, строки, информация о версии, Manifest (Windows) и формы. Сюда включены данные, к которым программист может обратиться из кода. Использование ресурсов может быть удобно, если вы хотите распространять автономные исполняемые файлы.
4+
5+До FPC 2.4 не было возможности использовать "нормальные" файлы ресурсов (*.res) в Lazarus, потому что они Win32 специфичны. Смотрите ниже #Lazarus ресурсы.
6+
7+Нормальные ресурсы доступны в последней версии FPC (включая все последние версии Lazarus). Смотрите ниже #FPC ресурсы.
8+
9+# Lazarus ресурсы
10+
11+Для того чтобы использовать файлы как ресурсы Lazarus, нужно пересоздать их при помощи lazres. Lazres можно найти в папке "Tools", расположенной в установочной директории Lazarus (C:\Lazarus\Tools\\).
12+
13+Теперь можно скомпилировать файлы ресурсов Lazarus (*.lrs) при помощи командной строки. Синтаксис lazres:
14+
15+
16+ <nowiki>lazres <имя файла ресурсов> <включаемые файлы (file1 file2 file3 ...)></nowiki>
17+
18+Пример:
19+
20+
21+ <nowiki>lazres mylazarusresource.lrs image.jpg</nowiki>
22+
23+Для использования файла ресурсов Lazarus в вашем проекте, подключите его используя дирекстиву компилятора \$I в разделе **initialization** вашего модуля.
24+
25+Вы можете получить доступ к данным ресурса сразу или с использованием метода переменных LoadFromLazarusResource, которые после этого будут хранить данные. LoadFromLazarusResource принимает на вход один строковый параметр, который указывает, какой объект должен быть загружен из файла ресурсов. Пример:
26+
27+``` pascal
28+procedure ExampleProc;
29+var
30+ Image: TImage
31+begin
32+ Image := TImage.Create;
33+ Image.Picture.LoadFromLazarusResource('image'); // Обратите внимание, что расширение файла не указывается
34+end;
35+
36+initialization
37+ {$I mylazarusresource.lrs}
38+```
39+
40+Этот код подключает файл mylazarusresource.lrs к проекту. В процедуре ExampleProc создан объект TImage и в него загружено изображение "image" из ресурса. Файл, который был встроен в ресурс, возможно был назван image.jpg.
41+
42+Все класс, наследованные от TGraphic, имеют процедуру LoadFromLazarusResource.
43+
44+## Lazarus Resource Form File
45+
46+Lazarus генерирует .LRS файлы c файлами формы .LFM.
47+
48+Когда файл формы (*.lrs) отсутствует, FPC выдает следующее сообщение об ошибке: ERROR: unit1.pas(193,4) Fatal: Can't open include file "unit1.lrs"
49+
50+Чтобы решить эту проблему вы можете:
51+
52+- использовать lazres: c:\lazarus\tools\lazres.exe unit1.lrs unit1.lfm
53+- (проще): немного изменить дизайн формы и сохранить его; это пересоздаст .lrs файл без необходимости запускать lazres.
54+
55+## Получение данных из LRS ресурса
56+
57+Вы можете извлекать данные из ресурса так:
58+
59+``` pascal
60+uses ...LResources...;
61+
62+...
63+procedure TForm1.FormCreate(Sender: TObject);
64+var
65+ r: TLResource;
66+ Data: string;
67+begin
68+ r := LazarusResources.Find('datafile1');
69+ if r = nil then
70+ raise Exception.Create('Resource datafile1 is missing');
71+
72+ Data := r.Value;
73+ //...что-то делать с данными...
74+end;
75+```
76+
77+# FPC ресурсы
78+
79+Начиная с версии FPC 2.4 вы можете использовать стандартные .rc (Resource Script) файлы для подключения ресурсов в ваших проектах. Для превращения .rc скрипта в бинарный ресурс (.res файл), FPC запускает внешний компилятор (windres или GoRC). Поэтому, компилятор ресурсов должен быть установлен и в переменной окружения PATH, должен быть прописан путь к нему. Для получения дополнительной информации см.: [FPC Programmer's guide, chapter 13 "Using Windows resources"](http://www.freepascal.org/docs-html/prog/progch13.html)
80+
81+Для упрощения процесса компиляции, можно использовать уже скомпилированные файлы ресурсов (.res). Вы можете предварительно скомпилировать ресурсы любым доступным компилятором - windres (доступен на Unix и Windows), GoRC (только Windows), Microsoft Resource Compiler (rc.exe входит в Visual Studio), Borland Resource Compiler (brcc32.exe входит в Delphi, C++ Builder или продукты Rad Studio) или любой другой.
82+
83+Используйте директиву {\$R filename.rc} или {\$R filename.res} для включения файла ресурсов в исполняемый файл. FPC RTL предоставляет как низкоуровневые функции, так и высокоуровневые классы для работы с ресурсами.
84+
85+Низкоуровневые функции:
86+
87+- EnumResourceTypes
88+- EnumResourceNames
89+- EnumResourceLanguages
90+- FindResource
91+- FindResourceEx
92+- LoadResource
93+- SizeofResource
94+- LockResource
95+- UnlockResource
96+- FreeResource
97+
98+Они совместимы с Windows API функциями \[<http://msdn.microsoft.com/en-us/library/ff468902(VS.85>).aspx Resource Functions\].
99+
100+Базовым классом, работающим с ресурсами, является TResourceStream. LCL использует его для загрузки встроенных растровых изображений, иконок, и форм. Посмотрите на TGraphic.LoadFromResourceID или TIcon.LoadFromResourceHandle чтобы понять, как они используются в LCL.
101+
102+## Добавление ресурсов в программу
103+
104+Давайте рассмотрим ситуацию, когда нужно сохранить некоторые данные в исполняемый файл и при выполнении программы необходимо извлечь их.
105+
106+Сначала мы должны сообщить компилятору, какие файлы включить в ресурс. Делаем это в .rc файле:
107+
108+*Файл mydata.rc*
109+
110+
111+ <nowiki>MYDATA RCDATA "mydata.dat"</nowiki>
112+
113+Здесь MYDATA это имя ресурса, RCDATA это тип ресурса (подробнее смотрите \[<http://msdn.microsoft.com/en-us/library/ms648009(VS.85>).aspx Resource Types\]) и "mydata.dat" это файл с данными.
114+
115+Давайте скажем компилятору подключить ресурс к программе:
116+
117+``` pascal
118+program mydata;
119+
120+{$R mydata.rc}
121+begin
122+end.
123+```
124+
125+Незаметно, FPC указывает компилятору ресурсов, распространяемому вместе с ним, компилировать .rc скрипт в бинарный файл ресурсов .res. После, компоновщик включит его в исполняемый файл. Хотя это не заметно для программиста, но вы можете, если хотите, создать свой собственный .res файл при помощи, например, Borland Resource Compiler. Тогда, вместо использования
126+
127+``` pascal
128+{$R mydata.rc}
129+```
130+
131+нужно использовать
132+
133+``` pascal
134+{$R mydata.res}
135+```
136+
137+.
138+
139+## Установлен ли windres
140+
141+На Linux/OS X, вам нужно убедиться, что компилятор ресурсов windres, который входит в состав инструментов mingw32, у вас установлен. Например на Debian вы можете выполнить:
142+
143+``` bash
144+aptitude install mingw32-binutils
145+# this installs e.g. /usr/bin/i586-mingw32msvc-windres
146+# but FPC expects just windres, so:
147+ln -s /usr/bin/i586-mingw32msvc-windres /usr/bin/windres
148+# alternatively (and probably more "official") use -FCi586-mingw32msvc-windres in your calls to fpc or
149+# add -FCi586-mingw32msvc-windres to your fpc.cfg
150+```
151+
152+На Windows, компиляторы ресурсов windres и gorc устанавливаются вместе с FPC и Lazarus.
153+
154+## Использование ресурсов в вашей программе
155+
156+Давайте сейчас извлечем сохраненный ресурс в файл, например mydata.dat:
157+
158+``` pascal
159+program mydata;
160+uses
161+ SysUtils, Windows;
162+{$R mydata.res}
163+var
164+ S: TResourceStream;
165+ F: TFileStream;
166+begin
167+ // create a resource stream which points to our resource
168+ S := TResourceStream.Create(HInstance, 'MYDATA', RT_RCDATA);
169+ // Please be aware of writing an apostrophes in resource type - source will not be axtracted!!!
170+ try
171+ // Создание файла mydata.dat в папке приложения
172+ F := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'mydata.dat', fmCreate);
173+ try
174+ F.CopyFrom(S, S.Size); // Копирование данных из ресурса в файл
175+ finally
176+ F.Free; // destroy the file stream
177+ end;
178+ finally
179+ S.Free; // destroy the resource stream
180+ end;
181+end.
182+```
183+
184+---
185+*From the Free Pascal wiki, page "Lazarus Resources/ru", as it stood on 2020-02-18 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history