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

Delphi移动开发笔记(一)的更多相关文章

  1. Delphi For Android 开发笔记 2 NEXTGEN下的字符串类型

    delphi开发速度迅捷至少有30%(猜的,呵呵)的原因是因为其字符串(string.WideString.PChar.PAnsiChar等)处理能力. 而从delphi XE4开始,在system等 ...

  2. Delphi For Android 开发笔记-附:如何Delphi中同时实现Windows、Android版的GetModuleFileName函数

    在Windows中开发DLL时,经常会需要获取当前DLL所在目录以便读取同目录下的其他文件,而目前Delphi在开发android时,其实没多大必要获取,因为整个工程只有一个so文件,而这个so文件也 ...

  3. [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】

    原文地址:http://www.cnblogs.com/babycool/p/3199158.html 今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目 ...

  4. EasyUI 开发笔记(二)

    接上篇 :EasyUI 开发笔记(一)  (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...

  5. EasyUI 开发笔记(一)

    由于某些原因,在公司做的后台需要改成类似于Ext.js 形式的后台,主要看好其中的 框架布局,以及tab开页面和弹出式内部窗体. 后来看看,改成EasyUI,较Ext.js 库小很多,也便于公司的初级 ...

  6. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  7. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  8. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

  9. 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新

    今天在将一个项目中使用存储过程的遗留代码迁移至新的架构时,遇到了一个问题——如何用EF实现数据库中指定字段的更新(根据UserId更新Users表中的FaceUrl与AvatarUrl字段)? 原先调 ...

随机推荐

  1. JVM源码分析之System.currentTimeMillis及nanoTime原理详解

    JDK7和JDK8下的System.nanoTime()输出完全不一样,而且差距还非常大,是不是两个版本里的实现不一样,之前我也没注意过这个细节,觉得非常奇怪,于是自己也在本地mac机器上马上测试了一 ...

  2. tensorflow 函数接口的理解

    1. tf.nn.softmax tf.nn.softmax(logits, dim=-1, name=None) w*x+b ⇒ logits softmax 函数执行的操作:exp(logits) ...

  3. CentOS7查看开放端口命令

    CentOS7查看开放端口命令   CentOS7的开放关闭查看端口都是用防火墙来控制的,具体命令如下: 查看已经开放的端口: /tcp --permanent 命令含义: –zone #作用域 –a ...

  4. Windows 7 X64位平台下,VC6调试运行程序,中断调试无法退出

    用VC6在64位Windows7下调试的时候,如果中断(Shift+F5)调试,程序无法退出. 问题描述: 当点击F5开始一个项目的调试时,程序在设置的断点处停止,这时按下Shift+F5后,vc6可 ...

  5. Smali相关的基础知识点

    通过本篇博客的学习,相信你可以无压力的读懂Smali语言文件,并可以将Smali还原成java!!! 其实Smali语言并不是很难,如果你有一些汇编指令的基础,学习Smali就更加简单了,有兴趣的可以 ...

  6. Qt::WindowFlags枚举类型(Qt::Widget是独立窗口和子窗口两用的,Qt::Window会有标题栏)

    Qt::Widget : QWidget构造函数的默认值,如新的窗口部件没有父窗口部件,则它是一个独立的窗口,否则就是一个子窗口部件. Qt::Window : 无论是否有父窗口部件,新窗口部件都是一 ...

  7. Swift类和结构

    类和结构有非常多的共同点: 定义属性存储数据 定义方法执行功能处理 定义下标,通过下标訪问他们的值 初始化他们的状态 通过扩展(Extension)扩展其功能 遵守协议(Protocol).协议提供一 ...

  8. Linux性能测试 strace命令

    1  功能说明 strace 命令是一种强大的工具 ,  能够显示任何由用户空间程式发出的系统调用 .  strace 显示这些调用的参数并返回符号形式的值 .  strace 从内核接收信息 ,  ...

  9. BSD介绍

    BSD许可证模板  * Copyright (c) 1998, Regents of the University of California  * All rights reserved.    * ...

  10. matlab 深度学习

    0. 超参的定义 超参的定义直接使用结构体: opts.alpha = 1; opts.batchsize = 50; opts.numepoch = 5; 1. Autoencoder Train ...