【问题标题】:H2161 Warning: Duplicate resource: Type 10 (RCDATA)H2161 警告:重复资源:类型 10 (RCDATA)
【发布时间】:2014-12-15 13:58:16
【问题描述】:

我尝试在我的包中包含资源文件。当我构建包时,我读到了这个警告:

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

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

【问题讨论】:

  • 我找到了响应的开头。在 .dpk 中,我有“.res”和“.dres”。如果我删除它,我不会收到警告。但是,当我在项目中使用带有资源的组件时,我会收到此消息“找不到资源”

标签: delphi package embedded-resource delphi-xe6


【解决方案1】:

有时 IDE 会感到困惑。检查您的 .DPR 文件(使用 Project->View Source 菜单项)。应该只有一个{$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.

【讨论】:

  • 这个问题谈到了一个 .dres 文件,它是资源和图像对话框的编译输出。
  • @David:问题还是一样。同一资源存在重复包含,很可能是由于海报用I write...{$R Project.dres} 指示的行引起的,因为IDE 添加的{$R *.dres} 将包含相同的文件(与项目名称相同的文件)。使用资源和图像对话框会自动添加{$R},因此Joc02 无需“编写”它。
【解决方案2】:

这是我对你所做的事情的概要:

  • 您正在处理一个包项目。
  • 您已使用 Project 菜单中的 Resources and Images 对话框将一些文件添加到项目中。
  • 您已将{$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 并链接它。

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

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

所以,如果您希望源 .pas 文件包含 $R 指令,那么您应该这样做:

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

显然我只是在那里发明了一个文件名,但你无疑会选择合适的。

【讨论】:

  • 感谢您的帮助。我试试看,但我有 2 个问题。首先,当我写 '{$R images.res images.rc}' 时找不到资源。如果我写 '{$R images.res' 就可以了。其次,如果在包中我创建了 2 个使用相同资源的用户,我有两个 $r,我有警告。
  • 除非您更精确,否则我无法帮助您。我对“找不到资源”无能为力。您需要准确并包含逐字消息。我相信你成功地制作了images.rc
  • 如果我写 '{$R images.res images.rc}' 我在运行时有这个消息 "Le projet Project2.exe a déclenché la classe d'exception EResNotFound avec le message 'Ressource IMAGE non特鲁韦”。如果我写“{$R images.res}”,效果很好
  • 我猜你做错了什么。我看不到你的 .rc 文件。
  • 如果在一个包中我有 2 次使用 '{$R ...}' 共享图像,我在编译过程中会收到此消息:[dcc32 Conseil] H2161 Warning: Duplicate resource: Type 10 (RCDATA),ID PLUSUTILISEVOIR;保留文件 Project.dres 资源;文件 Project.dres 资源被丢弃。
【解决方案3】:

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。我的每个组件都可以有图像而不会出现警告或错误。

【讨论】:

    猜你喜欢
    • 2012-01-25
    • 1970-01-01
    • 2022-01-21
    • 2016-07-24
    • 2017-07-29
    • 2013-01-31
    • 2011-10-30
    • 2011-12-28
    • 2013-05-02
    相关资源
    最近更新 更多