与图形和分析单元相关的Delphi版本特定编译
我有一个单元,我想在任何Delphi版本下编译,比如说Delphi2006 它的下一个代码在编译时出现问题:与图形和分析单元相关的Delphi版本特定编译,delphi,conditional-compilation,versioninfo,Delphi,Conditional Compilation,Versioninfo,我有一个单元,我想在任何Delphi版本下编译,比如说Delphi2006 它的下一个代码在编译时出现问题: 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产生“已弃用。移动到AnsiS
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};
使用
{$if编译器版本<??}图形{$ifelse}vcl.graphics{$ifend};
XE2中的图形
单元在首次引入时被重命名为Vcl.Graphics
重要提示:VCL-FMX-RTL单元现在使用点前缀命名约定,例如System.Types
和VCL.style
。如果现有代码使用限定标识符(如类型.IStream
),则可能需要更改代码才能编译
您不需要使用{$IF}
语句来编写跨版本的VCL代码。您的uses
子句可以继续单独使用图形
单元名称:
uses
Graphics;
只需确保Vcl包含在XE2+项目的项目选项中的单元范围名称列表中(默认情况下应为该列表)
这是有文档记录的(事实上,文档甚至使用了图形
单元作为示例):
指定Delphi虚线名称空间的(前缀),以允许您在代码和uses
子句或include
中使用部分限定名
有两种方法可以为Delphi单元添加单元范围名称:
- 在uses子句中指定完全单位范围的名称。例如:
uses Vcl.Graphics;
- 将单元范围名称(
)添加到单元范围名称字段中。然后,单位范围名称Vcl
将自动应用于属于该单位范围的单位名称,您只需指定:Vcl
uses Graphics;
{$If}
语句,则正确的语法为:
uses
{$IF RTLVersion >= 23}Vcl.{$IFEND}Graphics;
或:
至于PAnsiChar
版本的SysUtils.StrLen()
和SysUtils.StrCopy()
,它们被弃用并移动到XE4中的系统.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;
最后,请注意,
{$IF}
是在Delphi6中引入的,因此如果您需要支持Delphi5或更早版本,您必须将{$IF}
语句包装在{$IFDEF CONDITIONALEXPRESSIONS}
块中。您希望我们回答哪个问题?是与名称空间相关的,还是与不推荐使用的函数相关的?每次只问一个问题。它们可能都是重复的。但我们不能以两个问题的重复来结束。您将有您的工作削减使代码与ANSI和Unicode Delphi一起工作。需要一定程度的技能。你对这个问题有多了解?谢谢。这就是我要找的。使用{$IF RTLVersion>=23}Vcl.Graphics{$ELSE}Graphics{$IFEND};并使用。。。{$IF-RTLVersion>=25},AnsiStrings{$IFEND}这个单元将被其他人使用,我想避免像“为什么我不能编译这个”这样的问题,因为VCL不包含在作用域名称中(默认情况下,在dll单元中它不是)。[/pre]@Mike你知道有这方面的文档
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;