我有一个单元,我想在任何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"警告。
问题是:如何将其分类?图形从哪个编译器版本变为www.example.com,StrLen移到AnsiStrings?创建下一个代码:vcl.graphics, and StrLen moved to AnsiStrings? To create next code:
uses
{$if CompilerVersion < ??}graphics{$ifelse}vcl.graphics{$ifend};
2条答案
按热度按时间wz8daaqr1#
Graphics
单元在XE2中被重命名为Vcl.Graphics
,当时Unit Scope Names是第一次引入。What's New in Delphi and C++Builder XE2
Important New Requirement: Unit Scope Names for VCL-FMX-RTL
重要提示:VCL-FMX-RTL单元现在使用点前缀命名约定,例如
System.Types
和Vcl.Styles
。如果现有代码使用限定标识符(例如Types.IStream
),则可能需要更改代码才能进行编译。您不需要使用
{$IF}
语句来编写跨版本的VCL代码。您的uses
子句可以继续使用Graphics
单元名称本身:只需确保Vcl包含在XE2+项目的Project Options中的Unit scope names列表中(默认情况下应该是这样)。
这是有文档记录的(事实上,文档甚至使用
Graphics
单元作为示例):Delphi Compiler Project Options | Delphi Compiler
为Delphi点命名空间指定unit scope names(前缀),以允许您在代码和
uses
子句或#include
中使用部分限定名称。有两种方法可以为Delphi单元添加单元作用域名称:
Vcl
)添加到单元作用域名称字段。然后单元作用域名称Vcl
将自动应用于属于该单元作用域的单元名称,您只需指定:省略号"弹出按钮打开dialog box,用于选择和添加单元范围名称,如Common Items on Project Options Pages和Ordered list dialog box中所述
如果选择使用
{$IF}
语句,正确的语法为:或者:
至于
SysUtils.StrLen()
和SysUtils.StrCopy()
的PAnsiChar
版本,它们已被弃用并移到XE4中的System.AnsiStrings
单元(RTLVersion=25.0
)。最后,请注意
{$IF}
是在Delphi 6中引入的,因此如果需要支持Delphi 5或更早版本,必须将{$IF}
语句 Package 在{$IFDEF CONDITIONALEXPRESSIONS}
块中。qzlgjiam2#
你也可以使用单位别名来设置...如果你真的需要的话,这是一种时间旅行到过去未来的兼容方式,但是设置每个单位会有很多工作,例如:
单位别名的一个时间旅行到后未来兼容示例:VCL.图形=图形