如何有条件地包括一些单位

时间:2012-12-08 09:24:16

标签: delphi delphi-xe3

我有一些用于处理包含文件中的不同Delphi版本的各种define语句。这个包含文件被“包含”在一个单元中。编译器遵循包含文件中给出的定义,但不包括IDE。这导致在uses子句中添加了某些单元,这些单元可以在那里 - 包含在DEFINE编译器指令中。

因此,如果添加了一个在Delphi XE3之前不可用的单元,那么您将遇到一个大问题,因为如果您让IDE添加单元并且无法使用之前没有的Delphi XE3版本进行编译那个单位。

E.g。一个单元,上面有一个TActionList的项目。

  1. MYINCLUDE.INC只有一个定义{$DEFINE DELPHIXE3}

  2. 样本单元可能看起来像

    unit Unit1;
    
    {$I MYINCLUDE.INC}                
    
    uses
       Winapi.Windows, 
       Winapi.Messages, 
       System.SysUtils, 
       System.Variants, 
       System.Classes, 
       Vcl.Graphics,
       Vcl.Controls, 
       Vcl.Forms, 
       Vcl.Dialogs,
       {$IFDEF DELPHIXE3} System.Actions, {$ENDIF}
       Vcl.ActnList;
      ...
    
  3. 保存后,IDE会添加System.Actions添加使用列表的结尾,从而导致标识符重新声明编译器错误。如果删除它,IDE将在下次保存时再次添加它。

  4. 我刚刚向QC #111178报告过。

    该错误是否有解决方法?

    基督教

1 个答案:

答案 0 :(得分:3)

可能最简单的方法是使用单位别名功能来提供帮助。为了使其工作,您需要针对不同编译器版本的不同项目设置。例如,每个支持的编译器版本都有不同的.dpr和.dproj文件。

在您的XE2项目中,您可以定义单位别名,如下所示:

System.Actions=Vcl.ActnList

在XE3项目中,您省略了该别名。

然后在.pas文件中,您可以愉快地使用System.Actions,在任何版本的Delphi中都没有问题。

更简单的解决方案是创建一个名为System.Actions的空单元,您只在项目中包含XE2构建。