delphi低版本升高版本问题

来源:互联网 发布:开票软件服务费抵扣 编辑:程序博客网 时间:2024/04/29 17:43


首先声明,本帖更新时间不固定。另外,只愿意使用d7者勿入。




为了节省篇幅,d7之前的就不提了。d7之后,对升级影响比较大的版本有这些:delphi2009,xe2以及xe5。2009开始string默认为unicode,xe2引入firemonkey,xe5支持手机开发。




高版本的其它一些新特性,比如泛型,闭包,增强的rtti,dbexpress,helper等等,虽然也很强大,不过不影响程序的迁移,老代码也可以照常使用,因此这里就不再提了。




关于第三方控件,凡是还活着的都会支持新版本的delphi,而那些被淘汰了的三方控件,难道你打算陪它殉情吗?


好了,言归正传,先说unicode。其实从旧版本迁移过来很简单,把以前的'string'替换成'ansistring','char'替换成'ansichar','pstring'替换成'pansistring','pchar'替换成'pansichar',就算是大功告成了。当然,以后用到char的时候,要记得它占两个字节,string的每个字符也是两个字节。内存拷贝的时候需要当心,使用sizeof(char)是个不错的主意。




说到xe2,刚才忘记了提一下,xe2支持64位编译。当然了,编译成64位程序也有一些兼容性问题的。首先是嵌入式汇编代码,64位下的函数参数用的寄存器发生了变化,因此喜欢使用嵌入式汇编的朋友在向64位进行迁移时会遇到一些麻烦。另外就是在64位下,integer依然是32位的,但是指针和接口类型都是64位的了。因此,对指针进行加减计算时不能再强制转换为integer,考虑到同时需要生成32位和64目标代码的情况,强制转换为nativeint是个不错的选择。




xe2的另一个亮点是firemonkey,虽然xe2的firemonkey还不成熟,但它确实有着巨大的前景。不管怎么说,一套代码多个平台,以及图形2d和3d编程的方便快捷,对很多人来说吸引力是无与伦比的。


firemonkey的一个特点是任何控件天生都可以作为容器,所以你看不到tlabelededit这种玩意儿了,因为完全不需要。因为要跨平台,所以firemonkey里的控件都是自绘的,跟vcl里面封装使用windows控件有本质的不同。




想想看,一句代码都不用写就可以实现许多图形特效,比如控件的动态旋转,比如图像的高斯模糊,或者是透明度的变化,光源效果,3d旋转等等等等。




当然,firemonkey和vcl是不同的两套框架,在同一个程序里面,二者不可得兼。选择了firemonk的强大图形功能和跨平台特性,就得放弃以前基于windows的vcl下的一些特殊技巧。这些技巧,主要是指mfc那些消息什么的。




系统升到WIN7后, 也尝尝鲜换了XE3, 之后果断抛弃D7了。




另外,使用firemonkey开发非windows软件时,你会发现控件面板上一些基于windowd平台的控件处于不可使用的灰色状态,比如ado啊,tcp啊什么的。幸好,有新的跨平台控件可以取代它们。




最后是xe5。xe5开始支持android开发,因为本人讨厌水果,因此最近几天才开始真正的跨平台软件开发,目前移植了一个大程序和几个小程序到android下,还算比较满意。


delphi开发手机软件的头条兼容性问题还是string。在arm下,delphi规定string必须是unicodestring,不可改写,而且从0开始索引。


unicodedtring倒也罢了,都到xe5了,除了跟硬件通信外谁还会用ansistring啊。因此这个问题算不了什么,大不了用tbytes代替ansistring。别告诉我你没用过tbytes!




第二条是string的不可改写,就是说,S[i] := 'a'这种代码是不能用的了!代替的方法有两个,一个是字符串硬加,另一个是使用tstringbuilder。推荐使用tstringbuilder,因为可以避免内存碎片。


第三个规定比较坑爹,在arm下也就是说开发手机软件时字符串从0开始,windows和水果的桌面系统下字符串从1开始。这跨平台软件怎么写啊,总不能条件编译满天飞吧!


于是,stringhelper派上大用场了,基于stringhelper的函数,无论什么平台,都是从0开始的!所以,我现在的软件都改成这么写的:S.chars[0];S.substring(3,5);S.indexof('abc',8);


下面说说我在android下面开发遇到的一些小问题。第一个问题就是在android下不能showmodal,因为android不支持模态窗口!折腾了大半天后,用showmodal(aproc<tmodalresult>搞定了。当然,你得对匿名函数和闭包有所了解。匿名函数和闭包是从d2009开始支持的。




还有一个问题就是android下的屏幕分辨率问题,delphi提供的hookscale函数实际上是无法去起作用的,这算是一个bug。我的临时解决方案是修改fmx.platform.android单元的源代码。




最后一个跨平台会遇到的移植困难是windows的消息机制。很多朋友喜欢发送消息,我认识一位仁兄曾经说过,他们设计的平台里消息满天飞。当然了,作为持续了N年的军工项目,估计不会再提出跨平台的需求了。但是请注意,如果你希望将来有一天你的程序可以在多个平台上使用,那么现在就设计好你的框架,尽量不要用消息机制,哪怕现在你的程序仅仅是for vcl的。人无远虑,必有近忧。


唠唠叨叨了这么多,最后说说我自己的程序迁移。我个人喜欢尝试新的东西,所以每次delphi的新版本出来后我都会在第一时间使用并编译旧代码。如果没有影响使用的bug,就会抛弃旧版本delphi。另外,新版本的一些新特性,我也会在编写新代码或者改动旧代码时尽量使用。


比如说,我迁移到android下的那个大程序,本来就是基于firemonkey的。




所以呢,我的经验就是早升级,早尝试,早受益。而且这样每次升级需要改动的地方很少,但若是跨越的版本太多,旧代码移植就变得很困难,因为你又多写了几年的不兼容的代码。




本人极少使用数据库,属于稍微复杂些的sql语句都写不好的那种。因此只能给出一些原则性的建议。1,尽量使用widechar字符。2,三层比两层的扩展性好得多。3,数据量大时考虑使用散列。


http://tieba.baidu.com/p/2625972288?pn=1


delphi各个版本编译开关值


{$IFDEF VER80}  - Delphi 1
{$IFDEF VER90}  - Delphi 2
{$IFDEF VER100} - Delphi 3
{$IFDEF VER120} - Delphi 4
{$IFDEF VER130} - Delphi 5
{$IFDEF VER140} - Delphi 6
{$IFDEF VER150} - Delphi 7
{$IFDEF VER160} - Delphi 8
{$IFDEF VER170} - Delphi 2005
{$IFDEF VER180} - Delphi 2006
{$IFDEF VER180} - Delphi 2007
{$IFDEF VER185} - Delphi 2007
{$IFDEF VER200} - Delphi 2009
{$IFDEF VER210} - Delphi 2010
{$IFDEF VER220} - Delphi XE
{$IFDEF VER230} - Delphi XE2
{$IFDEF VER240} - Delphi XE3
{$IFDEF VER250} - Delphi XE4
{$IFDEF VER260} - Delphi XE5


 


{$IF CompilerVersion >= 18.5}
//some code only compiled for Delphi 2007 and later
{$IFEND}




Delphi XE5  - 26
Delphi XE4  - 25
Delphi XE3  - 24
Delphi XE2  - 23
Delphi XE   - 22
Delphi 2010 - 21
Delphi 2009 - 20
Delphi 2007 - 18.5
Delphi 2006 - 18
Delphi 2005 - 17
Delphi 8    - 16
Delphi 7    - 15
Delphi 6    - 14
0 0
原创粉丝点击