Delphi移动开发笔记(一)
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移动开发笔记(一)的更多相关文章
- Delphi For Android 开发笔记 2 NEXTGEN下的字符串类型
delphi开发速度迅捷至少有30%(猜的,呵呵)的原因是因为其字符串(string.WideString.PChar.PAnsiChar等)处理能力. 而从delphi XE4开始,在system等 ...
- Delphi For Android 开发笔记-附:如何Delphi中同时实现Windows、Android版的GetModuleFileName函数
在Windows中开发DLL时,经常会需要获取当前DLL所在目录以便读取同目录下的其他文件,而目前Delphi在开发android时,其实没多大必要获取,因为整个工程只有一个so文件,而这个so文件也 ...
- [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】
原文地址:http://www.cnblogs.com/babycool/p/3199158.html 今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目 ...
- EasyUI 开发笔记(二)
接上篇 :EasyUI 开发笔记(一) (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...
- EasyUI 开发笔记(一)
由于某些原因,在公司做的后台需要改成类似于Ext.js 形式的后台,主要看好其中的 框架布局,以及tab开页面和弹出式内部窗体. 后来看看,改成EasyUI,较Ext.js 库小很多,也便于公司的初级 ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...
- Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例
引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...
- Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境
引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...
- 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新
今天在将一个项目中使用存储过程的遗留代码迁移至新的架构时,遇到了一个问题——如何用EF实现数据库中指定字段的更新(根据UserId更新Users表中的FaceUrl与AvatarUrl字段)? 原先调 ...
随机推荐
- NYOJ 36 最长公共子序列 (还是dp)
这个好多算法书上都有,不仅限于<算法导论> 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 咱们就不拐弯抹角了,如题.须要你做的就是写一个程序,得出最长公 ...
- DownLoadManager[20530:228829] DiskImageCache: Could not resolve the absolute path of the old directory.
uiwebview 模拟器打开PDF文件时崩溃.报下面错误,还不知道为什么 DownLoadManager[20530:228829] DiskImageCache: Could not resolv ...
- Notepad++中删除连续的任意n行
使用Notepad++里的行标记功能,可以删除指定的任意n行. 案例1,删除sample2.dat里的第201行到第10000行.方法如下: (1) 用户NotePad++打开sample2.dat, ...
- AutoHotKey 的使用 —— 使用键盘调节 windows 声音
AutoHotKey 下载地址 AutoHotkey Downloads 首先进行 AutoHotKey 的安装 编写如下 .ahk 文件(F10:打开关闭声音,F11:增加声音,F12:减少声音,当 ...
- WebHost failed to process a request.Memory gates checking failed because the free memory (140656640 bytes) is less than 5% of total memory
WebHost failed to process a request. Sender Information: System.ServiceModel.ServiceHostingEnvironme ...
- 辨异 —— 行星 vs 恒星
star:恒星,planet:行星: 1. 恒星 恒星是指宇宙中靠核聚变产生的能量而自身能发热发光的星体(比如太阳).过去天文学家以为恒星的位置是永恒不变的,以此为名.但事实上,恒星也会按照一定的轨迹 ...
- C# 静态构造函数,静态变量执行顺序(精华版)(规正版)
一.成员初始化整体顺序 1.成员赋值初始化先于构造函数: 2.成员赋值初始先从子类再到基类: 3.构造函数初始化先从基类再到子类: 4.静态成员初始化优先于实例成员初始化: 二.对类型静态成员构造的大 ...
- python判断栈的弹出序列是否合法
参考:https://www.2cto.com/kf/201701/552515.html 数据结构之判断栈的弹出序列是否合法:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为该栈 ...
- 10.24的注意事项——解决linux_jni编译错误的问题
公司以opus开源库.因此,我们遇到了一些问题. 我将新下载的opus1.1替换掉老版本号之后,单独编译opus没问题.但是编译相关的文件就会报错. 错误信息例如以下: g++ -Wall -fPIC ...
- 2 WCF里面配置的含义
1 首先介绍所谓的a,b,c. a就是address 地址: b binding 绑定的协议 譬如http tcp udp 利用这些协议方式请求address: c contract 代表请求的规 ...