Как я могу обнаружить определенные функции RTL во время компиляции? - PullRequest
3 голосов
/ 19 января 2012

Для примера давайте проверим печально известную TStrings.StrictDelimiter:

{$IF Declared(TStrings.StrictDelimiter)}
{$MESSAGE WARN 'Beware of TStrings.StrictDelimiter which is False by default!'}
{$IFEND}

Однако синтаксическая ошибка встроенного компилятора Declared сообщает об условной строке: E2029 ')' expected but '.' found.(проверено на XE)

Ответы [ 2 ]

2 голосов
/ 19 января 2012

Для Delphi XE2 я использую это:

{$IFDEF BDS9}
  Result.VersionString := 'Delphi XE2 ' +
  {$IF NOT DECLARED(Consts.SStyleFeatureNotSupported)}
    '(original release version)'
  {$ELSE} {$IF NOT DECLARED(FireMonkeyVersion)} // D2010 chokes when scope (FMX.Types) is mentioned!
    'Update 1'
  {$ELSE} {$IF NOT DECLARED(System.TestSSE)}
    'Update 2'
  {$ELSE}
    'Update 3'
    // TODO : Update this for any following update!
  {$IFEND} {$IFEND} {$IFEND}
  ;
{$ELSE}
  {$IFDEF BDS7}
     Result.VersionString := 'Delphi 2010';
  {$ELSE}
    {$MESSAGE ERROR 'Extend this!'}
  {$ENDIF}
{$ENDIF}

Другими словами: я проверяю наличие символов, которые вводятся начиная с любой конкретной delphi-версии. Эту же конструкцию можно использовать для установки переменной или константы или определения компилятора, поэтому дальнейший код может использовать их вместо этого.

Примечание. Я сохраняю резервную копию папки Source для всех версий Delphi, которые я установил за последние несколько лет. Размещение этих папок с помощью такого инструмента, как BeyondCompare и просмотр разностных файлов, быстро даст вам несколько символов, которые вы можете проверить ....

1 голос
/ 19 января 2012

К сожалению, выражения такого типа не поддерживаются, вы должны знать, в какой версии RTL / компилятора была введена некоторая функция, а затем использовать предопределенные условные символы , например VER<nnn>, RTLVersion, CompilerVersion и т. Д.

...