从XE5开始,针对未来的语言发生了突破性的变化。其中一个更改是基于零的字符串。
在具有1个字符串的旧版本中,以下代码是正确的:
function StripColor(aText: string): string; begin for I := 1 to Length(aText) do
但现在这显然是不正确的。建议的解决方案是使用:
for I := Low(aText) to High(aText) do
这样XE5 Win32处理基于1的字符串,XE5 Android处理基于0的字符串。但是有一个问题 – 以前的Delphi版本(例如XE2)在这样的代码上输出错误:
E2198 Low cannot be applied to a long string E2198 High cannot be applied to a long string
我有很多字符串操作代码。我的问题是 – 如何修改和保持上述代码可编译在Delphi 7 Win32和Delphi XE5 Android中?
附:我知道我仍然可以禁用XE5中的ZEROBASEDSTRINGS定义,但这是不需要的解决方案,因为在XE6中,这个定义可能会消失,所有字符串都将被强制为0。
没有迹象表明我知道有条件的将很快被删除。它在XE3中引入,并在后续版本中幸存下来。如果Embarcadero删除它,那么他们的Win32客户都不会升级,他们会破产。 Embarcadero具有维护兼容性的记录。您仍然可以使用TP对象和短字符串。只要桌面编译器可以使用这个条件即可。
事实上,所有的证据表明移动编译器保留对一个基于字符串的索引的支持。所有的utility string functions like Pos
use one based indices,and will continue to do so.如果Embarcadero真的要删除对一个基于字符串索引的支持,他们也将删除Pos。我不相信这很可能会很快。
以面值考虑你的问题,但是编写返回字符串的低和高索引的函数是微不足道的。您只需在编译器版本上使用IFDEF。
function StrLow(const S: string): Integer; inline; begin Result := {$IFDEF XE3UP}low(S){$ELSE}1{$ENDIF} end; function StrHigh(const S: string): Integer; inline; begin Result := {$IFDEF XE3UP}high(S){$ELSE}Length(S){$ENDIF} end;
更新
正如雷米指出的那样,上面的代码是不错的。这是因为ZEROBASEDSTRINGS是本地的,它的状态在这样的功能将被使用的地方是什么。事实上,这是不可能以有意义的方式实现这些功能。
所以,我相信,对于需要使用旧版编译器以及移动编译器进行编译的代码,除了要禁用之外,别无选择。 ZEROBASEDSTRINGS。