我尝试在包中包含资源文件。当我构造包时,我看到以下警告:
[dcc32 Conseil] H2161 Warning: Duplicate resource: Type 10 (RCDATA), ID PLUSUTILISEVOIR; File Project.dres resource kept; file Project.dres resource discarded.
字符串
在我的单位里,我写道:...
结束;
{$R Project.dres}
implementation
...
Button.Picture.LoadFromResourceName(HInstance, 'Image1');
...
型
资源加载良好,但为什么我有一个警告?
4条答案
按热度按时间c9qzyr3d1#
有时IDE会感到困惑。检查.DPR文件(使用 Project->View Source 菜单项)。应该只有一个
{$R *.RES}
条目; IDE有时会在列出的某个单元的右端添加一个条目。(The我所展示的示例是针对应用程序的,但同样可以应用于包源文件。)
正确:
字符串
不正确,将导致重复资源错误(注意
uses
第二行的额外资源指令):型
8wtpewkr2#
这是我对你所做的事情的总结:
{$R Project.dres}
添加到该包中包含的一个单元中。然后编译器在链接时报告,它被要求链接文件
Project.dres
的多个副本。编译器不会这样做,并丢弃其中一个编译的资源文件。理解这一点的关键可以在软件包的主文件.dpk文件中找到。它看起来像这样:
字符串
在IDE中使用“资源和图像”对话框时,IDE会将信息存储在项目文件(.dproj文件)中,并将
{$R *.dres}
添加到主项目源文件中。这就是上面的行。$R
指令中的*
指示编译器使用与$R
指令所在文件相同的基名称。所以这就是你如何结束对同一个.dres文件的多个引用。编译器将.dpk文件中的
{$R *.dres}
扩展为Project.dres
并链接它。最自然的解决方案是将
{$R Project.dres}
从它出现的.pas
源单元中删除。但是,将其放置在源文件中的原因可能是您在其他项目中使用源文件,并希望它独立。源文件包含加载资源的代码,因此有必要确保每当项目包含此源文件时,它还包括资源。
$R
指令将执行此操作。但这与使用IDE的“资源和图像”对话框不兼容。IDE机制依赖于将信息保存到.dproj文件,是以项目为中心的机制。因此,如果您希望源.pas文件包含
$R
指令,则需要执行以下操作:1.从“资源和图像”对话框中删除所有项目。
1.确保在任何源文件(包括.dpk和.dpr文件)中没有对
.dres
文件的引用。1.创建一个.rc资源脚本文件,其中列出了要包含的资源。
1.要求编译器编译资源脚本,并通过在.pas源文件中包含以下指令来链接它:
{$R images.res images.rc}
显然我只是在那里发明了一个文件名,但毫无疑问,你会选择合适的东西。
68bkxrlz3#
大卫哈南给我指明了正确的道路。
在我的例子中,我想为一个包的多个单元共享图像。每个单元都是一个组件。如果我在每个单元上添加{$R xxx.res},我会有一个警告:“H2161警告:重复的资源:“。如果我删除每个单元上的{$R}以将其写入.dpk,当我在项目上使用我的组件时,我会有一个运行时错误“exception EResNotFound”。
我的解决方案是创建一个单元来集中所有的资源调用。这个单元有'{$R}'
字符串
在DPK中,我这样写:
型
其他单元有一个管理器的引用,但没有'$R',因此没有警告。在执行时间没有错误,因为单元“管理器”加载和$R应用。我的每个组件可以有图像没有警告或错误。
vm0i2vca4#
我遇到了同样的问题。在包中的一个单元中,同一个单元中输入了两次指令**{$R....}**。解决方案:删 debugging 误的指令,警告消失!