【问题标题】:Delphi 7 compile error - “Duplicate resource(s)” between .res and .dfmDelphi 7 编译错误 - .res 和 .dfm 之间的“重复资源”
【发布时间】:2008-10-08 21:58:38
【问题描述】:

我遇到了与以下错误非常相似的错误:

How can I fix this delphi 7 compile error - "Duplicate resource(s)"

但是,我得到的错误是这样的:

  [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 的图标与我在项目选项中使用“加载图标”按钮设置的图标不同。应用程序上的图标是某种我不认识的铃铛图像。

【问题讨论】:

    标签: delphi


    【解决方案1】:

    尝试寻找额外的 {$R *.res} 或 {$R *.dfm},您可能从某个地方复制了它。

    【讨论】:

      【解决方案2】:

      Delphi 将所有 DFM 文件转换为资源,并将它们命名为类的名称。您可以通过使用资源编辑器并打开任何基于表单的 Delphi 应用程序来验证这一点。

      在您的所有单位中搜索 TFMMAINTQUOTE 表单的实例。它最有可能在两个单元中,其中一个未链接到您的项目,但通过引用错误单元的 uses 子句被拉入(错误,因为它以不同的名称保存但具有相同的表单名称,如果它是您项目的一部分,那么当您首先添加该单元时编译器会抱怨)。

      解决此问题的简单方法是在您的项目中找到 TFMMAINTQUOTE 表单并将该表单重命名为其他名称,但仍然会拉入旧的 TFMMAINTQUOTE。

      我建议使用一个好的目录 grep 工具,例如 GExperts 中的那个来进行搜索。它将为您节省大量时间,并且可以根据需要设置为搜索整个硬盘驱动器。 GExperts 的优势在于它是免费的,并且可以直接集成到 Delphi IDE 中。

      【讨论】:

      • 没有 GExperts Grep 搜索我活不下去。 ;)
      • 谢谢,我会试试 GExperts,我需要搜索/替换整个项目目录的能力。
      【解决方案3】:

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

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

      【讨论】:

      • 以为我已经尝试过了,但我认为我需要重新启动 Delphi 或其他东西才能正确地重新创建它。我遇到的另一个让我有点困惑的问题是 Delphi 7 不喜欢我使用的 32 位图标。当我使用更简单(但看起来更糟糕)的图标时,运行没有错误。
      【解决方案4】:

      最近,当我试图将 DBISAM 数据库组件重新安装到调色板时,这种“警告。重复资源:文件资源保持资源被丢弃”出现在 Delphi 7 中。

      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包文件的Resource引用:

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

      现在我记得 DBIsam 大约一周前抱怨“缺少 .RES 资源文件”。我定期检查,并确保 DPK 文件中存在该行并且 RES 文件在磁​​盘上。 那时我可能已经以某种方式将第二行添加到 DPK 文件中,但还构建了包,并且我能够整周使用它。

      现在那条额外的线反击了,并且狠狠地打了它。我只是喜欢周六 4 小时的挣扎。

      简而言之,如何解决它:删除这些资源行中的后者。当它们都指向相同的资源时会出现错误。

      所以,只剩下这个了:

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

      唷,我希望这对其他人有帮助。

      【讨论】:

        【解决方案5】:

        我遇到了同样的错误。我认为促成因素是:

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

        解决方法:重命名表单(在项目中有错误信息)

        【讨论】:

          【解决方案6】:

          如果您重命名一个 from 并且此表单在其他 Units 的 Uses 部分中被引用,那么您会收到上述错误。

          解决方案是上述的混合。

          (1) 更改资源文件以.bak 结尾(以便稍后重新创建)。 (2) 搜索所有单元并将旧单元/表格名称的引用更改为新的。 (3) 重新编译,现在就ok了。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              额外的{$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.
              

              【讨论】:

                猜你喜欢
                • 2010-09-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-03
                • 1970-01-01
                相关资源
                最近更新 更多