与图形和AnsiStrings单元相关的Delphi版本特定编译

时间:2015-09-02 21:08:04

标签: delphi conditional-compilation versioninfo

我有一个单位,我希望在任何Delphi版本下编译,比如说Delphi 2006。

它有下一个编译问题的代码:

uses
  graphics; // for previous versions can not be compiled on Delphi XE

uses
  vcl.graphics; // compiled on Delphi XE but can not compile on previous version

函数StrLen,StrCopy生成“已弃用。转移到AnsiString”警告。

问题是:如何对它进行排序?从哪个编译器版本图形成为vcl.graphics,并且StrLen转移到AnsiStrings?要创建下一个代码:

uses
  {$if CompilerVersion < ??}graphics{$ifelse}vcl.graphics{$ifend};

1 个答案:

答案 0 :(得分:2)

首次引入Unit Scope Names时,Graphics单位已在XE2中重命名为Vcl.Graphics

What's New in Delphi and C++Builder XE2

  

Important New Requirement: Unit Scope Names for VCL-FMX-RTL

     

重要提示:VCL-FMX-RTL设备现在使用虚线前缀命名约定,例如System.TypesVcl.Styles。如果您的现有代码使用限定标识符(例如Types.IStream),则可能需要更改代码才能进行编译。

您无需使用{$IF}语句来编写跨版本VCL代码。您的uses子句可以继续使用Graphics单位名称:

uses
  Graphics;

只需确保 Vcl 包含在XE2 +项目的项目选项中的单位范围名称列表中(默认情况下应该是这样)。

这是记录的(事实上,文档甚至使用Graphics单位作为示例):

Delphi Compiler Project Options | Delphi Compiler

  

指定Delphi虚线命名空间的unit scope names(前缀),以允许您在代码和uses子句或#include中使用部分限定名称。

     

有两种方法可以为Delphi单元添加单位范围名称:

     
      
  • 在uses子句中指定完全单元范围的名称。例如:

    uses Vcl.Graphics;
    
  •   
  • 将单位范围名称(Vcl)添加到单位范围名称字段。然后,单位范围名称Vcl将自动应用于属于该单位范围的单位名称,您只需指定:

    uses Graphics; 
    
  •   
     

Ellipsis弹出按钮打开 dialog box,用于选择和添加单位范围名称,如Common Items on Project Options PagesOrdered list dialog box

中所述

如果您选择使用{$IF}语句,则正确的语法为:

uses
  {$IF RTLVersion >= 23}Vcl.{$IFEND}Graphics;

或者:

uses
  {$IF RTLVersion >= 23}Vcl.Graphics{$ELSE}Graphics{$IFEND};

对于PAnsiCharSysUtils.StrLen()的{​​{1}}版本,不推荐使用这些版本,并将其移至XE4中的SysUtils.StrCopy()单元(System.AnsiStrings)。例如:

RTLVersion=25.0

最后,请注意,uses ... {$IF RTLVersion >= 25}, AnsiStrings{$IFEND} ; var Src, Dest: PAnsiChar; Len: Integer; begin Src := ...; Len := {$IF RTLVersion >= 25}AnsiStrings.{$IFEND}StrLen(Src); GetMem(Dest, Len * SizeOf(AnsiChar)); {$IF RTLVersion >= 25}AnsiStrings.{$IFEND}StrCopy(Dest, Src); ... end; 是在Delphi 6中引入的,因此如果您需要支持Delphi 5或更早版本,则必须将{$IF}语句包装在{$IF}块中。