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

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章