Delphi移动开发笔记(一)

4条评论 2014-07-28 admin

        Delphi从XE4版本就开始支持移动开发了,但是笔者最近才开始学习这块内容。因为笔者原来一直使用的是Delphi7,对于很多新语法没有了解过,所以把其中一些东西记录下来。
        程序开发,调试是少不了的。关于搭建调试环境,网上已经有很多文章,这里就不复述了,大家可以自己搜索搜索。个人推荐,对于安卓平台,使用真机比较好,因为模拟器的速度是非常非常非常非常慢的,对于我这种急性子简直是无法忍受。不过你也可以在虚拟机里面搭建IOS的环境,那个速度就非常快了,比安卓的手机速度还快。一般地说,IOS下能跑,编译成安卓的也不会有问题。
下图是我的三星手机:
xe1
这一个则是IOS模拟机,里面正在运行着一个UDP可靠传输的程序,跟外面实体机进行数据传输:
xe2

一、字符串操作

        在移动环境下,字符串的索引是从0而不是1开始。注意:这个实际上只涉及到引用和赋值,对于Pos、Delete、Copy、Trim来说,索引还是从1开始的。例如:

var
 str:string;
begin
 str:='Hello!';
 ShowMessage(str[1]);//Win程序为“H”,Mobile下为"e"
 str[2]:='W';//同上
end;

        如果你的代码需要同时支持老版本的编译器,例如Delphi7,那么需要自己加编译开工。

var
 str:string;
begin
 str:='Hello!';
 {$IFDEF MSWINDOWS}
 str[3]:='W';
{$ELSE}
 str[2]:='W';
{$ENDIF}
end;

        如果你的程序不需要支持老版本的编译器,那么可以使用TStringHelper来处理Strings。例如:

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:
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:
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’.”错误。

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;

分类:基础知识

4条评论 发表评论

  • helloyhb说道:

    不错,很受益,支持一下!期待楼主更新!

  • 金满斗说道:

    支持老陈的精神,学无止境啊

  • 金满斗说道:

    你好。支持老陈。学无止境

  • sb说道:

    关于第一点字符串的问题。当时玩移动编程的时候,确实困扰了我一会。在windows下测试正常,但是在安卓下就各种问题。
    delphi做ios或者安卓的移动端最大的问题,我感觉都还不是这个。是他们太臃肿了吧。感觉就像是delphi本身做了一个虚拟机,我们所有的代码都在虚拟机下面跑的感觉。一个小程序。感觉都很累。

发表评论

(必填)

(必填), (Hidden)

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

TrackBack URL  |  这篇文章上的评论的RSS feed


近期文章

近期评论

文章归档

分类目录