delphi开发速度迅捷至少有30%(猜的,呵呵)的原因是因为其字符串(string、WideString、PChar、PAnsiChar等)处理能力。

而从delphi XE4开始,在system等单元中,出现了一个叫 NEXTGEN 的编译条件,这条件是在进行移动开发时自动定义的,而传统桌面开发时没有定义NEXTGEN。

这个编译条件直接导致原来的PAnsiChar、AnsiString无法使用(传统桌面开发没有影响),只要稍微接触深入,即可发现,其实并不是无法使用,字符串类型新增了如下定义:

   {$IFDEF NEXTGEN}
_ShortStr = _ShortString;
_AnsiStr = _AnsiString;
_AnsiChr = _AnsiChar;
_WideStr = _WideString;
_PAnsiChr = _PAnsiChar;
{$ELSE}
_ShortStr = ShortString;
_AnsiStr = AnsiString;
_AnsiChr = AnsiChar;
_WideStr = WideString;
_PAnsiChr = PAnsiChar;
{$ENDIF}
MarshaledString = PWideChar;
MarshaledAString = _PAnsiChr;

其中带下划线开头的“_XXXX”的定义属于内部定义,无法直接使用,而我们也可以看出原来的PAnsiChar定义为_PAnsiChr,而_PAnsiChr则统一定义为MarshaledAString,也就是说,原来使用PAnsiChar的函数,其实可以使用MarshaledAString代替,不过这样是一种折中的做法,毕竟谁也不知道以后的变化,能用PChar和string就尽量用吧。

实际使用中也确实没有什么影响,但是在多平台开发中,为何delphi将原来的PAnsiChar去掉,使用MarshaledAString呢,其实在java、.NET中,已经很早就有这类托管的数据类型了,只是作为传统的delphi桌面开发人员,并不熟悉也不太想去熟悉,而使用托管的字符串数据类型一方面是实现内存的自动回收管理,另一方面也是方便各种字符串编码的转换。

个人认为,在Windows系列PAnsiChar就是Ansi编码,而在unix系列的PAnsiChar应该都是Utf8编码,作为跨平台开发语言,需要尽量屏蔽这种差异。

相信delphi XE系列的目标是将所有平台的字符串类型转换为string(即UnicodeString),只要使用VLC的函数,即可不关心当前平台的字符串类型,这种做法也将慢慢的屏蔽掉AnsiString,WideString等写法,而全部统一PChar和string(内部其实是PWideChar和UnicodeString)。

想法和做法都是对的,只是很多时候对开发人员来说是无奈的,毕竟很多操作系统的特殊功能是无法通过封装去实现无缝移植的。

关于字符串的变化,甚至导致classes中的BinToHex和HexToBin函数出现相当麻烦的变化,有兴趣的朋友可以去看看。

字符串相关的处理也出现了很多新的类型:

1) TMarshaller :作为新字符串类型的转换类(其实是record,但是现在Record和Class其实功能上差别已经很小),可将string转换为ANSI、UTF8等

2) TStringBuilder:各种字符串处理功能,添加、比较、插入、转换等

字符串下标

默认情况下,在FMX中,Windows平台的string下标从1开始,移动平台下的string下标从0开始,而stringhelper中统一从0开始,

此前循环体中的for I:=1 to Length(sStr) do 的写法无法兼容所有平台,可以使用Low和High的写法,即 for I:=Low(sStr) to High(sStr) do

另外,可以使用编译条件来打开或关闭0下标的编译功能:

     {$ZEROBASEDSTRINGS ON}  //开启 0下标(在Windows平台使用后从0开始)
{$ZEROBASEDSTRINGS OFF} //关闭 0下标(从1开始,在移动平台上使用后从1开始)

Delphi For Android 开发笔记 2 NEXTGEN下的字符串类型的更多相关文章

  1. Delphi For Android 开发笔记 1 - 开发工具介绍

    在开始前,推荐喜欢delphi或者pascal的朋友,如果想将原来Windows的软件工程移植到Android,可使用CodeTyphon+Delphi XE7进行开发. 1.CodeTyphon C ...

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

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

  3. DELPHI XE Android 开发笔记

    第一次编译时,设定android SDK: F:\RAD Studio XE6\PlatformSDKs\adt-bundle-windows-x86-20131030\sdk F:\RAD Stud ...

  4. 【转】Android开发笔记(序)写在前面的目录

    原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...

  5. Android开发笔记:打包数据库

    对于数据比较多的控制一般会加入SQLite数据库进行数据存储,在打包时这些数据库是不自动打包到apk中的,如何创建数据库呢 方法1:将创建数据库的sql语句在SQLiteHelper继承类中实现,在第 ...

  6. Android开发笔记--hello world 和目录结构

    原文:Android开发笔记--hello world 和目录结构 每接触一个新东西 都有一个hello world的例子. 1.新建项目 2.配置AVD AVD 没有要新建个,如果不能创建 运行SD ...

  7. [APP] Android 开发笔记 002-命令行创建默认项目结构说明

    接上节:[APP] Android 开发笔记 001 4. 默认项目结构说明: 这里我使用Sublime Text 进行加载.

  8. Android开发笔记——以Volley图片加载、缓存、请求及展示为例理解Volley架构设计

    Volley是由Google开源的.用于Android平台上的网络通信库.Volley通过优化Android的网络请求流程,形成了以Request-RequestQueue-Response为主线的网 ...

  9. 【转】Android开发笔记——圆角和边框们

    原文地址:http://blog.xianqu.org/2012/04/android-borders-and-radius-corners/ Android开发笔记——圆角和边框们 在做Androi ...

随机推荐

  1. oracle 11g 服务端下载地址及安装说明

        oracle 11g 服务端下载地址及安装说明         分类:             Oracle              2013-11-17 19:40     988人阅读  ...

  2. 模拟一下goldengate中断后,重新同步操作

    模拟一下goldengata中断后,重新同步操作:     1.关掉源端抽取进程 GGSCI (20081122-2105) 15> info all Program     Status    ...

  3. Android——Gallery 图片拖动效果

    1.XML文件 <?xml version="1.0" encoding="utf-8"?><Gallery xmlns:android=&q ...

  4. 1、程序启动原理和UIApplication【转】

    一.UIApplication 1.简单介绍 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序. (2)每一个应用都有自己的UIApplica ...

  5. Arrays

    Arrays:用于操作数组对象的工具类,里面都是静态方法. asList方法:将数组转换成list集合. String[] arr = {"abc","kk", ...

  6. CInternetSession CHttpFile Post提交数据

    //给指定url发请求, 返回请求后的结果 string CAutoPatchDlg::SendURLPost(string strServerName, string strFormActionUr ...

  7. 关于scrollview监听的一些方法

    一 package cn.testscrollview; import android.os.Bundle; import android.view.MotionEvent; import andro ...

  8. Orchard官方文档翻译(七) 导航与菜单

    原文地址:http://docs.orchardproject.net/Documentation/Navigation-and-menus 想要查看文档目录请用力点击这里 最近想要学习了解orcha ...

  9. 华为OJ平台——放苹果(典型整数划分问题)

    题目描述: 输入m,n,分别表示苹果数与盘子的总数,要求输出苹果放在n个盘子的方法总数(注意511和151是一种情况),例如输入 7 3 输出8((7),(6,1),(5,2),(4,3),(5,1, ...

  10. CreateProcessW记录

    STARTUPINFO si = { sizeof(si) };  PROCESS_INFORMATION pi; si.dwFlags = STARTF_USESHOWWINDOW;  si.wSh ...