如何避免在Delphi中使用插入名称空间

时间:2018-10-23 06:05:26

标签: delphi

我在Delphi 2007中管理着一个庞大的项目。目标是今年将其升级到Delphi 10.1 Berlin。因此,与此同时,源代码会同时在两个版本中进行编译。

如果新的Delphi有问题,我们希望将旧版本作为备份。

我在dmActions.pas单元中遇到的问题是从TDataModule继承的一个单元。

uses
  // VCL
  ActnList,
  ActnMan,
  Classes,
  Controls,
  Forms,
  Graphics,
  ImgList,
  Menus,
  SysUtils,
  XPStyleActnCtrls,
  Variants,
{$IFDEF BOLD_DELPHI16_OR_LATER}
  System.ImageList,
  System.Actions,
{$ENDIF}

  BusinessClasses;

Delphi IDE不了解我的IFDEF,因此它会自动向其中插入缺少的单元

uses
  // VCL
  ActnList,
  ActnMan,
  Classes,
  Controls,
  Forms,
  Graphics,
  ImgList,
  Menus,
  SysUtils,
  XPStyleActnCtrls,
  Variants,
{$IFDEF BOLD_DELPHI16_OR_LATER}
  System.ImageList,
  System.Actions,
{$ENDIF}

  BusinessClasses, System.ImageList, System.Actions;

但这不会在此消息中在柏林编译

[dcc32 Error] dmActions.pas(36): E2004 Identifier redeclared: 'System.ImageList'
[dcc32 Error] dmActions.pas(36): E2004 Identifier redeclared: 'System.Actions'

当然,“ System.ImageList,System.Actions”在D2007中不会编译。 那么,解决这个问题的最佳措施是什么?

2 个答案:

答案 0 :(得分:10)

您可以在此处使用Delphi的 Unit Aliases 功能-至少因为Delphi 2007首先支持点缀的单元名称。这样就可以使用来自Delphi 10.1 Berlin的新单元名称,例如System.SysUtils,并且仍可以使用Delphi 2007编译该项目。

为此,您必须像这样将映射添加到Delphi 2007项目的单元别名中:

System.SysUtils=SysUtils
System.Classes=Classes

对于Delphi 2007中不存在的单元(如您在帖子中提到的单元),只需映射到现有单元:

System.Actions=ActnList
System.ImageList=ImgList

作为好处,您最终使用了不含IFDEF的uses子句。

答案 1 :(得分:2)

正如https://stackoverflow.com/users/2916756/nolaspeaker所说,它可以直接在测试编译器版本中使用。我使用了一个inc文件,在这种情况下无法正常工作

但是在我的情况下,我这样检查柏林:

{$IFDEF VER310}
  System.ImageList,
  System.Actions,
{$ENDIF}