Delphi 7升级到Delphi XE2时的.res文件问题

7
当我在Delphi XE2中打开一个Delphi 7项目并打开项目选项时,会出现错误:
"Unable to set Icon: Cannot open file "........\AppName_Icon.ico".
The system cannot find the file specified".

我注意到项目的版本信息丢失了。 Delphi 7项目有一个.Res文件,其中存储了MAINICON和版本信息。 为什么Delphi XE2不能使用这个.Res文件来检索MAINICON和版本信息。
此外,如果我尝试在XE2中编译应用程序,会出现错误 -
[BRCC32 Error] MtxReq.vrc(2): file not found: MtxReq_Icon.ico

新的MTXReq.vrc文件已创建,而MtxReq.res文件已删除。
为什么会这样?我不想失去来自.res文件的项目图标和版本设置。
有没有办法强制XE2使用.res文件并且不删除它?
非常感谢任何帮助。
抱歉我还不能发表评论(需要更多的声望点)...
Warren - 这里是你问题的回答(只删除.dproj文件而保留.dpr文件不是更快的方法吗?)
我删除了.dproj和.dproj.local文件 在XE2中打开了.dpr文件,它重新创建了.dproj文件。 它从.res文件恢复了图标,但我失去了项目版本信息。只有文件版本和产品版本信息得到迁移,但失去了所有其他版本信息。(这是由于默认清单文件) 然后我尝试了我解决方案中的第一步。 我在记事本中打开了.dproj文件,在标签下删除了标签条目,然后重新打开了.dproj文件,现在我的所有版本信息都被恢复了。问题在于$(BDS)\bin\default_app.manifest。 另外我注意到版本信息存储在.dproj文件中标签下的标签中,一旦您删除了默认清单条目,IDE就可以从中正确地获取版本键信息。
所以基本上通过删除.dpr文件,我跳过了提取和添加.ico文件到项目的步骤,但必须编辑新创建的.proj文件并删除默认清单条目才能检索版本信息。(另一种解决方法是手动添加版本信息并保存项目。我没有尝试这个)
3个回答

14
2015更新:Remy提出的手工精心重建.DPROJ文件的想法是很好的建议,应该首先考虑,即使我的答案被标记为接受。 在XE2之前的Delphi版本中,资源文件在编译过程中用作输入和输出。例如,您的Delphi 7项目图标嵌入在那个.res文件中,您“希望Delphi XE2使用”,但是在Delphi 7中存在问题,在XE2中现在根本不可能。现在,您将.res文件视为纯输出工件,与可执行文件相同。不再检查.res文件进行版本控制,并且不要尝试假装.res文件是永久存储图标的地方。它是由编译器自动生成的输出文件,一直应该是这样。
如果您是现代开发人员,Delphi 7的旧方式可能会使您感到烦恼(肯定会让我感到烦恼),因为您有一个有趣且无法解决的问题,即对于版本控制应该怎么做:您是否检查.res文件,还是不检查?两种方法都有缺点,而且.res文件现在仅作为输出工件在XE2中是最好的。所以要学会接受这一点。
现在,由于XE2不仅支持PC的图标,还支持Mac的图标,因此必须以不同的方式处理它们,并且已经清理了这一点。这就是您看到的与.ICO文件有关的问题的起源。我也见过完全相同的错误,并且忽略了它,并在转换后仅将图标添加回项目中。
将Delphi 7项目(.dpr和.cfg)转换为Delphi XE2并不像转换各个级别的.dproj文件那样大的问题-每个版本均从Delphi 2005、2007、2009、2010等开始实施dproj格式的更改。当出现这些项目的转换问题时,我不会像Remy建议的那样做,因为这是浪费时间。我所做的是删除DPROJ文件,让它从.dpr文件向上转换。但Remy的建议从零开始有许多优点,包括您可以简化项目布局。

无论如何,以下是您需要做的:

  1. 忽略错误。
  2. 自己添加图标到项目中。
  3. 愉快地继续进行,不要担心.res文件的删除,这是有意为之,并且是有很好原因的。每当需要时都会创建一个新文件。在XE2 .dproj文件中使用磁盘上.ico文件的文件名,并编译到.res文件中,正如它应该做的那样。

6

通常情况下,不应该让IDE将旧版本项目转换为新版本。这种转换很少能够正确地工作。您应该在新IDE中始终创建一个新项目,然后根据需要添加现有的源文件。


4
为什么你这么说呢?我从来没有在转换时遇到任何问题。 Why do you say that? I have never had any problems letting the ide do the conversion. - dummzeuch
3
如果你没有遇到问题,那就算自己幸运。多数用户在项目升级方面存在问题。多年来,在Borland/CodeGear/Embarcadero论坛中,有很多关于项目升级问题的投诉和担忧。在很多情况下,它并不能正常工作。大多数TeamB成员(包括我在内)一遍又一遍地告诉论坛用户同样的建议——和我在这里说的一样。最好不要升级项目,因为你无法知道IDE可能会出现什么错误。最好是创建一个新项目。 - Remy Lebeau
4
我曾多次看到这些问题。我只是不同意删除.dpr和.dpk的做法。我发现只需要删除任何.dproj文件即可。从.dpr加上.cfg或.dof的升级比从一个.dproj级别升级到另一个dproj级别更为顺畅。OP提到的.ico文件错误是这一总体趋势的罕见反例。但这个错误大多是无害的,只是意味着您应该手动插入另一个.ico文件,因为.res到.ico文件的提取失败了。如果您不再拥有纯粹的.ico文件,那么这真的很麻烦。 - Warren P
1
这个建议在2015年比2012年时更好。DPROJ文件格式已经发生了许多变化,升级过程可能会导致一些非常奇怪的问题。我的2012年建议与现在不同:不要升级DPROJ文件,重新创建它们,正如Remy所建议的那样,甚至从你的.DPR重新开始可以得到一个更清晰和易读的项目。 - Warren P
1
@Warren 在 DTokyo 中,有一些奇怪的行为,特别是版本信息等某些设置会暂时从剩余的 .dof 文件中加载到 IDE 中。即使您删除了 .dproj 文件,这也会发生!第一次看到这个我以为自己在幻觉。删除 .dproj,打开 dpr,进入选项/版本信息。旧的版本号将从 .dof 中提取。幸运的是,它们在单击后消失,然后再次单击后重新出现,但谁知道还会意外加载什么其他东西。我可以复制这个问题。我甚至不知道我的项目文件夹中有一个 .dof 文件。 - sse

1

感谢大家的建议。

我提交帖子后,尝试了以下步骤来解决.ico问题和缺失版本信息的问题:

第一步。编辑.dProj文件,删除与标签下的default_app.manifest相关的条目(我的项目平台是32位),我删除所有除了与命名空间System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)相关的标签。

没有这个,我的应用程序始终显示版本信息为1.0.0.0,并忽略我指定的其他所有内容。

(我不确定这是否是正确的步骤,但它解决了我的版本信息问题。可能有一个更简单/另一个解决方案...)

第二步。从旧的.res文件中提取ico,命名并将该.ico文件添加到项目选项中。物理.ico文件在项目文件夹中,并将在源代码控制(在我这种情况下为VSS)中进行检查。

这两个步骤让我得到了所需的结果,然后我可以修改版本号并编译项目。从此以后就没有问题了。

这些比我从D7到XE2的应用程序所做的完全转换/迁移要简单得多 - 包括Unicode转换,将定制的Raize 5组件迁移到Raize 6,Turbo Power,Virtual Tree View,Hypergrid等等。幸运的是,我找到了所有这些组件的XE2版本。


仅删除 .dproj 文件,只保留 .dpr 文件,这样做会更快吗? - Warren P

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