uses {$IF CompilerVersion >= 24}System.Actions,{$ELSE}Actnlist,{$IFEND} Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs;
但是XE7会自动添加一个System.Actions结尾来创建一个using子句,现在已经声明了System.Actions两次(见下文),并给出了一个错误消息[dcc32 Error] MyForm.pas(10):E2004标识符重新声明: System.Actions’.为什么XE7不接受条件指令内的单位?
uses {$IF CompilerVersion >= 24}System.Actions,Dialogs,System.Actions; // <- automatically added
解决方法
您可以使用单元别名(请参阅David Heffernan的答案),但需要注意的是,如果为IDE希望添加的单元创建别名,则IDE仍将添加对所需单元的引用,因为它不能识别识别所需单位的别名.系统单元的别名将避免这一点,因为它已被每个单元(隐含地)使用.
另一种替代方法是从用户列表中删除所有这些条件,并根据需要创建占位符单元,以便您希望在项目中使用的不同编译器可以由每个IDE坚持的列表组合的单个用户列表来满足是必需的(IDE不会从使用列表中删除未使用的单元,通常是投诉,但在这种情况下实际上有助于解决您的问题).
在这种情况下,在您的Delphi 2010项目中创建一个空的动作单元:
unit Actions; interface implementation end.
您当然需要确保本机不在项目的XE7版本的项目路径中.
实现此目的的一种方法是确保空的Actions.pas单元没有在DPR使用列表中明确列出,而是放置在项目源的子文件夹(例如“占位符”)中.然后,您可以将此子文件夹添加到Delphi 2010版本的项目搜索路径中,但不会将其添加到XE7版本中:
\Project Folder project2010.dpr project2010.dproj projectXE7.dpr projectXE7.dproj \placeholders Actions.pas
如果您发现每个不同版本都需要占位符,那么您将需要单独的占位符文件夹.您可以创建其他版本的子文件夹,例如:
\placeholders \2010 Actions.pas \XE7 D2010UnitNotPresentInXE7.pas
从创建自动/自我记录组织的角度来看,这种结构可能是可取的.
请注意,这仅适用于在Forms(或帧等)的接口部分的uses子句中处理单元引用.在非可视化单元或实现部分中,IDE不会干扰,因此条件编译指令应该不存在任何问题.