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 以面值考虑你的问题,但是编写返回字符串的低和高索引的函数是微不足道的。您只需在编译器版本上使用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。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |