我在Delphi 2007中管理了一个庞大的项目.目标是今年升级到Delphi 10.1柏林.因此,同时源代码在两个版本中编译.
如果新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,{$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中编译.
那么解决这个问题的最佳方法是什么?
解决方法
您可以在此处使用Delphi的单元别名功能 – 至少在您的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的使用条款.