为了便于举例,我们来检查臭名昭着的TStrings.StrictDelimiter
:
{$IF Declared(TStrings.StrictDelimiter)}
{$MESSAGE WARN 'Beware of TStrings.StrictDelimiter which is False by default!'}
{$IFEND}
但是,Declared
编译器内部报告条件行上的语法错误:E2029 ')' expected but '.' found
。 (在XE上测试)
答案 0 :(得分:2)
对于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 :(得分:1)
不幸的是,这种表达式不受支持,您必须知道在哪个RTL /编译器版本中引入了某些功能,然后使用VER<nnn>
,RTLVersion
,{{1}},{{ 3}}等等。