与图形和分析单元相关的Delphi版本特定编译

与图形和分析单元相关的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

我有一个单元,我想在任何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产生“已弃用。移动到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;