2014-10-20 44 views
1

我尝试将资源文件包含在我的包中。当我构建的包,我读到这样的警告:H2161警告:重复资源:类型10(RCDATA)

[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'); 
... 

资源加载良好,但为什么我有警告?

+0

我已经找到了回应的起点。在.dpk中我有“* .res”和“* .dres”。如果我删除它,我不会收到警告。但是,在项目中,当我使用具有资源的组件时,我收到此消息“找不到资源” – Joc02 2014-10-21 15:00:03

回答

3

有时IDE会感到困惑。检查您的.DPR文件(使用项目 - >查看源代码菜单项)。应该只有一个{$R *.RES}条目; IDE有时会在列出的其中一个单元的右端添加一个。

(我展示的样品是一个应用程序,但同样可以适用于包的源文件)

正确:

program MaintMockup; 

uses 
    Vcl.Forms, 
    NewMaintenanceDlg in 'NewMaintenanceDlg.pas' {Form2}, 
    Validations in '..\Validations.pas'; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm2, Form2); 
    Application.Run; 
end. 

不正确的,并会导致重复的资源错误(注意的uses秒行额外资源指令):

program MaintMockup; 

uses 
    Vcl.Forms, 
    NewMaintenanceDlg in 'NewMaintenanceDlg.pas' {Form2}, {$R *.RES} 
    Validations in '..\Validations.pas'; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm2, Form2); 
    Application.Run; 
end. 
+0

这是一个.dres文件的问题,它是资源和图像对话框的编译输出。 – 2014-10-22 06:33:12

+0

@David:问题依旧。因为IDE添加的'{$ R * .dres}'将会有''我编写... {$ R Project.dres}'指示的海报线所引起的相同资源的重复包含。包含相同的文件(与项目名称相同的文件)。使用资源和图像对话框会自动添加'{$ R}',所以Joc02不必“写”它。 – 2014-10-22 12:31:10

1

这是我对你做了什么简介:

  • 您正在开发一个包装项目。
  • 您已使用资源和图像对话框从项目菜单中向项目添加了一些文件。
  • 您已将行{$R Project.dres}添加到包中包含的其中一个单元。

编译器然后在链接时报告已经要求链接该文件的多个副本Project.dres。编译器不会执行此操作并丢弃其中一个编译的资源文件。

理解这一点的关键可以在你的包的主文件,.dpk文件中找到。它看起来是这样的:

package Package1; 

{$R *.res} 
{$R *.dres} 
.... 

当您使用的IDE对话框中的IDE存储在项目文件中的信息,.dproj文件资源和图像,并且还增加了{$R *.dres}到主项目源文件。这就是上面可以看到的那条线。 $R指令中的*指示编译器使用与出现$R指令的文件相同的基本名称。

所以这就是你最终得到多个引用到同一个.dres文件。编译器将.dpk文件中的{$R *.dres}扩展为Project.dres并将其链接。

最自然的解决方案是从.pas源单元中删除它出现的{$R Project.dres}

但是,将源文件放入源文件的原因可能是您在其他项目中使用了源文件,并且希望它独立运行。源文件包含加载资源的代码,确保每当项目包含此源文件时,它都包含资源。一个$R指令将做到这一点。但这与使用IDE的资源和图像对话框不兼容。该IDE机制依赖于将信息保存到.dproj文件,并且是一个以项目为中心的机制。

所以,你想要的源文件的.pas这里包括$R指令是做什么:

  1. 取下资源和图像对话框中的所有项目。
  2. 确保在任何源文件中都没有对.dres文件的引用,包括.dpk和.dpr文件。
  3. 创建一个.rc资源脚本文件,列出您希望包含的资源。
  4. 要求编译器编译资源脚本,并通过包括这个指令在.PAS源文件链接它:{$R images.res images.rc}

显然我刚刚发明了一个文件名存在,但毫无疑问你会捡东西适当。

+0

感谢您的帮助。我尝试了但我有两个问题。首先,当我写'{$ R images.res images.rc}'时,资源找不到。如果我写'{$ R images.res'工作正常。其次,如果在包中我创建了两个使用相同资源的用户,我有两个$ r,并且我有警告。 – Joc02 2014-10-22 15:21:16

+0

除非你更精确,否则我无法帮到你。 “无法找到资源”我无能为力。您需要精确并包含逐字消息。我相信你成功地制作了'images.rc'? – 2014-10-22 15:25:48

+0

如果我写'{$ R images.res images.rc}'我在运行时有这条消息“Le projet Project2.exe是一个异常EResNotFound avec消息'资源IMAGE nontrouvée”。如果我写的“{$ R images.res}”工作正常 – Joc02 2014-10-22 15:33:33

0

David Heffernan向我展示了一种好方法。

在我的情况下,我想分享一个包的多个单位的图像。每个单元都是一个组件。如果我在每个单元上添加{$ R xxx.res},我有一个waring:“H2161警告:重复资源:”。如果我将每个单元上的{$ R}删除到.dpk上,那么当我在项目上使用我的组件时,会出现运行时错误“异常EResNotFound”。

我的解决方案是创建一个集中所有呼叫资源的单元。这个单位有“{$ R}”

unit ResourceManager; 

interface 

uses Graphics, Classes; 

type 
    TResourceManager = class 
    public type 
     TYImageList = (acorn, address_bar); 
    public 
     class procedure LoadImage(ilImage: TYImageList; imgResult: TBitmap); overload; 
    end; 

implementation 

uses TypInfo; 

{$R 'TestPackageResource.res'} 
{ TResourceManager } 

class procedure TResourceManager.LoadImage(ilImage: TYImageList; imgResult: TBitmap); 
begin 
    imgResult.LoadFromResourceName(hInstance, GetEnumName(TypeInfo(TYImageList), integer(ilImage))); 
end; 

end. 

在DPK我写这篇文章:

{$R TestPackageResource.res TestPackageResource.rc} 

的其他单位有一个参考的经理,但没有一个“$ R”因此没有警告。 在执行时没有错误,因为单元“管理器”已加载并且应用了$ R。我的每个组件都可以没有警告或错误的图像。