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
| Old | New | Line | |
|---|---|---|---|
| 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).* |
