项目升级到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^)/
原创粉丝点击