弃用的命令StrPas

4

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

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个回答

7

文档中有答案。它说:

此函数仅为向后兼容而提供。要将以空字符结尾的字符串转换为AnsiString或本地Delphi语言字符串,请使用类型转换或分配。

因此,您应该将StrPas(...) 转换为AnsiStringUnicodeString,具体取决于缓冲区是8位还是16位。


谢谢,这很有帮助。但是我在 StrCopy(ds.SerialNumber, pSerialNumber) 中遇到了类似的错误,其中 SerialNumber 是一个数组。有什么线索吗? - jimsweb
1
这是一个不同的问题。解决方案是遵循弃用警告中的建议。在你的uses子句中在System.SysUtils之后包含System.AnsiStrings,这样你就可以使用System.AnsiStrings.StrCopy而不是System.SysUtils.StrCopy。或者更好的方法是明确地使用完全限定名称。 - David Heffernan
谢谢。这帮助我纠正了错误。感谢你的帮助。 - jimsweb

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,则应该编译正确的行。您可能需要修改适当的包含文件,或在项目文件中设置条件选项(具体取决于您的环境设置)。

然而,该条件符号NEWVER的名称有点不恰当。显然,2009年已经不再是“新版本”——事实上,甚至XE6现在也是“旧版本”。

因此,您可能需要将条件重写如下:

{$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}

2
这看起来非常有道理,我没有注意到,+1。 - David Heffernan
1
@jim,我比Craig在这里更进一步。问问自己为什么要维护你从未编译过的代码?难道你会回到ANSI Delphi吗?因此,请删除所有的ANSI/Unicode条件代码,并像这样编写它:StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);就这样。在整个代码库中都这样做。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接