我在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中不会编译。 那么,解决这个问题的最佳措施是什么?
答案 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}