Delphi条件汇编在uses子句中

前端之家收集整理的这篇文章主要介绍了Delphi条件汇编在uses子句中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图修改我的Delphi 2010代码在XE7中编译(并希望保留在2010年编译的能力).所以在安装我的主窗体的单元中,我添加了条件指令.以下工作在2010年正常
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

解决方法

正如Ken所说,接口使用子句将被IDE修改,并且实现这个过程的程序稍微复杂一些(如你所发现的那样).同样的问题影响到项目使用条款.不幸的是,在Form / DataModule使用子句的情况下,这是很难避免的.

您可以使用单元别名(请参阅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不会干扰,因此条件编译指令应该不存在任何问题.

猜你在找的Delphi相关文章