在2010中String默认映射到UnicodeString,单个字符是2字节,所以上文中P1实际占用了8字节内存,而传给Move函数的长 度只有4字节,最终结果是P2="te"。

解决办法1:

修改String为AnsiString,该方案虽然可行,但你的程序就享受不到Unicode待遇了。

解决办法2:

SetLength 函数不要修改,因为他的长度参数是字符长度,而不是字节长度。

Move函数的最后一个参数 Length(P1) 修改成 Length(P1)*SizeOf(Char)。

注意:不要偷懒使用万一老师说的ByteLength函数,该函数并没有For AnsiString的重载,编译器会 把参数隐式转化为UnicodeString然后,ByteLength函数计算UnicodeString的长度。例如:一旦你不小心传入了一个 AnsiString类型长度为4的字符串,函数会返回8,而不是你期望的长度4。

3,Key in ['a'..'z','B','C']

这类代码最好替换成CharInSet(Key,['a'..'z','B','C']) 不然会当作AnsiChar处理。

4,WideString

代码中的所有WideString都考虑替换成String,现在 WideString只是为了与COM兼容而存在,且没有引用计数,性能低下。

5,Tnt控件

如果你的工程使用了Tnt控件或以前的WideTextPos WideStringReplace之类的东西都替换成标准的吧,不用曲线救国了。

---------经过修改,可以在Delphi2010下运作的第三方组件--------------

1,PNGDelphi

2,EmbeddedWB

3,SynEdit的语法高亮组件 unihighlighter

4,JEDI Win32API Header

这些组件现在可以在Delphi2010下运作了。

6,引用AnsiStrings单元

如果你有必要使用 AnsiLowerCase AnsiCompareStr之类的函数,一定要引用AnsiStrings单元。

如果你不引用该单元,即便编译不报错,你实际上是用的还是Unicode版本的函数,会有隐式的转化。不信你打开参数自动完成,看看IDE提示给你的类型是什么?天啊AnsiLowerCase参数竟然还是String,而不是AnsiString。看来Delphi2010太迫切的要抛弃Ansi字符串了,以至于你不引用AnsiStrings单元,所有Ansixxxx函数实际上还是Unicode版本。

7,AnsiCopy AnsiPos AnsiDelete

不要用AnsiCopy AnsiPos AnsiDelete,因为Copy Pos Delete三个函数已经有了For Ansi的重载。

8,把Char转化为小写用什么?

答案:试试看Character单元的新函数 ToUpper ToLower。以前我都是用System里面的UpCase函数,现在依然可用不过却找不到LowCase DownCase之类的函数,困扰我好久好久。索性全使用Character单元提供的新函数吧。

9,编译期警告:[DCC Warning] Unit1.pas(31): W1057 Implicit string cast from 'AnsiString' to 'string'

如果你的代码中包含了两种字符串(Unicode、Ansi)之间进行隐式转化的时候就会出现该提示。

如下代码就会触发该警告:

var Unicode:String; Ansi:AnsiString; begin Ansi:='test..'; Unicode:=Ansi;

把旧版本的Delphi项目升级到2010,我通常都是借助编译警告来快速寻找需要改动的部分。通常你可以把赋值双方都声明为String(默认影射到UnicodeString),就可以避免该警告。但如果你确定必须在此处保留Ansi并进行转化的时候,建议你显式的转化他们(例如:Unicode:=String(Ansi);),这样可以避免该警告,方便你在升级过程中继续寻找其他需要修改的地方。

10,Readln Writeln 写入文件时候要注意

如果你传给Writeln一个AnsiString,那么它也会在文件中写入AnsiString,那么你读取得时候就必须传给Readln一个AnsiString的类型,否则就是乱码。例如旧工程的配置文件是Ansi的,而你已经把相关读取配置的代码升级为支持Unicode,那么运行工程前你首先要用记事本之类的工具把配置文件另存为成Unicode编码。当然你还要注意跳过Unicode文件头的两个字节FE FF。

11,别再用String来操作二进制数据了

一定要记住String只是字符串,不要把它当作缓冲区、内存流使用。我的项目中,有很多地方是使用字符串来处理二进制数据,导致在本次升级中颇为费脑。如果当时用TBytes或TStream就好了。

反面教材:

var Int1,Int2,Int3,Int4:Integer; Buf:String; begin SetLength(Buf,12); Move(Int1,Buf[1],SizeOf(Integer)); Move(Int1,Buf[5],SizeOf(Integer)); Move(Int1,Buf[9],SizeOf(Integer)); Buf:=Buf+'前面有3个Integer。';

12,还是PChar

注意在2010中是这样的:

PChar= Pointer to a WideChar array;

PAnsiChar = Pointer to a AnsiChar array;

如果你还像是在Delphi 7中那样:PChar(AnsiString)那后果过是很严重的。

Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结相关推荐

  1. Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结 .

    Delphi7升级到Delphi 2010.Delphi XE.Delphi XE2总结 这两天把一个使用Delphi2007成功升级到了Delphi2010.升级途中很艰辛,总结了 以下经验与大家分 ...

  2. [转]Delphi 2010 3513正式版破解

    原文地址: http://www.cnblogs.com/tc310/archive/2010/05/08/1730300.html http://www.kucol.com/html/NEws/ye ...

  3. RAD Studio/Delphi 2010 3615下载+破解

    RAD Studio/Delphi 2010 3615下载+破解 官方下载地址: http://altd.embarcadero.com/download/RADStudio2010/delphicb ...

  4. Delphi 2010 安装及调试

    呵呵,毫不客气地说,Delphi 2010 这个版本可以算是 Delphi 的一个"里程碑",为什么这么说?因为这个版本实现了几个 Delphi 应该有却一直没有的功能 Delph ...

  5. Delphi 2010 refactor / refactoring 重构不能使用的原因以及解决

    delphi 2010 refactor / refactoring 重构不能使用. 经过实验的确是DelphiDistiller上的设置贴心的过头的原因. 一切的罪魁祸首就是"Don't ...

  6. Delphi 2010安装及使用UniDAC安装和使用笔记

    Delphi 2010安装及使用UniDAC安装过程: 1.进入"...\unidac40src\Source\Delphi14"文件夹(注意不同delphi版本可能source下 ...

  7. Delphi 2010的好消息

    从橙子那里得到了Delphi 2010的好消息. 首先是一个类似于E/R Studio的东西被集成了进去,或许以后用它来做数据库程序会方便很多,"据说"是会有原生的ORM框架,来帮 ...

  8. 从 Delphi 7 到 Delphi 2010

    从 Delphi 7 到 Delphi 2010 ( 一 )基本数据类型的变化2010-06-30 12:47 -------------------------------------------- ...

  9. 下载delphi 5 至 delphi 2010

    Delphi Distiller 是delphi爱好者都知晓的一个小工具. 从1.70版本开始,增加了下载页,包括delphi 5 至 delphi 2010 的每个版本和更新. 昨天因为换了硬盘,需 ...

  10. Delphi - 2010下安装IOComp

    原文地址:Delphi - 2010下安装IOComp - HuangJacky - 博客园http://www.cnblogs.com/huangjacky/archive/2010/01/18/1 ...

最新文章

  1. Bootstrap学习笔记(四)-----Bootstrap每天必学之表单
  2. dubbo 自定义线程池
  3. cocos2dx进阶学习之屏幕适配
  4. Spring 核心框架体系结构
  5. Elasticsearch报错:NodeDisconnectedException[[][IP:9300][cluster:monitor/nodes/liveness] disc
  6. 《跨越鸿沟》中的提到的五类用户
  7. 淘宝买卖交流爆笑全集
  8. eyoucms使用入门 二
  9. C++洛谷题解(6)
  10. 在SCI-Hub上下载国外论文
  11. 安卓手机卡顿怎么解决_苹果七系统内存满了手机卡顿解决方法
  12. 简单的文本编辑器C语言实现
  13. Android 跳转电话、邮件、短信等系统页面
  14. Linux 命令--SS
  15. python利用以下公式求π的值_Python 计算 π 值的简单示例
  16. 视觉传导通路,光能转化为神经电能后,神经电冲动如何传导?|小白心理-312/347考研答疑
  17. 360视频加速器官方版
  18. 【C语言】玩转指针——关于指针,你需要掌握的基础知识!
  19. 就靠这一篇文章,我就弄懂了 Python Django 的 django-admin 命令行工具集
  20. 八马茶业冲刺深交所主板:拟募资10亿 IPO曾被终止

热门文章

  1. java获取动态输入_java-如何在Spring中以bean形式接收动态生成的输入值
  2. 关于Docker的一些问题总结
  3. redis-LinkedList
  4. 深入理解ajax系列第九篇
  5. discuzcode函数
  6. FGMap一个仿GoogleMap的WebGIS客户端
  7. html网页背景图像失真,CSS实现页面背景图片模糊内容不模糊的方法
  8. 机房服务器硬件供应,机房服务器硬件维护方法大全
  9. 我的世界javamod怎么装_你不装绞盘,怎么在越野圈混?
  10. 人脸识别 face_recognition