【问题标题】:How to add a resource (*.res) file to the package with components correctly?如何正确地将资源 (*.res) 文件添加到带有组件的包中?
【发布时间】:2011-10-13 10:45:37
【问题描述】:

我在单个 .dpk 文件中设置了我自己的 Delphi 组件。我的一个组件需要一些图像才能与它一起分发。我创建了 RES 文件(让它成为“MyImages.RES”),我希望我的可视组件在创建时加载其内容。

如何正确将此 RES 文件添加到 DPK?

当我将 {$R 'MyImages.RES'} 放入我的 .dpk 文件时,TResourceStream 在创建时失败,因为它无法通过资源名称找到我的图片:

constructor TMyComponent.Create(AOwner: TComponent);
begin
  S := TResourceStream.Create(HInstance, 'MY_PICTURE1', RT_RCDATA);

RES 文件是由这个 RC 创建的:

MY_PICTURE1 RCDATA "my_picture1.png"

【问题讨论】:

  • 一些想法。您是否有单独的设计时包和运行时包,并且 .res 仅链接到设计时包?或者,您是否以某种方式构建了一个不使用运行时包的 exe?
  • @David Heffernan:我有一个用于设计时和运行时的包。这个组件包也和主项目在同一个项目组,会不会导致这样的问题?
  • 尝试在调用TResourceStream.Create之前添加ShowMessage(IntToHex(HInstance, 8))。如果它弹出一个值为00400000 的对话框,那么您是静态链接而不是包。
  • @David Heffernan:是的,它显示的是 00400000。你能给一些建议如何解决这个问题吗?

标签: image delphi resources components


【解决方案1】:

直接在声明组件的单元中使用{$R 'MyImages.res'} 指令。加载资源时,使用FindClassHInstance(TMyComponent)TMyComponent 所在的模块)而不是HInstance(主可执行文件 - 这可能恰好也是TMyComponent 所在的模块,具体取决于您的链接方式)。

编辑:您似乎想与运行时包链接,但实际上您正在将组件静态链接到您的主可执行文件中。显然,您已经编译了运行时(和设计时).bpl 包。要编译使用带有运行时包的组件的主项目(.exe 或 .dll),您应该:

  1. 在项目选项中选择“使用运行时包构建”
  2. 将包的基本名称添加到项目选项中的运行时包列表中。

【讨论】:

  • 但是当我将 {$R 'MyImages.res'} 放入 TMyComponent 模块的实现部分时,主可执行文件无法编译,因为消息“找不到文件'MyImages.res' "
  • 您应该确保 .res 文件位于编译器可以找到的位置。通常,它与 .dcu 位于同一目录中。
  • 是的,将RES文件的路径添加到IDE的主库路径后,它就起作用了。非常感谢 TOndrej 和 David!
  • 注意。对于 c++ buildet,您需要使用: FindClassHInstance(__classid(TMyComponent))
【解决方案2】:

从 cmets 到您的问题,很明显您没有在运行时正确链接到包,TMyComponent 被静态链接到您的可执行文件,而不是从包中动态链接。

您可以通过以下两种方式之一解决此问题:

  1. 修复链接问题,以便在运行时确实链接到包。这是在项目 | 中配置的。选项 | Delphi IDE 中的包。
  2. 如果您想静态链接,那么您还需要将 .res 文件链接到您的可执行文件。 @TOndrej 的回答提供了一种巧妙的安排方式。

【讨论】:

  • 这应该是组件的一个选项。我的意思是组件应该能够加载它的资源,无论它是否链接到 BPL、DLL 或 EXE,有或没有运行时包。我在下面的回答处理所有情况,因为资源将始终链接到类链接到的同一模块中。
  • 但是如何改变链接的类型呢?当包与我的主要可执行文件在同一个项目组中时是否有可能?
  • @Andrew:只要使用我的答案,它应该在所有情况下都一样。
  • @Andrew 使用运行时包查看项目 |选项 | IDE 中的软件包。确保选中“使用运行时包构建”。当然,包括我自己在内的许多人更喜欢使用静态链接,但选择权在你。
  • “使用运行时包构建”应该被选中并且包含在运行时包列表中的包。
猜你喜欢
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
  • 2011-11-30
  • 2014-04-27
  • 2015-03-14
  • 2011-06-28
相关资源
最近更新 更多