• Delphi移动开发笔记(一)


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

    一、字符串操作

            在移动环境下,字符串的索引是从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

  • 相关阅读:
    几个前端时间插件总结
    微信支付——退款篇
    getTime()方法在苹果系统的bug
    【转载】[JS]让表单提交返回后保持在原来提交的位置上
    【转载】 IE/Firefox每次刷新时自动检查网页更新,无需手动清空缓存的设置方法
    webstorm相关设置
    检测无标题的
    数组去重的方法
    Git 版本比较
    Git 回到过去
  • 原文地址:https://www.cnblogs.com/findumars/p/6498918.html
Copyright © 2020-2023  润新知