Ресурсы в Lazarus
Модератор: Модераторы
Ресурсы в Lazarus
Уважаемые знатоки, начал осваивать Lazarus (ОС Windows, раньше работал с Delphi) и упёрся в очень трудную для моего понимания проблему. Возможно решение очень простое, но не могу его никак понять. Прочитал кучу всего, но нигде упоминаний данной проблемы не нашел.
Задача: добавить в проект файл ресурсов с 4 bmp файлами и затем использовать эти изображения в режиме RunTime.
Проблема: при попытке загрузки ресурса в TBitmap ошибка типа "ресурс ХХХ не найден".
Подключал файл ресурсов в формате RES, собранный через brcc32.exe и подключал ресурсы непосредственно через RC файл - при распаковке EXE через 7-zip все картинки нормально работали (то есть в EXE файле присутствовали). При добавлении к распакованным изображениям расширения (*.bmp) они нормально открывались. Изображения сохранены как 24 разрядные BMP файлы.
Код весьма примитивен (тестовая программа):
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1;
{ you can add units after this }
{$R *.res}
begin
RequireDerivedFormResource:=True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
CanvasBttn, Windows;
type
{ TForm1 }
TForm1 = class(TForm)
CanvasBttn1: TCanvasBttn;
Image1: TImage;
Image2: TImage;
procedure CanvasBttn1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
uses comobj;
{$R *.lfm} {$R lib\MsgIcons.rc}
procedure TForm1.CanvasBttn1Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile('123.bmp');
Image2.Picture.Bitmap.LoadFromResourceName(hInstance, 'INFOPICT');
showmessage('!');
end;
end.
На форме кнопка и 2 Image. Загрузка из файла работает, а из ресурса нет.
Задача: добавить в проект файл ресурсов с 4 bmp файлами и затем использовать эти изображения в режиме RunTime.
Проблема: при попытке загрузки ресурса в TBitmap ошибка типа "ресурс ХХХ не найден".
Подключал файл ресурсов в формате RES, собранный через brcc32.exe и подключал ресурсы непосредственно через RC файл - при распаковке EXE через 7-zip все картинки нормально работали (то есть в EXE файле присутствовали). При добавлении к распакованным изображениям расширения (*.bmp) они нормально открывались. Изображения сохранены как 24 разрядные BMP файлы.
Код весьма примитивен (тестовая программа):
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1;
{ you can add units after this }
{$R *.res}
begin
RequireDerivedFormResource:=True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
CanvasBttn, Windows;
type
{ TForm1 }
TForm1 = class(TForm)
CanvasBttn1: TCanvasBttn;
Image1: TImage;
Image2: TImage;
procedure CanvasBttn1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
uses comobj;
{$R *.lfm} {$R lib\MsgIcons.rc}
procedure TForm1.CanvasBttn1Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile('123.bmp');
Image2.Picture.Bitmap.LoadFromResourceName(hInstance, 'INFOPICT');
showmessage('!');
end;
end.
На форме кнопка и 2 Image. Загрузка из файла работает, а из ресурса нет.
Вбив в Гугле "ресурсы lazarus" сразу первая ссылка http://wiki.freepascal.org/Lazarus_Resources/ru
Я эту статью несколько раз перечитал. Я же написал, что ресурсы упаковываются, но не распаковываются. И через стримы пробовал, и как в примере выше - ничего не выходит. Ещё вариант ошибки, который он выдавал - это формат bmp не правильный (если запаковывал файл ресурсов через brcc32, а тип выбирал RCDATA).
плохо читали однако: LResources где???Я эту статью несколько раз перечитал.
К тому же используйте стандартный создатель ресурсов (из tools вроде как).
pupsik писал(а):плохо читали однако: LResources где???
К тому же используйте стандартный создатель ресурсов (из tools вроде как)
Хорошо: LResources нужен, как я понял, только при подключении "старого" типа файла ресурсов LRS (я и его подключать пробовал - компилил так - "...toolslazres.exe MsgIcons.lrs InfoPict.bmp WarningPict.bmp ErrorPict.bmp QuestionPict.bmp", но мне было интересно подключить RES файл либо RC). Ещё раз повторюсь - изображения в EXE присутствуют, проверено через 7-zip.
Добавлено спустя 15 минут 43 секунды:
Файл ресурсов LRS работает нормально. Ресурсы упаковываются и распаковываются.
Вопрос актуален для файлов RES и RC (как в примере).
sn-102 писал(а):я и его подключать пробовал - компилил так - "...toolslazres.exe MsgIcons.lrs InfoPict.bmp WarningPict.bmp ErrorPict.bmp QuestionPict.bmp"
Ну создали вы MsgIcons.lrs.
Теперь подключайте в секции initialization и используйте (маленько поменял ваш код)
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
CanvasBttn, Windows;
type
{ TForm1 }
TForm1 = class(TForm)
CanvasBttn1: TCanvasBttn;
Image1: TImage;
Image2: TImage;
procedure CanvasBttn1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
uses comobj;
{$R *.lfm} {$R libMsgIcons.rc}
procedure TForm1.CanvasBttn1Click(Sender: TObject);
begin
Image1.Picture.LoadFromFile('123.bmp');
Image2.Picture.Bitmap.LoadFromLazarusResource('INFOPICT'); //ПОМЕНЯЛ ТУТ
showmessage('!');
end;
initialization
{$I MsgIcons.lrs} // И ТУТ
end.
sn-102 писал(а):но мне было интересно подключить RES файл либо RC
Может какие-то условия не выполнены. По ссылке которую я давал, этих условий много
Например:
FPC запускает внешний компилятор (windres или GoRC). Поэтому, компилятор ресурсов должен быть установлен и в переменной окружения PATH, должен быть прописан путь к нему.
Добавлено спустя 1 минуту 32 секунды:
sn-102 писал(а):Файл ресурсов LRS работает нормально. Ресурсы упаковываются и распаковываются.
Вопрос актуален для файлов RES и RC (как в примере).
Блин пока писал. Тут уже новая инфа появилась.
Кстати я тоже как-то бился с этими ресурсами и плюнул, остановился на LRS файлах
Так в том и прикол, что RES запаковывается, а RC файл тоже компилится и запаковывается - 7-zip распаковывает все изображения из EXE как часы. Причём, когда я делаю ошибки в подключенном RC файле - компилятор ругается на него и говорит, что исправить. Из этого я делаю логичный вывод, что компилятор RC работает как надо и все пути прописаны нормально. Хотелось бы разобраться в тонкостях подключения этих файлов, а то уже привык к RES, да и заявлено, что они работают. RC файлы, откровенно говоря, меня мало заботят, т.к. с готовыми пакетами удобнее работать.
RES - это же не наш метод!
RES - токмо для винды, LRS - кроссплатформенно.
RES - токмо для винды, LRS - кроссплатформенно.
v-t-l писал(а):RES - это же не наш метод!
RES - токмо для винды, LRS - кроссплатформенно.
Мне для винды и надо. Я, конечно, не против LRS файлов, но сам факт. Если заявлено, должно работать!
Я несколько дней честно пытался понять как RES файл присовокупить, прочитал всё что нашел в гугле на эту тему, но только на грабли наступал. То ему формат не нравится, то вообще не находит ресурс. Жаль потраченного времени. Да и другим, осваивающим Лазаря, полагаю, будет это полезно, может не будут тратить время впустую, а получат грамотный совет от опытного пользователя.
Интересно найдётся тут тот у кого RES файлы нормально работают? Может дело в версии винды или её обновления...
а хто его знаетИнтересно найдётся тут тот у кого RES файлы нормально работают?
И чем вам дефолт лазаря не угодил???
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Большое спасибо за пример. Как оказалось, дело в моём файле ресурсов.
Скажите, в каком формате были сохранены у вас файлы изображений, чем упаковывали ресурсы и с какими параметрами?
Скажите, в каком формате были сохранены у вас файлы изображений, чем упаковывали ресурсы и с какими параметрами?
sn-102 не поверите... Стандартным редактором из 7-го дельфина.
Формат фоток... А вы их не узнали
)))) Эт дефолтовские дельфиновские фотки. Они, кажись, во всех версия дельфина есть.
Параметры... Учитывая что это не консоль.... "подогнал" размер и флаг поменял.
Да забудьте вы этот res. Используйте дефолт лазаря.
Формат фоток... А вы их не узнали
Параметры... Учитывая что это не консоль.... "подогнал" размер и флаг поменял.
Да забудьте вы этот res. Используйте дефолт лазаря.
pupsik писал(а):Формат фоток... А вы их не узнали )))) Эт дефолтовские дельфиновские фотки. Они, кажись, во всех версия дельфина есть.
Не узнал, потому что никогда ими не пользовался и не натыкался на них даже.
pupsik писал(а):Да забудьте вы этот res. Используйте дефолт лазаря.
Это конечно наверно правильно, но, тем не менее, интересно разобраться. Я паковал ресурс brcc32.exe оттуда же, в файле RC формат указал RCDATA. Подгружаю свой файл - не работает, ваш работает нормально. Просто волшебство, да и только.
Не в том волшебство.
pupsik писал(а):Не в том волшебство.
Ну так приоткройте завесу тайны.
