您的位置:首页 > 编程语言 > Delphi

项目升级到Delphi 2010总结(1)

2012-01-16 02:49 274 查看
======================================================

注:本文源代码点此下载

======================================================

这两天把一个使用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^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: