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

ldioqlga  于 2023-02-04  发布在  其他
关注(0)|答案(2)|浏览(128)

我有一个单元,我想在任何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};
wz8daaqr

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.TypesVcl.Styles。如果现有代码使用限定标识符(例如Types.IStream),则可能需要更改代码才能进行编译。
您不需要使用{$IF}语句来编写跨版本的VCL代码。您的uses子句可以继续使用Graphics单元名称本身:

uses
  Graphics;

只需确保Vcl包含在XE2+项目的Project Options中的Unit scope names列表中(默认情况下应该是这样)。
这是有文档记录的(事实上,文档甚至使用Graphics单元作为示例):
Delphi Compiler Project Options | Delphi Compiler
为Delphi点命名空间指定unit scope names(前缀),以允许您在代码和uses子句或#include中使用部分限定名称。
有两种方法可以为Delphi单元添加单元作用域名称:

  • 在uses子句中指定完整的单位作用域名称。例如:
uses Vcl.Graphics;
  • 将单元作用域名称(Vcl)添加到单元作用域名称字段。然后单元作用域名称Vcl将自动应用于属于该单元作用域的单元名称,您只需指定:
uses Graphics;

省略号"弹出按钮打开dialog box,用于选择和添加单元范围名称,如Common Items on Project Options PagesOrdered list dialog box中所述
如果选择使用{$IF}语句,正确的语法为:

uses
  {$IF RTLVersion >= 23}Vcl.{$IFEND}Graphics;

或者:

uses
  {$IF RTLVersion >= 23}Vcl.Graphics{$ELSE}Graphics{$IFEND};

至于SysUtils.StrLen()SysUtils.StrCopy()PAnsiChar版本,它们已被弃用并移到XE4中的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;

最后,请注意{$IF}是在Delphi 6中引入的,因此如果需要支持Delphi 5或更早版本,必须将{$IF}语句 Package 在{$IFDEF CONDITIONALEXPRESSIONS}块中。

qzlgjiam

qzlgjiam2#

你也可以使用单位别名来设置...如果你真的需要的话,这是一种时间旅行到过去未来的兼容方式,但是设置每个单位会有很多工作,例如:
单位别名的一个时间旅行到后未来兼容示例:VCL.图形=图形

相关问题