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

piwo6bdm  于 11个月前  发布在  其他
关注(0)|答案(4)|浏览(153)

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

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


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

c9qzyr3d

c9qzyr3d1#

有时IDE会感到困惑。检查.DPR文件(使用 Project->View Source 菜单项)。应该只有一个{$R *.RES}条目; IDE有时会在列出的某个单元的右端添加一个条目。
(The我所展示的示例是针对应用程序的,但同样可以应用于包源文件。)
正确:

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.

8wtpewkr

8wtpewkr2#

这是我对你所做的事情的总结:

  • 您正在处理一个包项目。
  • 您已经使用 * 项目 * 菜单中的 * 资源和图像 * 对话框向项目添加了一些文件。
  • 您已经将行{$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.从“资源和图像”对话框中删除所有项目。
1.确保在任何源文件(包括.dpk和.dpr文件)中没有对.dres文件的引用。
1.创建一个.rc资源脚本文件,其中列出了要包含的资源。
1.要求编译器编译资源脚本,并通过在.pas源文件中包含以下指令来链接它:{$R images.res images.rc}
显然我只是在那里发明了一个文件名,但毫无疑问,你会选择合适的东西。

68bkxrlz

68bkxrlz3#

大卫哈南给我指明了正确的道路。
在我的例子中,我想为一个包的多个单元共享图像。每个单元都是一个组件。如果我在每个单元上添加{$R xxx.res},我会有一个警告:“H2161警告:重复的资源:“。如果我删除每个单元上的{$R}以将其写入.dpk,当我在项目上使用我的组件时,我会有一个运行时错误“exception 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应用。我的每个组件可以有图像没有警告或错误。

vm0i2vca

vm0i2vca4#

我遇到了同样的问题。在包中的一个单元中,同一个单元中输入了两次指令**{$R....}**。解决方案:删 debugging 误的指令,警告消失!

相关问题