本文主要参考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.