Компонент, который использует ресурс, который реализован в модуле с именем MyUnit1.pas
, должен включать следующую строку внутри:
{$R MyUnitRc.res MyUnitRc.rc}
Обратите внимание, что приведенный выше синтаксис не будет работать на некоторых старых версиях delphi (Delphi 7). Вышеизложенное работает в 2010, XE, XE2 и т. Д., И он компилирует .rc в .res, когда проект создает этот блок. В качестве альтернативы вы добавили бы объявление {$R}
в каждое статически связанное приложение, а также в файл .dpr вашего BPL.
Этот файл .RC mYUnitRc.res
будет содержать одну или несколько строк, объявляющих ваши ресурсы. Я использую объявления RCDATA для загрузки PNG, например:
MYIMAGENAME RCDATA "MyFile.png"
Если вы сделаете это так, вместо использования файла RC, добавленного только в .dproj / .dpr, тогда он будет работать в двух важные случаи:
Чтобы справиться с третьим случаем, с которым отвечает другой (Реми и Дэвид), вам нужно вызвать FindClassHinstance, как заявил Реми. Однако я считаю, что вы также должны посмотреть, как вы включаете файл ресурсов и скомпилировать его и связать как внутри вашего пакета, так и внутри приложений, которые используют этот компонент.
Вот пример кода, показывающий загрузку ресурс во время выполнения в TPngImage, который я использую в своих собственных компонентах:
procedure TSampleControl.LoadImageFromResource( button:TSubControl);
var
png:TPngImage;
begin
if button.DefaultResourceId='' then exit;
png := TPngImage.Create;
try
try
png.LoadFromResourceName(HInstance,button.DefaultResourceId);
button.Glyph.Assign(png);
except
on E:Exception do begin
OutputDebugString( PChar(button.DefaultResourceId+' load error:'+E.Message) );
end;
end;
finally
png.Free;
end;
end;
Обратите внимание, что я улавливаю исключения загрузки ресурсов, которые оставляют некоторые элементы в моем управлении без их глифов, но по крайней мере не разбивают Delphi , HInstance
, возможно, потребуется изменить, поскольку Дэвид и Реми Пойнт используют LoadFromResourceName
для обработки случая, когда вам нужно загрузить с .BPL, но я не думаю, что вы можете предположить, что человек, который использует ваши компоненты, всегда перераспределяем ваш файл BPL
, и, следовательно, FindClassHinstance
предпочтительнее GetModuleHandle
..
Обновление: я должен был использовать то, что предложил Реми:
png.LoadFromResourceName( FindClassHInstance(TSampleControl),
button.DefaultResourceId);