分享
 
 
 

升级到Delphi 6 - 兼容性问题(中文全文)

王朝delphi·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

升级到Delphi 6

原著:Borland Corporation

翻译:Musicwind®

日期:2001-07-11

声明:

以下文章的内容取自Delphi 6附带的帮助文件。

版权所有Borland Corporation。

翻译此稿事先没有得到Borland的批准,鲁莽之处,恳请Borland多多原谅。

总则

打开Delphi 5 (或更早版本)的工程,新版本会自动对其进行升级。以下将要介绍的是新版本中可能会对现有的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现在的缺省值为关(OFF),这是为了防止在Delphi的工程中运用可赋值的常量。可赋值的常量,也就是定义一个常量,但是却允许在运行期间改变其值。例子如下:

const

foo: Integer = 12;

begin

foo := 14;

end.

在以往的Delphi版本中,有这么一个特性:常量不是真正的常量。使用编译宏$WRITEABLECONST OFF,则以上的代码中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、Editors 和RTLConsts 几个单元到你的引用列表中。除此之外你还得将designide加入到你的包的Requires的列表中。另外,对dsnide50的引用可能得手动改为DesignIde,如果Delphi没有自动更改的话。

任何引用了IDesigner的运行期包,需要改为IDesignerHook以防止运行期时对于designide单元的引用要求。在运行期代码中,IDesignerHook 功能足够使用,无需担心。设计期时可以使用IDesigner,如以下代码一样:

var

RealDesigner: IDesigner;

...

SomeDesignerHook.QueryInterface(IDesigner,RealDesigner);

...

来获得IDesignerHook 提供的IDesigner的接口。IDesinerHook的使用只需要引用Classes和Forms两个单元。但是IDesigner还得加上DesignIntf单元,由于该单元被包含在许多其它包中,而其中的一些包可能是不能二次分发的。

七. 有关组件编辑器的变化

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的调用是否符合新的语法。

[文终]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有