不推荐使用的命令StrPas

时间:2014-12-03 09:22:47

标签: delphi pascal delphi-xe6

当我尝试编译我的代码时,我得到以下错误。有谁能建议我在这里做错了什么?

W1000 Symbol 'StrPas' is deprecated: 'Moved to the AnsiStrings unit'

我尝试编译的代码片段是:

{$IFDEF NEWVER} // Codegear delphi 2009    d12.0
      StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
{$ELSE}
      StrPCopy(pSerialNumber,
        FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$ENDIF}

2 个答案:

答案 0 :(得分:6)

documentation有答案。它说:

  

此功能仅用于向后兼容。要将以null结尾的字符串转换为AnsiString或本机Delphi语言字符串,请使用类型转换或赋值。

因此,根据缓冲区是8位还是16位,您应该转换为StrPas(...)AnsiString而不是UnicodeString

答案 1 :(得分:5)

试图破译之前程序员的意图导致了另一种可能性......

由于字符串类型的更改,似乎已针对Delphi 2009应用了修复程序。我确定你不想重新发明另一个程序员已经完成的所有修复工作。


查看代码,Delphi 2009旨在编译以下行(不使用StrPas):

  StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);

旧版本的Delphi旨在编译以下行( 使用StrPas):

  StrPCopy(pSerialNumber,
    FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));

在这种情况下,Delphi XE-6不会被归类为"旧版本",因此错误在于您正在编译条件代码的错误分支。


如果定义了NEWVER,条件代码将编译第一个语句。因此,如果确保定义NEWVER,则应编译正确的行。您可能需要修改相应的包含文件,或将conditonal设置为项目文件中的选项。 (这取决于您的环境设置方式。)

然而,条件符号NEWVER的名称有些不合适。显然,2009年不再是新版本" - 实际上甚至XE6现在都是#34;旧版本"。

所以你可能想要重写你的条件如下:

{$IF CompilerVersion >= 20.0} //>= Delphi 2009
    StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
{$ELSE}
    StrPCopy(pSerialNumber,
        FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$IFEND}

有关条件定义的更多信息,请参阅以下链接:

http://docwiki.embarcadero.com/RADStudio/XE7/en/Conditional_compilation_(Delphi) http://docwiki.embarcadero.com/RADStudio/XE7/en/Compiler_Versions

如果您需要支持更多旧版本的Delphi(如果我没有记错,则比Delphi 6更旧版本),您可能需要将上述代码编写为:

{$IFDEF CONDITIONALEXPRESSIONS}
    {$IF CompilerVersion >= 20.0} //>= Delphi 2009
        StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
    {$ELSE} //< Delphi 2009
        StrPCopy(pSerialNumber,
            FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
    {$IFEND}
{$ELSE} //< Delphi 6
    StrPCopy(pSerialNumber,
        FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$ENDIF}