Delphi 7编译错误 - 在.res和.dfm之间存在“重复的资源”

4
我遇到了与以下错误非常相似的错误: 如何解决Delphi 7编译错误 - “重复资源” 但是,我得到的错误是:
  [Error] WARNING. Duplicate resource(s):
  [Error]   Type 10 (RCDATA), ID TFMMAINTQUOTE:
  [Error]     File P:\[PATH SNIPPED]\Manufacturing.RES resource kept; file FMaintQuote.DFM resource discarded.

Manufacturing.res是默认资源文件(应用程序名为Manufacturing.exe),FMainQuote是其中一个表单。.dfm文件是纯文本文件,因此我不确定重复了哪些资源,如何找到并修复它?

如果我再次尝试编译该项目,则可以正常工作,但exe的图标与我使用“加载图标”按钮在项目选项中设置的图标不同。应用程序上的图标是一种我不认识的钟形图像。

8个回答

6

尝试查找是否有额外的 {$R *.res} 或 {$R *.dfm},可能是从其他地方复制过来的。


5
Delphi将所有DFM文件转换为资源,并以类名命名。您可以使用资源编辑器打开基于表单的Delphi应用程序来验证这一点。
搜索所有单位中TFMMAINTQUOTE表单的实例。它很可能在两个单位中出现,其中一个单位未链接到您的项目,但是通过使用子句引用错误单元而被拉入(错误是指该单元已保存为不同名称,但具有相同的表单名称,如果它是您项目的一部分,则编译器会在您第一次添加该单位时抱怨)。
解决此问题的简单方法是在您的项目中查找TFMMAINTQUOTE表单并将其重命名为其他名称,但是旧的TFMMAINTQUOTE仍将被拉入。
我建议使用好的目录grep工具,例如GExperts中的工具来进行搜索。这将节省您大量时间,并且可以设置为搜索整个硬盘驱动器。 GExperts的优点是免费的,并且直接集成到Delphi IDE中。

我不能没有 GExperts Grep 搜索。 ;) - Erick Sasse
谢谢,我会尝试使用GExperts,整个项目目录的搜索/替换功能是我需要的。 - Robo

2

尝试将Manufacturing.res重命名为Manufacturing.bak或其他名称。 Delphi应该会重新创建res文件。

当然,您需要在新文件中重新创建任何引用、字符串等res文件中的内容,但无论如何都值得一试...


我觉得我之前已经尝试过了,但我认为我需要重新启动Delphi或者做些其他的事情才能正确地重新创建它。我遇到的另一个问题有点让人困惑,那就是Delphi 7不喜欢我使用的32位图标。当我使用一个更简单(但外观较差)的图标时,程序可以正常运行而没有错误。 - Robo

1
最近,当我试图重新将DBISAM数据库组件添加到调色板时,Delphi 7向我展示了这种“WARNING. Duplicate resource(s): File resource kept resource discarded”的警告信息。
File D:\DELPHI\DBISAM\db324d6d.res resource kept; file 
  D:\DELPHI\DBISAM\db324d6d.res resource discarded.
Type 14 (ICON GROUP), ID MAINICON:

如您所见,当出现正是这个与RES相关的Delphi错误情况时,会有两个相同的通知指向同一个资源,在这里是"D:\DELPHI\DBISAM\db324d6d.res"文件。

我最初认为是来自两个供应商包的资源冲突,因此我拆卸了其他已安装的组件。经过4个小时左右的努力,我终于发现另一个资源引用了DBISAM DPK包文件:

package db324d6d;
{$R *.res}
{$R 'db324d6d.res'}
...

现在我记得 DBIsam 大约一周前抱怨了关于 "缺少 .RES 资源文件" 的问题。 我进行了例行检查,并确保 DPk 文件中存在该行,并且 RES 文件存在于磁盘上。 在那时,我可能已经在 DPK 文件中添加了第二行,但是成功构建了包,并且我能够在整个星期内使用它。

现在那个额外的行回来了,而且很困难。我真的很喜欢充满挑战的周六四小时。

简而言之,如何修复它:删除这些资源行中的后者。错误出现在当它们都指向同一个资源时。

因此,只应保留这个:

package db324d6d;
{$R *.res}
...

哎呀,希望这能帮到其他人。


1

我遇到了同样的错误。我认为造成这个错误的因素有:

  1. 没有 *.res 文件
  2. 与另一个项目共用的公共单元
  3. 出现错误的项目中有一个与另一个项目中的表单同名的表单

解决方案:重命名表单(在出现错误信息的项目中)


0

编辑RES文件并从中删除重复的资源。这样您就可以保留原始图标。


0
如果您重命名一个窗体,并且该窗体在其他单元的“Uses”部分中被引用,则会出现上述错误。
解决方案是以上述方法的混合。
(1)将资源文件扩展名更改为.bak(以便稍后重新创建)。 (2)搜索所有单元并将对旧单元/窗体名称的引用更改为新名称。 (3)重新编译,现在应该可以正常运行。

0

额外的{$R *.res}在*.dpr文件中像这样:

program Test;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Sample in 'Sample.pas',
  Proc in 'Proc.pas';

{$R *.res} //<----delete this if you put them in the Unt1.pas. ok.

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接