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

Chr*_*ian 7 delphi delphi-xe3

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

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

例如,一个单元上有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;
      ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 保存后,IDE添加System.Actions添加使用列表的结尾,这反过来导致标识符重新声明的编译器错误.如果删除它,IDE将在下次保存时再次添加它.

我刚刚向QC报告了#111178.

该错误是否有解决方法?

基督教

Dav*_*nan 4

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

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

System.Actions=Vcl.ActnList
Run Code Online (Sandbox Code Playgroud)

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

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

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