jim*_*web 4 delphi pascal delphi-xe6
当我尝试编译我的代码时,我得到以下错误.有谁能建议我在这里做错了什么?
W1000 Symbol 'StrPas' is deprecated: 'Moved to the AnsiStrings unit'
Run Code Online (Sandbox Code Playgroud)
我正在尝试编译的代码片段是:
{$IFDEF NEWVER} // Codegear delphi 2009 d12.0
StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
{$ELSE}
StrPCopy(pSerialNumber,
FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
试图破译以前程序员的意图会导致另一种可能性......
由于字符串类型的变化,似乎有一个修复应用于Delphi 2009 .我相信你不想重新发明另一个程序员已经完成的所有修复.
查看代码,Delphi 2009旨在编译以下行(不使用StrPas):
StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
Run Code Online (Sandbox Code Playgroud)
和Delphi的老版本旨在编译以下行(不使用StrPas):
StrPCopy(pSerialNumber,
FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Delphi XE-6不会被归类为"旧版本",因此错误在于您正在编译条件代码的错误分支.
如果NEWVER已定义,条件代码将编译第一个语句.因此,如果您确定NEWVER已定义,则应编译正确的行.您可能需要修改相应的包含文件,或将conditonal设置为项目文件中的选项.(这取决于您的环境设置方式.)
但是,该条件符号的名称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}
Run Code Online (Sandbox Code Playgroud)
有关条件定义的更多信息,请参阅以下链接:
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}
Run Code Online (Sandbox Code Playgroud)