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. Xpath定位大全

    selenium使用Xpath定位之完整篇   其中有一片文章提到了xpath元素定位,但是该文章中有些并不能适应一些特殊与个性化的场景.在文本中提供xpath元素的定位终极篇,你一定能在这里找到你需 ...

  2. @Required @Autowired @Resource注解详解

    一.@Required注解用于检查特定的属性是否设置 1.RequiredAnnotationBeanPostProcessor 为该注解的处理器,即bean后置处理器,检查所有带有该解的bean属性 ...

  3. 视频相关android软件

    1. 视频解码工具:ffmpeg, http://www.ffmpeg.org/ 2. java有一个开源程序: yoyoPlayer, 可以到这个代码中去学习相关的音频知识.http://www.b ...

  4. 《Head First 设计模式》ch.1 策略(Strategy)模式

    策略模式 定义了算法族,分别封装起来,让它们可以互相替换,让算法的变化独立于使用算法的客户. 模式名词的意义 威力强大,交流的不止是模式名称,而是一整套模式背后所象征的质量.特性.约束 用更少的词汇做 ...

  5. SparkSQL使用之Spark SQL CLI

    Spark SQL CLI描述 Spark SQL CLI的引入使得在SparkSQL中通过hive metastore就可以直接对hive进行查询更加方便:当前版本中还不能使用Spark SQL C ...

  6. jQuery与Ajax

    Ajax简介 : Asynchronous Javascript And XML (异步的JavaScript和XML) AJAX 不是新的编程语言,而是一种使用现有标准创建快速动态网页的技术. 通过 ...

  7. SQL必知必会笔记2

    15. 插入数据 1). 数据插入 INSERT 用来将行插入到数据库表中,插入的方式有几种: (1)插入完整的行: INSERT INTO Customers VALUES( '1000000006 ...

  8. 设置.Net多线程默认CultureInfo

    .net编码过程中,当我们新开一个线程时,其默认的CurrentCulture属性为当前系统的Culture,在软件的本地化没有完成的情况下,采用默认系统的文化编码方式,可能会导致软件在界面显示,数字 ...

  9. SDUT 2141 【TEST】数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历

    数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem ...

  10. vb 取得桌面路径

    txtPath.Text = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop)