Delphi在.dpr文件中添加{$R *.res}的含义

12

在.dpr文件的uses子句中,Delphi有时会在单元路径前面添加{$R *.res},这时我在尝试编译时会收到资源重复的警告。

有人知道为什么Delphi会这样做吗?我正在使用Delphi 2009,但自从Delphi 2007(可能也包括2006)以来就一直出现这种情况。


对我有帮助的是手动修复dpr文件,然后将其声明为只读,这样IDE就不会更改它。 - Johan
@Johan -- 这不是解决方案,甚至离解决方案都很遥远。 - Zam
7个回答

9

这取决于您对 .dpr 文件所做的其他操作。Delphi 希望该文件按照特定方式布局,如果您以某种方式修改了它,使内部 IDE 解析器无法正确找到某些内容,那么它可能会猜测错误。最初,.dpr 文件并不是为了让用户随意修改而设计的,因此它可能会感到困惑。IFDEFS 是最常见的罪魁祸首,可能会混淆 IDE 解析器。


1
我从dpr中删除了所有内容,没有ifdefs,没有代码,什么都没有,但它仍然发生! - Fabio Gomes
@戈梅斯:你能发布DPR的内容吗? - Bruce McGee
但是在dpr文件中使用IFDEF来控制包含哪些单元通常非常理想。例如,您可能希望通过条件语句切换内存管理器。如果IDE能够处理这个问题,那将是一个福音。 - David Heffernan
由于IFDEF可以以几乎无限的方式放置,我想挑战大家设计一种方法,使IDE能够在需要时继续更新使用列表,并在不出错的情况下维护这些IFDEF。例如,项目中的添加/删除是否会涉及到IFDEF?如果当前项目选项启用了一个IFDEF,或者没有启用呢?如果使用了需要编译时评估的$IF(而不是IFDEF),会怎样?如果IFDEF包含/排除尾部分号会怎样? - Allen Bauer

9

为什么Delphi会在你的代码中添加“错误”的{$R}和{$R *.res}文本是由DPROJ文件隐藏起来的。只需要用文本编辑器打开DPROJ文件,搜索$R *.res,然后删除这些标记即可。

<DCCReference Include="..\..\..\Core\IF.Common\uTranslation.Types.pas">
  <Form>$R *.res</Form>
</DCCReference>

将其更改为
<DCCReference Include="..\..\..\Core\IF.Common\uTranslation.Types.pas"/>

现在您的项目中将不会出现糟糕的文本(直到下一次IDE添加这样的内容到DPROJ文件失败为止)。


7
也许张贴您的.dpr文件会有助于说明您的问题。我的项目文件看起来像这样,没有任何问题:
program Example;

{$R *.res}

uses
  Unit1 in 'Unit1.pas' {frmUnit1};

begin
  Application.Initialize;
  Application.CreateForm(TfrmUnit1, frmUnit1);
  Application.Run;
end.

我的{$R *.res}代码在uses之下,可能就是问题所在。我已经在这里进行了更改,并将进行测试。 - Fabio Gomes
将{$R *.res}移到uses语句之前在我的情况下有所帮助。现在我不再收到任何重复资源警告了(Delphi XE)。 - Michael Küller

5
Delphi会在你的.dpr文件中添加{$R *.res},以将它生成的.res文件链接到你的应用程序中。例如,如果你将项目保存为MyProject.dpr,则Delphi将创建一个包含你在Delphi的“项目选项”中指定的应用程序图标和版本信息的文件MyProject.res。如果没有这个.res文件,你的.exe文件将没有图标或版本信息。
如果你收到重复资源警告,则可能在代码的其他地方也有另一个{$R}编译器指令链接了MyProject.res。它可能是.dpr文件中的重复{$R *.res},或者是另一个.pas文件中的{$R MyProject.res}。删除其他编译器指令而不是Delphi自动生成的指令,你的项目就可以正常编译了。

4

我已经掌握了一些"启发式方法"来处理IDE混淆dpr的问题:

  1. 在主要的begin-end块中,不要写入“复杂”的代码(例如带有变量或if语句的代码)。我需要完成的所有任务都会被放入单独的例程中。这似乎使IDE解析器更快乐。
  2. 如果我需要在uses子句中使用$IFDEFs,则创建一个“代理单位”,其中包含$IFDEFed单位并将其放入dpr的uses子句中。

2

这非常令人恼火,发生时没有明显的原因,并且据我所知无法防止 :(


1

在 .dpr 文件中默认 {$R *.res} 应该位于 uses 和 var 子句之间。

有时项目文件会损坏..
只需删除源目录中除 *.dpr、*.pas、*.dfm 之外的任何文件
Delphi 将重新构建其他文件,包括 *.res

就是这样


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