Delphi XE5以后向后兼容的方法如何处理基于0的字符串?

前端之家收集整理的这篇文章主要介绍了Delphi XE5以后向后兼容的方法如何处理基于0的字符串?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试将我目前的Delphi 7 Win32代码转换为Delphi XE5 Android,只需极少的更改即可,我的项目可以从XE5的Delphi版本和Android系列中交给Win32。

从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。

解决方法

如果要支持使用一个基于字符串的版本,那么不要定义ZEROBASEDSTRINGS。这是有条件的目的。

没有迹象表明我知道有条件的将很快被删除。它在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。

猜你在找的Delphi相关文章