Ресурсы пакета Delphi - EResNotFound

Имея уже Googled для решения этого, ни одно из предложений не работает для меня, так что я что-то пропустил или сделал что-то не так.

У меня есть несколько пакетов в моем приложении Delphi XE2, из которых несколько этих пакетов содержат ресурсы RCDATA, которые в конечном итоге являются изображениями PNG.

Элемент управления, который использует ресурс (-ы), отлично работает в дизайнере Delphi XE2 - ресурс загружается и отрисовывается, как ожидалось. Когда я прихожу, чтобы запустить основное приложение, в котором используется пакет / элемент управления, мне предоставляется исключение EResNotFound, когда элемент управления пытается загрузить элемент ресурса:

handle := FindClassHInstance(Self.ClassType);
fPlaneImage := TPngImage.Create;
fPlaneImage.LoadFromResourceName(handle, 'IDC_IMG_PLANE');

И когда приложение запускается, я получаю следующую ошибку:

Project PinPoint.exe поднял класс исключения EResNotFound с сообщением IDC_IMG_PLANE not found '.

И если я попал continueв отладчик, я получаю:

Project PinPoint.exe повышает класс исключения EPNGCouldNotLoadResource с сообщением «Изображение png не может быть загружено из идентификатора ресурса».

Я пробовал передать все варианты дескриптора в LoadFromResourceфункцию:

fPlaneImage.LoadFromResourceName(HInstance, 'IDC_IMG_PLANE');
fPlaneImage.LoadFromResourceName(GetModuleHandle('AppCore.bpl'), 'IDC_IMG_PLANE');
fPlaneImage.LoadFromResourceName(FindClassHInstance(Self.ClassType), 'IDC_IMG_PLANE');

Но все они дают то же исключение.

Я рассматривал вопрос о том, будет ли проще создавать отдельный пакет, содержащий все ресурсы, а затем ссылаться на это из каждого другого пакета в проекте, а не на каждый пакет, имеющий свои собственные ресурсы, однако я не уверен, будет работать.

Пожалуйста, может кто-нибудь предложить какие-либо советы.

delphi,resources,

0

Ответов: 1


-1

Попробуйте использовать приведенную ниже FindResModuleфункцию для получения ресурсного модуля.

// use fPlaneImage.LoadFromResourceName(FindResModule('IDC_IMG_PLANE'), 'IDC_IMG_PLANE');

function FindResModule(const AResourceName: string): HINST;
var
  LModule: PLibModule;
begin
  LModule := LibModuleList;
  while Assigned(LModule) do
  begin
    Result := LModule.Instance;
    if (Result <> 0) and (FindResource(Result, PChar(AResourceName), RT_RCDATA) <> 0) then
      Exit;

    LModule := LModule^.Next;
  end;

  Result := 0;
end;

В случае сбоя, скорее всего, ресурс «устраняется компоновщиком». Это может случиться, например, когда вы создаете свои собственные пакеты, и вы пропустите, чтобы добавить блок с ресурсом в ваш пакет или файл приложения. Просто добавьте блок в раздел uses вашего приложения.

Я не вижу вреда, если вы создадите отдельный пакет для ресурсов. Он должен работать нормально, но на самом деле это не требуется. Только один небольшой намек, пакет BPL не требуется, вы можете упаковать свои ресурсы в DLL

Дельфы, ресурсы,
Похожие вопросы