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

我有各种定义语句用于在包含文件中处理不同的Delphi版本。 这个包含文件是“包含”在一个单元中的。 编译器尊重包含文件中给出的定义,但不支持IDE。 这导致在uses语句中增加了某些单元,这些单元可能已经存在 - 被包含在DEFINE编译器指令中。

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

例如一个项目带有一个单位,其上有一个TActionList。

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

  • 样本单位可能看起来像

    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;
      ...
    
  • 保存后,IDE添加System.Actions添加使用列表的结尾,这反过来导致标识符重新声明的编译器错误。 如果删除它,IDE将再次添加下一个保存。

  • 我刚刚向QC#111178汇报。

    有没有解决该错误的方法?

    基督教


    可能最简单的做法是使用单元别名功能来提供帮助。 为了这个工作,你需要不同的编译器版本的不同的项目设置。 例如,对于每个受支持的编译器版本,不同的.dpr和.dproj文件。

    在你的XE2项目中,你定义了一个单元别名,如下所示:

    System.Actions=Vcl.ActnList
    

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

    然后在你的.pas文件中,你可以愉快地使用System.Actions而不会在任何版本的Delphi中出现问题。

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

    链接地址: http://www.djcxy.com/p/11587.html

    上一篇: How to conditionally include some units

    下一篇: JLabel mouse click on icon or text