项目升级到Delphi 2010总结(1)
来源:互联网 发布:三维空间旋转矩阵 编辑:程序博客网 时间:2024/06/07 19:23
======================================================
注:本文源代码点此下载
======================================================
这两天把一个使用delphi2007开发的30万行左右的项目,成功升级到了delphi2010。升级途中很艰辛,总结了 以下经验与大家分享。另外,工程中使用的第三方组件,由于官方没有发布for delphi2010的更新,我也顺便修改了。有需要的联系我。修改的第三 方组件列表见文章尾部。
1,pchar
因为delphi不支持无类型指针的算术运算,很多程序员使用 pchar来代替pointer,即使指针指向目标并不是pansichar。
考虑如下代码:
var
p:pchar;
buffer:pointer;
begin
getmem(buffer,255);
p:=buffer;
p^:=#1;
inc(p);
p^:=#2;
freemem(buffer,255);
end;
在2010中pchar已经不再表示pansichar而是表示pwidechar,如果依然这样写,运行时很可能会得到一个内存访问错误。因为每 次inc(p),实际上指针向前移动了2字节,因为sizeof(widechar)=2,inc(p)相当于 p:=p+sizeof(widechar)。
解决方法是把pchar替换成pansichar
2,move fillchar copymemory
这些函数依赖的是字节长度,往往我们直接使用length(str)来获取,这是行不通的。
考虑如下代码:
var
p1,p2:string;
begin
p1:='test';
setlength(p2,length(p1));
move(p1[1],p2[1],length(p1));
在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控件或以前的widetextposwidestringreplace之类的东西都替换成标准的吧,不用曲线救国了。
待续…………
---------经过修改,可以在delphi2010下运作的第三方组件--------------
1,pngdelphi
2,embeddedwb
3,synedit的语法高亮组件 unihighlighter
4,jedi win32api header
这些组件现在可以在delphi2010下运作了,有需要的联系我。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- 项目升级到Delphi 2010总结(1)
- 项目升级到Delphi 2010总结
- 项目升级到Delphi 2010总结
- 项目升级到Delphi 2010总结
- .Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
- Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
- Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
- Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结 .
- Delphi7升级到Delphi 2010、Delphi XE、Delphi XE2总结
- Delphi2007升级到Delphi 2010总结
- Delphi2007升级到Delphi 2010总结
- Delphi 项目由Access升级到SQLServer2005的注意事项
- 从Delphi 7升级到Delphi XE
- Delphi XE5 升级到 XE10.1 图标出现黑框(背景色为黑色)解决方法
- 项目从Delphi 7 升级到Delphi2010过程中遇到的有关FormPaint的问题
- 从 Delphi 7 升级到 Delphi 2010 基本数据类型的变化
- Delphi 项目总结
- Delphi 项目总结
- ExtAspNet应用技巧(三) - 302与Asp.Net Ajax
- java 中判断是否为 汉字(转)
- Java 的变量
- JavaScript 无缝上下(左右)滚动加定高(定宽)停顿效果
- Java API中文版下载
- 项目升级到Delphi 2010总结(1)
- 4.Delphi文本编辑器的设计
- 3年前的小程序:破解需要delphi IDE 环境的vcl 控件
- steventong
- fieldset——一个浮游在边框之上的HTML标签
- jQuery $.post $.ajax用法
- javascript笔记:javascript里面不同function定义的区别
- 10个让人眼花缭乱的HTML5和JavaScript效果
- php ajax 乱码处理