2014-12-03 2 views
4

Когда я пытаюсь скомпилировать свой код, я получаю следующую ошибку. Может ли кто-нибудь предположить, что я делаю неправильно здесь?Устаревшая команда 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} 

ответ

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, вы должны составить правильную строку. Возможно, вам потребуется изменить соответствующий файл 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} 
+2

Это кажется очень правдоподобным, я не заметил этого, +1 –

+1

@jim Я бы действительно пошел дальше, чем здесь сделал Крейг. Спросите себя, почему вы поддерживаете код, который вы никогда не компилируете? Вы не вернетесь в ANSI Delphi, не так ли? Поэтому разделите весь условный код ANSI/Unicode и напишите его следующим образом: 'StrCopy (pSerialNumber, @Buf [pDevDesc.SerialNumberOffset + 1]);' Все. Сделайте это на всей базе кода. –

6

documentation есть ответ. В нем говорится:

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

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

+0

спасибо, что это помогает. Но я попал с подобными ошибками в StrCopy (ds.SerialNumber, pSerialNumber); здесь SerialNumber - это массив. Любая подсказка? – jimsweb

+1

Это другой вопрос. Решение состоит в том, чтобы следовать рекомендациям в предупреждении об устаревании. Включите 'System.AnsiStrings' после' System.SysUtils' в свой раздел uses, чтобы вы использовали 'System.AnsiStrings.StrCopy', а не' System.SysUtils.StrCopy'. Или, еще лучше, быть явным и использовать полное имя. –

+0

спасибо. Это помогло мне исправить ошибку. Ценю вашу помощь. – jimsweb

Смежные вопросы