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



我有一个单元,我想在任何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产生"deprecated "。

问题是:如何把这一切整理出来?从编译器版本图形变成vcl。图形,和StrLen移动到AnsiStrings?创建下一个代码:

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

在XE2中,当unit Scope Names首次引入时,Graphics单元被重命名为Vcl.Graphics

Delphi和c++ Builder XE2的新特性

重要新要求:VCL-FMX-RTL的单元作用域名称

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

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

uses
  Graphics;

只要确保Vcl包含在XE2+项目的项目选项中的Unit scope names列表中(它应该是默认的)。

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

Delphi Compiler Project Options | Delphi Compiler

为Delphi点命名空间指定单元作用域名称(前缀),以允许您在代码和uses子句或#include中使用部分限定名称。

为Delphi单元添加单元作用域名称有两种方法:
  • 在uses子句中指定完全单位作用域的名称。例如:

    uses Vcl.Graphics;
    
  • unit scope names字段中增加单位作用域名称(Vcl)。然后,单元范围名称Vcl自动应用于属于该单元范围的单元名称,并且您可以简单地指定:

    uses Graphics; 
    

省略号弹出式按钮打开一个对话框,用于选择和添加单元范围名称,如项目选项页面上的Common Items和Ordered列表对话框

所述

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

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

或:

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

对于SysUtils.StrLen()SysUtils.StrCopy()PAnsiChar版本,它们在XE4 (RTLVersion=25.0)中被弃用并移动到System.AnsiStrings单元。例如:

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;

最后,请注意,{$IF}是在Delphi 6中引入的,所以如果你需要支持Delphi 5或更早的版本,你必须在{$IFDEF CONDITIONALEXPRESSIONS}块中包装{$IF}语句。

您也可以使用单元别名来设置…如果你真的需要的话,这是一种时间旅行到过去的未来兼容的方式,但是每个单元设置将会有很多工作,例如:

一个时间旅行到邮局的未来兼容的单位别名示例:VCL。图形=图形

最新更新