大部分都可以比较平滑的转移,VCL控件可能有些问题。主要是属性编辑器的问题,在论坛里可以找到一些讨论。例如要加上DesignIDE,不能使用另外一些文件等

解决方案 »

  1.   

    我个人认为D6的兼容性是不错的,所以只要在D6中打开D5的工程,让D6自己进行转换就可以了
      

  2.   

    从delphi 6中打开delphi 5 (或更早版本)的工程,delphi 会自动对其进行升级。以下将要介绍的是新版本中可能会对现有的delphi工程带来潜在影响的一些改动。ide(集成开发环境)特性       包名称的自动更新       兼容性问题想要了解更多其他信息,请参考”delphi6新特性”这一部分的内容。 兼容性问题以下列出的是可能影响你的delphi应用程序的几个大的方面: 一.             由于vcl体系结构的变化而引起的provider和client dataset 的一些事件的变动tcustomclientdataset的引入,使得delphi 5或早期版本中的事件处理机制做些变动。dbclient.pas单元中有5种类型的6个事件发生了变化,他们分别是: 事件类型                    变化 tresolvererrorevent            影响到provider的 onupdateerror 事件。tbeforeupdaterecordevent   影响到provider的 beforeupdaterecord事件。tafterupdaterecordevent     影响到provider的 afterupdaterecord事件。tproviderdataevent             影响到provider的 ongetdata and onupdatedata事件。treconcileerrorevent           影响到client dataset的 onreconcileerror 事件。 必须将以上提到的这些事件对应的处理函数(过程)中的tclientdataset替换为tcustomclientdataset。 二.             使用默认数据库登录的代码的变动原先,将一个连接组件(比如 tdatabase,tadoconnection,或tdcomconnection)的loginprompt属性设置为true,则会有默认的登录对话框弹出。这一特性已经不再保留除非你在单元引用中增加一个引用dblogdlg的语句。如果想要应用程序仍然能够弹出默认的登录对话框,务必加上 use dblogdlg这么一句,否则便不会有任何提示输入用户名和密码。 三.             潜在的二进制form文件的不兼容过去,新版本delphi创建的二进制form文件(或称dfm文件)可以被老版本的delphi读取。但是现在不行了。某些二进制form文件可能不能被老版本正确的读取,其原因是delphi 6内部的字符串的流化和原先不同。过去,流化操作假设一个本地特殊的字符集。而现在新的流化操作假设字符集为utf-8。由此带来的问题就是,如果delphi 6的二进制form文件中包含有码值大于127的字符出现(比如版权符®),则该文件就不能被delphi 的老版本正确读取。如果你想在老版本的delphi 中打开delphi 6 的form文件,那么请先将该form文件存为文本格式而非二进制格式。 四.             有关可赋值的常量编译宏$writeableconst现在的缺省值改为关,这是为了防止delphi的工程中运用可赋值的常量。可赋值的常量,也就是定义一个常量,但是却允许在运行期间改变其值。例子如下:const   foo: integer = 12;begin   foo := 14;end.在以往的delphi版本中,有这么一个特性:常量不是真正的常量。使用编译宏$writeableconst off,则以上的代码中的begin和end之间的foo的赋值将引发一个编译错误。若要避免它,只需将foo的声明改为 var。你可能有将常量用作一个可以初始化的局部变量的代码,比如:procedure myproc;const   somedata: integer = 12;begin   inc(somedata, 3);end;你要做的是将局部常量移到过程的外部声明,使其成为一个全局的变量。然后代码变为:var   somedata: integer = 12;procedure myproc;begin   inc(somedata, 3);end;对于过度依赖于常量的代码(比如activex 控件的包装器),可以通过在源文件中插入一个{$writeableconst on}的编译命令来修正。这一特性,在rtl, vcl, clx,和 db 等核心的源代码中被禁止使用,但是在周边的单元比如activex 控件的包装器中倒可以接受。总而言之,你应该意识到“可赋值的常量”这个说法的自相矛盾。delphi的以往版本中的这一特性,只是为了与老的16位的编译器的兼容而保留,但现在对于delphi的开发者来说已经毫无意义了。要养成好的编程习惯,尽量避免使用可赋值的常量。 五.             cardinal类型的负数值过去,delphi处理cardinal类型的负数值时使用32位的机制,这样使得结果为一些零头的值(cardinal类型允许的最大的值与当前值的差加一)。以下为例子:var    c: cardinal;   i: int64;begin   c := 4294967294;   i := -c;   writeln(i);end;在以往版本的delphi中,i的值应当是2。但是这种情况下这个值明显不对。delphi 6中,cardinal类型是先转化为64位的有符号类型,然后取其负数值,所以最终结果i的值为-4294967294。可能有已经存在的代码依赖于原先错误的cardinal负数值的实现方法。读者应当对delphi 的这一新特性引起足够的重视。花足够多的时间来检验你的代码中是否使用了对cardianl的值的取负数是很值得的,同时确信一点,delphi的这个新的特性对你的程序的正确性不构成影响。 六.             单元dsgnintf改名及相关变化工程中对于dsgnintf的引用,需要更新到一个新的名字:designintf。可能还得加上designeditors,vcleditors 和rtlconsts 到你的引用列表中。并且你还得将designide加入到你的package的requires的列表中。对dsnide50的引用可能得改为designide,如果delphi没有自动更改的话。       任何引用了idesigner的运行期package,需要用idesignerhook来防止运行期时需要designide。运动期代码中,idesignerhook 足以应付。设计时间的代码也可以使用idesigner,但是代码要象下例一样:var   realdesigner: idesigner;...somedesignerhook.queryinterface(idesigner,realdesigner);...从idesignerhook 的一个实例上获得真正的idesigner接口。idesignerhook的使用只需要引用classes和forms两个单元。idesigner还需要用designintf,该单元被包含在许多其它packatge中,而其中的一些可能导致不可再次分发。 七.             组件编辑器的变化delphi 6中,类tcomponenteditor有了不同的祖先。在delphi 5中,它从tinterfacedobject继承而来;现在它从一个新的类,tbasecomponenteditor继承而来。同时,tcomponenteditorclass也变为tbasecomponenteditor的类类型,而不是tcomponenteditor的类类型。这些体系结构上的变化可能需要你修改你的老的delphi的工程。 八.             tdesignwindow 的变化许多变化都和类tdesignwindow有关。它的声明被移到单元designwindows中,并且fromclosed方法被替换为designerclosed。以往,在fromclosed事件中可以通过访问参数aform来访问form。而在新的事件designerclosed中,我们需要通过designer的root属性来访问form。在formclosed事件中,我们可以通过调用tdesignerselectionlist.create 或者 tcomponentlist.create来创建选择列表。而在designerclosed事件中做同样操作得使用idesignerselections接口。你可以调用createselectionlist函数来获得一个接口。selectionclosed方法的参数也和delphi 5版本中的有所不同。 九.             vcl 包的变化一些vcl相关的包已经被重新分配到其他的包里。假如你在工程中引用了vcl50.dcp,那么你需要将这个引用改为其他单元,如vcl.dcp和rtl.dcp。 十.             opengl 接口单元改到rtl.dcp中borland opengl接口单元(opengl.dcu)在delphi 5的库单元目录中是一个独立的单元。在delphi 6中它被合并到rtl.dcp中。这可能导致某些delphi 5的工程升级到delphi 6时引发一些问题。举个例子来说。在delphi 5的工程中,可能你会将与opengl单元同名的单元放置在工程目录中,以覆盖系统提供的opengl单元。而在delphi 6中,假如有任何组件引用了rtl.dcp,则将导致命名冲突,得更改名称才行。 十一.      httpapp.pas 单元中的一些类型声明移动到 httpprod.pas单元中httpapp 单元中的一部分类型被移动到了httpprod 单元中。他们是thtmlbgcolor,thtmlalign 和thtmlvalign。如果你的工程中使用了这些类,那么需要将引用的单元由httpprod改为 httpapp 。 十二.      search 单元被删除,searchbuf例程做了修改并被移动单元search在delphi 6中不再保留。searchbuf例程,用来在一个文本的缓冲区中定位子串,已经被移动到strutils单元中,并且调用的参数也发生了变化。最后一个参数改为一个tstringsearchoptions的对象。如果你的工程因为不能找到search单元而无法编译,请将引用search改为引用strutils单元。同时你应当检查对searchbuf的调用是否符合新的语法。
      

  3.   

    我碰到一个这样的错误:Unit StdActns was compiled with a different version of StrUtils.