Delphi H2161警告:重复资源:类型10(RCDATA)

Delphi H2161警告:重复资源:类型10(RCDATA),delphi,package,embedded-resource,delphi-xe6,Delphi,Package,Embedded Resource,Delphi Xe6,我尝试在包中包含资源文件。当我构建包时,我看到以下警告: [dcc32 Conseil] H2161 Warning: Duplicate resource: Type 10 (RCDATA), ID PLUSUTILISEVOIR; File Project.dres resource kept; file Project.dres resource discarded. 在我的单元中,我写: ... 结束 资源加载良好,但为什么我会有警告?有时IDE会感到困惑。使用Project->Vi

我尝试在包中包含资源文件。当我构建包时,我看到以下警告:

[dcc32 Conseil] H2161 Warning: Duplicate resource:  Type 10 (RCDATA), ID PLUSUTILISEVOIR; File Project.dres resource kept; file Project.dres resource discarded.
在我的单元中,我写: ... 结束


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

有时IDE会感到困惑。使用Project->View Source菜单项检查.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.
不正确,并将导致第二行使用上的重复资源错误注释extra resource指令:


有时IDE会变得混乱。使用Project->View Source菜单项检查.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.
不正确,并将导致第二行使用上的重复资源错误注释extra resource指令:


这是我对你们所做工作的概述:

您正在处理一个包项目。 您已使用“项目”菜单中的“资源和图像”对话框将一些文件添加到项目中。 您已经将行{$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文件,是一种以项目为中心的机制

因此,如果希望source.pas文件包含$R指令,请执行以下操作:

从“资源和图像”对话框中删除所有项目。 确保在任何源文件(包括.dpk和.dpr文件)中都没有对.dres文件的引用。 创建一个.rc资源脚本文件,列出您希望包含的资源。 请编译器编译资源脚本并通过在.pas源文件中包含以下指令来链接它:{$R images.res images.rc}
显然,我刚刚在那里发明了一个文件名,但毫无疑问,您将选择合适的文件名。

以下是我对您所做工作的简要介绍:

您正在处理一个包项目。 您已使用“项目”菜单中的“资源和图像”对话框将一些文件添加到项目中。 您已经将行{$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}

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

因此,如果希望source.pas文件包含$R指令,请执行以下操作:

从“资源和图像”对话框中删除所有项目。 确保在任何源文件(包括.dpk和.dpr文件)中都没有对.dres文件的引用。 创建一个.rc资源脚本文件,列出您希望包含的资源。 请编译器编译资源脚本并通过在.pas源文件中包含以下指令来链接它:{$R images.res images.rc}
显然,我刚刚在那里发明了一个文件名,但毫无疑问,您会选择合适的文件名。

大卫·赫弗南(David Heffernan)为我指明了好方法

在我的例子中,我希望共享一个包的多个单元的图像。每个单元都是一个组件。如果我在每个单元上添加{$R xxx.res},我会得到警告: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。我的每个组件都可以在没有警告或错误的情况下显示图像。

David Heffernan向我展示了好方法

在我的例子中,我希望共享一个包的多个单元的图像。每个单元都是一个组件。如果我在每个单元上添加{$R xxx.res},我会得到警告: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。我的每个组件都可以在没有警告或错误的情况下具有映像。

我已经找到了响应的开始。在.dpk中,我有.res和.dres。如果我移除它,我就不会得到警告。但是,在一个项目中,当我使用带有ressource的组件时,我会收到这样一条消息:ressource not Found我已经找到了响应的开始。在.dpk中,我有.res和.dres。如果我移除它,我就不会得到警告。但是,在项目中,当我将一个组件与ressource一起使用时,我会收到这样一条消息:ressource not Found问题涉及到一个.dres文件,它是“资源和图像”对话框中编译后的输出。@David:问题仍然是一样的。同一资源存在重复包含,很可能是由于海报上用I write…{$R Project.dres}表示的行引起的,因为IDE添加的{$R*.dres}将包含与项目名相同的文件。使用“资源和图像”对话框会自动添加{$R},因此Joc02无需编写它。这个问题涉及到一个.dres文件,它是“资源和图像”对话框编译后的输出。@David:问题还是一样的。同一资源存在重复包含,很可能是由于海报上用I write…{$R Project.dres}表示的行引起的,因为IDE添加的{$R*.dres}将包含与项目名相同的文件。使用resources and images对话框会自动添加{$R},因此Joc02无需编写它。感谢您的帮助。我试过了,但我有两个问题。首先,当我写“{$R images.res images.rc}”时,资源找不到。如果我写{$R images.res'这很好。第二,如果在包中我创建了两个使用同一资源的用户,我有两个$R,并且我有警告。除非你更精确,否则我无法帮助你。我无法处理找不到的资源。你需要精确,并包含逐字的消息。我相信你成功地制作了图像。rc?如果我写'{$R images.res images.rc}我在运行时Le projet projet Project2.exe中有此消息,我无法看到您的.rc文件。如果在包中我有两个使用{$R images.res}的{$R images.res}的{$R…}'对于共享映像,我在编译过程中收到以下消息:[dcc32 Conseil]H2161警告:重复资源:键入10 RCDATA,ID PLUSUTILISEVOIR;保留文件Project.dres resource;丢弃文件Project.dres resource。感谢您的帮助。我尝试了一下,但有两个问题。首先,当我编写{$R images.res images.rc}'资源找不到。如果
写“{$R images.res”就行了。第二,如果在包中我创建了两个使用同一个ressource的用户,我有两个$R,我有警告。除非你更精确,否则我帮不了你。我无法处理找不到的资源。你需要精确,并包含逐字的消息。我相信你成功地制作了图像。rc?如果我写{$R images.res images.rc}我在运行时Le projet projet Project2.exe中有此消息,我无法看到您的.rc文件。如果在包中我有两个使用{$R images.res}的{$R images.res}的{$R…}'对于共享映像,我在编译过程中收到以下消息:[dcc32 Conseil]H2161警告:重复资源:键入10 RCDATA,ID PLUSUTILISEVOIR;保留文件Project.dres resource;丢弃文件Project.dres resource。