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


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


上表中,对于桌面应用使用的字符或字符串演变出来的的各种类型,转到手机应用时,需要替换成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.


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

建议对基于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来替换掉:

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


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

为了检测到对不可变的String做了直接操作,按下面处理:
设置编译指令:{$WARN IMMUTABLE_STRINGS <ON|ERROR>}.
在Project Options中设置,如下图,将False改成True.

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