delphi低版本升高版本问题

本文探讨了 Delphi 从 D7 到 XE5 的迁移过程,包括 Unicode 支持、FireMonkey 引擎介绍及其跨平台特性,并讨论了 Android 开发中遇到的具体问题及解决方案。


首先声明,本帖更新时间不固定。另外,只愿意使用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
Delphi实例开发教程》源代码包说明 __________________________________________________________________ (一)源代码程序包内容: 源代码程序包的目录结构如下: \(根目录) | |————Readme.txt(说明文件必须放在这个地方) | |————\本书大案例(目录) | | |————|————DataBase(目录,存放大案例的数据库文件为“date”和数据库连接文件TEST.UDL) | | |————|————Materials(目录,存放大案例的登录logo) | | |————|————EXE(目录,存放可执行文件,为channelplay.exe) | | |————|————Setup(目录,存放安装文件) | | |————|————Source(目录,存放源代码,这个目录可以进一步细分) | | |————|————|————code(保存源程序) | | |————|————|————dcu(保存中间编译文件) | | |————|————|————exe(保存可执行文件) 其中安装程序文件夹里面是本案例系统的安装程序,与程序源代码无关。用户既可以以它来安装信息搜索系统程序,也可以直接从setup文件夹中直接运行程序。(当然,两者前提是数据库配置好,具体的配置方法参考案例书第4章的案例分析与完善) 另外在source文件夹中还有三个文件夹,code,dcu与exe是在编写程序代码是为了方便管理而设置的(这里的exe文件夹中文件和大案例下的EXE文件夹一样)。在一般情况下,如果不对编写的delphi项目工程进行设置而直接保存到一个文件中,那么在运行程序代码是就会在此文件夹中产生中间编译文件和最后的运行程序。如此则这同一个文件夹中就不仅有项目文件、单元文件也会有在编译过程中产生的编译文件和最后程序等。这样就不方便程序的管理和查看。所以在编写delphi项目工程之前最后设置三个文件夹分别用于保存源程序代码、中间的编译文件和应用程序,以方便管理。(具体设置是先打开delphi7,选择[Project]->[options],打开一个对话框,directories/Conditionals页,在Output directory里填写保存应用程序的文件夹路径,在Unit Output directory填写保存中间编译文件的文件夹路径。这两个路径最后写与源程序代码文件夹相关的相对路径。如本书的项目工程,源程序代码保存在code文件夹中,那么Output directory里填写“..\exe”,而Unit Output directory里填写“..\dcu”。) (二)下面介绍大案例code文件夹里各个文件的内容和关系:(code文件夹里的几个文件夹都与本程序无关,可以删除) 1)ChannelPlayer.dpr-------本案例的工程文件 它说明项目中各个单元文件的运行创建,并启动生成应用程序 2)MainFrm.dfm-----------------主窗体的窗体文件 它保存软件主界面窗体所作的属性 MainFrm.pas------------------主窗体的单元文件 它保存与软件主界面窗体相关的程序代码 以下各组文件的内容可以参考本书的第二章的实例分析与完善 3)MaintainFrm.dfm---------------对已保存的定制进行修改维护的窗体文件 MaintainFrm.pas-------------对已保存的定制进行修改维护的单元文件 4)BrowserFrm.dfm----------浏览器的窗体文件 BrowserFrm.pas----------浏览器的单元文件 5)CustomSearchFrm.dfm-------实现定制搜索功能窗体文件 CustomSearchFrm.pas-----------实现定制搜索功能单元文件 6)DisplayFrm.dfm----------------设计显示和操作搜索信息界面的窗体文件 DisplayFrm.pas--------------设计显示和操作搜索信息界面的单元文件 7)DisplayFra.dfm------------显示的搜索到的网站的窗体文件 DisplayFra.pas------------显示的搜索到的网站的单元文件 8)InputFra.dfm--------------进行搜索前对一些基本输入控件处理的窗体文件 InputFra.pas---------------进行搜索前对一些基本输入控件处理的单元文件 9)RollingNewsFrm.dfm---------用于滚动新闻设置的窗体文件 RollingNewsFrm.pas---------用于滚动新闻设置的单元文件 10)SettingFrm.dfm-----------用于系统的设置的窗体文件 SettingFrm.pas-----------用于系统的设置的单元文件 11)SiteArrangementFrm.dfm---整理“站内搜索”子模块中用户设置的窗体文件 SiteArrangementFrm.pas---整理“站内搜索”子模块中用户设置的单元文件 12)SiteSearchFrm.dfm--------主要用于实现站内搜索的窗体文件 SiteSearchFrm.pas--------主要用于实现站内搜索的单元文件 13)SplashFrm.dfm-----------实现系统开始运行闪屏的窗体文件 13)SplashFrm.pas-----------实现系统开始运行闪屏的单元文件 14)ViewFra.dfm--------------设定查询数据库保存的搜索结果信息条件输入的窗体文件 ViewFra.pas--------------设定查询数据库保存的搜索结果信息条件输入的单元文件 15)ViewInfoFrm.dfm----------对数据库中信息查询的窗体文件 ViewInfoFrm.pas-----------对数据库中信息查询的单元文件 16)UnitSearch.pas-----------实现百度、新浪等搜索引擎线程定义的单元文件 以上是code文件夹的主要文件,也是本案例工程的所有代码文件,其中ChannelPlayer.dpr是工程文件,记录本工程的信息;其他的窗体都是在本系统程序使用时动态调用(各个文件的调用关系可以参考本书第一章实例分析与完善的概要模块设置部分)。code文件夹中其他文件是在程序编译运行时候有delphi7自动生成,用户可以不管。其中*.~后缀的文件是相应文件名的备份,它们也是由delphi7自动生成。 (三)source文件夹中dcu文件夹中保存的文件是程序在编译的时候生成的中间文件,它们都对应code文件夹中的每个*.pas单元文 件。 (四)source文件夹中exe文件夹的文件: ChannelPlayer.exe---是本项目工程运行是自动生成的可执行运用程序 (五)系统需求: 1. 硬件要求: 基本配置为: ¢ CPU:Intel Pentium II-class 300 MHz (Intel Pentium III-class 600 MHz recommended) 这表明需要至少300MHz的奔III处理器,笔者所使用的是雷鸟1G,应该说 性能还是可以的。 ¢ RAM:96MB(128MB recommended) 实际上,128M内存运行起来还是觉得不够,最好能够有256M以上内存。笔 者使用的是256M DDR内存。 ¢ Available hard disk space(for install):250MB ¢ Available hard disk space(post install):155MB 事实上,这个要求仅仅是针对安装delphi7所提出的 要求。 ¢ Video:800×600,256 colors 只要是14英寸显示器就可以达到这个要求。 ¢ CD-ROM:required 这只是目前计算机的标准配置,实际上,如果不是采用光盘安装的话,CD-ROM 根本就派不上用场。 ¢ Operating System:Microsoft Windows 2000(or up) ¢ Microsoft Internet Explorer 5.5(or up) 2. 本系统工程的开发环境 本信息搜索系统程序是在WindowsXP的Delphi7环境下开发编写的,并且通过测试。另外本系统也能在windows98,me,2000 的delphi7环境下开发编写。对于delphi版本,虽然delphi6与delphi7相差不大,但由于本系统的网络部分用到的一些网络控件在delphi6没有,所以如果想使用delphi6编写的程序员要用delphi6的网络控件代替delphi7的网络控件。对于刚出的delphi8,由于它是基于net框架的,主要用于网页编写,编写应用程序的方式不一样,而且delphi7的很多控件都没有,所以一般不能在delphi8中开发运行(除非重新编写所有的代码)。 (六)注意事项: 本系统要注意开发环境的选取,如上面所说的,最好使用delphi7以下的版本,不能使用delphi8。另外还要注意系统程序所用到的数据库的设置,先是把数据库还原,然后设置TEST.UDL里的连接参数,使程序能与数据库建立关系。这样之后才能运行程序。最后,由于本系统是借助几大门户网站的搜索功能实现搜索,所以要注意这些门户网站的更新,根据它们的更新来更新本系统。 (七)技术支持信息: 本系统的运行与操作: 本系统在运行之前要先设置好与数据库的连接(参考第4章的实例分析与完善)。然后运行程序会出现一个主界面,界面中间是有关新闻的滚动。击“定制搜索”功能可进入定制搜索界面,在界面的左边可以选择是搜索以前的关键字还是重新输入,如果重新输入着在“关键字”栏里填写关键字,然后选择相关设置就可以搜索。对于搜索到的信息可以直接单击进入网页,也可以右键击选择不同的操作。保存搜索信息公能用于对本次搜索信息保存到数据库中。击主界面的“查看信息”功能可以进入查看信息界面,其界面与定制搜索界面相识。 击主界面的“滚动新闻”功能和“系统设置”功能可以设置主界面的新闻滚动和本系统的信息。 _________________________________________________________________ 技术支持的联系方式: 如果用户对于本系统程序有什么疑问可以发邮件到: hsw_gm@21cn.com tenny_2000@163.com sqwen@yeah.net kukocpoplee@tom.com Jingfei2000@21cn.com _________________________________________________________________
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值