Delphi從XE4版本就開始支持移動開發了,但是筆者最近才開始學習這塊內容。因為筆者原來一直使用的是Delphi7,對於很多新語法沒有了解過,所以把其中一些東西記錄下來。
程序開發,調試是少不了的。關於搭建調試環境,網上已經有很多文章,這里就不復述了,大家可以自己搜索搜索。個人推薦,對於安卓平台,使用真機比較好,因為模擬器的速度是非常非常非常非常慢的,對於我這種急性子簡直是無法忍受。不過你也可以在虛擬機里面搭建IOS的環境,那個速度就非常快了,比安卓的手機速度還快。一般地說,IOS下能跑,編譯成安卓的也不會有問題。
下圖是我的三星手機:
這一個則是IOS模擬機,里面正在運行着一個UDP可靠傳輸的程序,跟外面實體機進行數據傳輸:
一、字符串操作
在移動環境下,字符串的索引是從0而不是1開始。注意:這個實際上只涉及到引用和賦值,對於Pos、Delete、Copy、Trim來說,索引還是從1開始的。例如:
|
1
2
3
4
5
6
7
|
var
str:
string
;
begin
str:=
'Hello!'
;
ShowMessage(str[
1
]);
//Win程序為“H”,Mobile下為"e"
str[
2
]:=
'W'
;
//同上
end
;
|
如果你的代碼需要同時支持老版本的編譯器,例如Delphi7,那么需要自己加編譯開工。
|
1
2
3
4
5
6
7
8
9
10
|
var
str:
string
;
begin
str:=
'Hello!'
;
{$IFDEF MSWINDOWS}
str[
3
]:=
'W'
;
{
$ELSE
}
str[
2
]:=
'W'
;
{
$ENDIF
}
end
;
|
如果你的程序不需要支持老版本的編譯器,那么可以使用TStringHelper來處理Strings。例如:
|
1
2
3
4
5
6
7
8
9
10
|
var
str:
string
;
nIndex:
Integer
;
begin
str:=
'Hello!'
;
n:=str
.
IndexOf(
'e'
);
//類似Pos函數,但不管Win環境還是Mobile,索引都是從0開始,都是返回1,下同。
//str.Remove===>類似Delete
//str.Substring===>類似Copy
//str.Trim===>類似RTL的Trim
end
;
|
二、生存期自管理
例如,很多人喜歡使用這種代碼:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
例
1
:
var
g_List:TList;
..............
procedure
DoSoneThing;
var
MyObj:TMyObject;
begin
MyObj:=TObject
.
Create;
g_List
.
Add(MyObj);
end
;
例
2
:
function
GetAObject:TMyObject;
begin
Result:=TMyObject
.
Create;
end
;
|
這個代碼在Win平台下工作的很好,但在Mobile平台下會出錯,原因在於Mobile下對象是自管理的,類似以前的COM對象,編譯器會自動加上“__ObjAddRef;”和”__ObjRelease”,例如局部變量,離開函數后會被__ObjRelease給釋放掉。
解決方案:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
例
1
:
var
g_List:TList<TMyObject>;
//改成泛型的TList,記得uses Generics.Collections單元
例
2
:
function
GetAObject:TMyObject;
begin
Result:=TMyObject
.
Create;
{$IFDEF AUTOREFCOUNT}
Result
.
__ObjAddRef;
//多加一次計數,真正釋放的時候記得減少
{$ENDIF AUTOREFCOUNT}
end
;
|
三、自釋放不要使用Destroy,否則會出現“Project Project_Mobile raised exception class ESafecallException with message ‘Exception in safecall method’.”錯誤。
|
1
2
3
4
5
6
7
8
9
10
11
12
|
function
TUDPBuff
.
Release:
integer
;
begin
Result:=
{$IFDEF DELPHI7}InterlockedDecrement{$ELSE}TInterlocked.Decrement{$ENDIF}
(m_nRef);
if
Result=
0
then
begin
{$IFDEF MSWINDOWS}
Destroy;
{
$ELSE
}
DisposeOf;
//或Free;
{
$ENDIF
}
end
;
end
;
|
分類:基礎知識
http://www.138soft.com/?p=387
