Устаревшая команда StrPas

Когда я пытаюсь скомпилировать свой код, я получаю следующую ошибку. Может ли кто-нибудь предположить, что я делаю неправильно здесь?

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 ответа

Попытка расшифровать предыдущее намерение программиста приводит к другой возможности....

Кажется, было исправлено приложение Delphi 2009 из-за изменений типа string. Я уверен, что вы не хотите изобретать все исправления, которые уже сделал другой программист.

Глядя на код, Delphi 2009 предназначен для компиляции следующей строки (которая не использует StrPas):

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

И более старые версии Delphi предназначены для компиляции следующей строки (которая использует StrPas):

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

Delphi XE-6 в этом случае не будет классифицироваться как "более старая версия", поэтому ошибка заключается в том, что вы компилируете неправильную ветвь условного кода.

Условный код скомпилирует первый оператор, если определено NEWVER. Поэтому, если вы гарантируете, что NEWVER определен, вы должны составить правильную строку. Возможно, вам потребуется изменить соответствующий файл include или установить условие в качестве опции в файле проекта. (Это зависит от того, как настроена ваша среда.)

Однако имя этого условного символа 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}


В документации есть ответ. В нем говорится:

Эта функция предоставляется только для обратной совместимости. Чтобы преобразовать строку с нулевым символом в строку AnsiString или родную Delphi, используйте приведение типов или назначение.

Итак, вместо StrPas(...) вы должны указать либо AnsiString, либо UnicodeString в зависимости от того, является ли буфер 8-разрядным или 16-разрядным.

licensed under cc by-sa 3.0 with attribution.