Delphi XE5 将Delphi Code从WinOS 迁移到iOS与Android


本文整理自网络,侵删。

 本文主要参考Delphi Help中Migrating Delphi Code to iOS from Desktop一节的内容。

Delphi XE5 for iOS带来两个编译器:
DCCIOS32.EXE:针对iOS模拟器的
DCCIOSARM.EXE:针对iOS设备的
如果将桌面应用的代码迁移到这两个编译器上,需要按下面的内容重新写代码。

1.不被Delphi Mobile Compilers支持的、淘汰的数据类型

下面的数据类型不再被上面的两个编译器支持,这些数据类型要么被淘汰,要么重写代码,用可替代的数据类型替换掉:

    WideString, AnsiString, ShortString, AnsiChar, PAnsiChar, PWideChar, Openstring


上表中,对于桌面应用使用的字符或字符串演变出来的的各种类型,转到手机应用时,需要替换成String,Char,Byte,UInt8及array of byte,再配合TStringBuilder及StringHelper来使用,如此看来,大部分情况下,在手机应用中,我们只需要使用String及Char加之StringBuilder及StringHelper,这样相对变的更清晰了。实际上,看看String的声明,就知道String就是UnicodeString.
type String = UnicodeString

下面详细说明这些不被支持的类型如何处理:

1.1 WideString
一般的情况,WideString可以用String替换掉,如果你需要在移动编译器上使用WideString类型,则需要封装成4字节的Unicode字符序列,并且用两个null字符作为字符串的结束符。
1.2 AnsiString and ShortString
这里还包括衍生的类型,如UTF8String、RawByteString以及明确长度的ShortString类型,象下面这样声明的:
type TStr=string[127]
删除或者修改AnsiString与ShortString的实例,取决于原始的用法,一般情况下,用"Array of byte"(象System.Types.TByteDnyArray)足矣。
大多数情况下,需要对旧格式进行编译与解码,使用AnsiString大多数地方可以直接用默认的String类型替换。
1.3 AnsiChar
用Char或者Byte替换
1.4 PAnsiChar 与 PWideChar
如果指向的Ansi/Unicode类型的串,用String或TStringBuilder替换,如果原始的语义是调用API,则使用System.MarshaledString来处理
1.5 Openstring
System.Openstring是Delphi旧版本支持的元素,除了System.Generics.Default使用外已经在Delphi XE4中见不到了。使用"Array of byte"替换。

2.使用基于0索引的字符串

对于Delphi 移动编译器,字符串的索引从0开始,将来这可能成为标准,即Delphi所有的编译器对String的处理都从0开始,所谓0索引,指在字符串中第一个字符的索引值为0.


建议对基于1索引的字符串或者操作字符串中的字符的代码都重写。
两种情况:
0索引的字符串:对于用1索引操作字符串内的字符的代码,用0索引来重写
不可变的字符串:如果想改变一个不可改变的字符串内的字符,用TStringBuilder或者使用TStringHelper.
例如:象下面常见的操作不能用于不可变的字符串:
S[1] := 'A';
如果这样写,Delphi mobile compilers 将提出一个警告:W1068:Modifying strings in place may not be supported in the future(delphi).通过Project options,也可将此警告信息改成错误提示。

2.1 建议使用TStringHelper来处理Strings

编译独立于平台的字符串的处理代码,这个类是最好的,由于他进行了内部的自动处理,所以可以同时处理0索引与1索引的字符中,在其内部的实现上都是基于0索引的。对于Delphi RTL中基于1索引的函数,均可用TStringHelper来替换掉:


2.2 编译时检测对不可变的String是否进行了直接操作

为了检测到对不可变的String做了直接操作,按下面处理:
设置编译指令:{$WARN IMMUTABLE_STRINGS <ON|ERROR>}.

在Project Options中设置,如下图,将False改成True.


相关阅读 >>

Delphi'控件的相对坐标与屏幕坐标转换

Delphi xe5 android 捕获几个事件

Delphi 判断字符串是否为纯字母组合

Delphi 文件crc和md5校验

Delphi 如何将bitmap位图与base64字符串相互转换

Delphi 调用dos nbtstat 并获得结果

Delphi 时间转换为gmt格式

Delphi tdictionary 泛型如何排序

Delphi bmp 转换jpg

Delphi 捕捉异常 try except语句 和 try finally语句用法以及区别

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...