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