Как загрузить файл PNG в мой пользовательский компонент? Не удается получить правильный экземпляр - PullRequest
0 голосов
/ 08 ноября 2018

Я хочу создать пользовательский элемент управления (из TPanel), который содержит некоторые изображения. Я хочу отобразить PNG (с прозрачностью) в этих магов. Поэтому я ПЫТАЮСЯ присоединить PNG через «Resource and Images» IDE к пакету.

Проблема в том, что, когда я помещаю компонент в тестовое приложение, он выходит из строя на строке MyPng->LoadFromResourceName с "ресурс не найден". Интересно, что если я добавлю PNG как ресурс в тестовое приложение, он будет работать.

Это означает, что компонент ищет неправильный модуль для ресурса PNG.
Я печатаю экземпляр с ShowMessage, он действительно показывает "ComponentTester.exe".

__fastcall TVolumeCtrl::TVolumeCtrl(TComponent* Owner)
   : TPanel(Owner)
{
    HINST h = FindClassHInstance(__classid(TVolumeCtrl));
    ShowMessage(GetModuleName(h));

    TPngImage *Png3 = new TPngImage();
    MyPng->LoadFromResourceName(h, "Btn1"); 

Как получить правильный экземпляр?


Примечание: файлы PNG скомпилированы в сгенерированный файл RES. Я заглянул внутрь с помощью Hex Viewer.

1 Ответ

0 голосов
/ 08 ноября 2018

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

Правильный способ связать ресурс для компонента - это использовать директиву $R в исходном файле, которая объявляет тип, TVolumeCtrl в этом случае. Таким образом, ресурс будет связан с тем, какой модуль содержит реализацию TVolumeCtrl. Это будет пакет при компиляции пакета времени исполнения (который используется во время разработки вашим пакетом времени разработки), и он будет исполняемым при компиляции исполняемого файла, который не использует пакеты времени исполнения.

...