我有一个单元,我想在任何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.Types
和Vcl.Styles
。如果您有使用限定标识符(如Types.IStream
)的现有代码,则可能需要对代码进行更改才能进行编译。
不需要使用{$IF}
语句来编写跨版本的VCL代码。您的uses
子句可以继续单独使用Graphics
单元名称:
uses
Graphics;
只要确保Vcl包含在XE2+项目的项目选项中的Unit scope names列表中(它应该是默认的)。
这是有文档记录的(事实上,文档甚至使用Graphics
单元作为示例):
Delphi Compiler Project Options | Delphi Compiler
为Delphi点命名空间指定单元作用域名称(前缀),以允许您在代码和
为Delphi单元添加单元作用域名称有两种方法:uses
子句或#include
中使用部分限定名称。
在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。图形=图形