我有一个单位,我希望在任何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};
答案 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.Types
和Vcl.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 Pages和Ordered list dialog box
中所述
如果您选择使用{$IF}
语句,则正确的语法为:
uses
{$IF RTLVersion >= 23}Vcl.{$IFEND}Graphics;
或者:
uses
{$IF RTLVersion >= 23}Vcl.Graphics{$ELSE}Graphics{$IFEND};
对于PAnsiChar
和SysUtils.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}
块中。