使用子句中的 Delphi 条件编译

2023-11-23

我正在尝试修改我的 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最后创建一个使用子句,该子句现在已声明两次 System.Actions(见下文),并给出错误消息[dcc32 Error] MyForm.pas(10): E2004 Identifier redeclared: 'System.Actions'。为什么 XE7 不接受条件指令中的单元?

uses 
  {$IF CompilerVersion >= 24}System.Actions, {$ELSE}Actnlist,{$IFEND}
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  Dialogs,
  System.Actions; // <- automatically added

正如 Ken 所说,接口使用子句将由 IDE 修改,并且实现此目的的过程有些不太复杂(正如您所发现的)。同样的问题影响项目使用条款。不幸的是,在 Form/DataModule 使用子句的情况下,这种情况很难避免。

你可以使用单位别名(请参阅 David Heffernan 的回答)但需要注意,如果您为 IDE 希望添加的单元创建别名,那么 IDE 仍会添加对所需单元的引用,因为它不会将别名识别为标识所需的单元单元。别名为System单元将避免这种情况,因为它已经被每个单元(隐式)使用。

另一种选择是从使用列表中删除所有此类条件,并根据需要创建占位符单元,以便您希望在项目中使用的不同编译器都可以通过从每个 IDE 坚持的列表组合而成的单一使用列表来满足是必需的(IDE 不会从使用列表中删除未使用的单元,这通常是一个抱怨,但在这种情况下实际上有助于解决您的问题)。

在本例中,在您的 Delphi 2010 项目中创建一个空的Actions unit:

 unit Actions;
 interface
 implementation
 end.

您当然需要确保该装置是not在您的 XE7 版本项目的项目路径中。

实现这一目标的一种方法是确保空动作.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

仅从创建自动/自记录组织的角度来看,这种结构可能是明智的。

请注意,这仅在处理单元引用时才需要。uses的条款界面的部分Forms (or FramesETC)。在非视觉单位或执行部分,IDE 不会干扰,因此条件编译指令应该不会出现任何问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用子句中的 Delphi 条件编译 的相关文章

随机推荐