散分!请问用过D4后又用过D6的大哥,从D4升级到D6后编译同一个项目所产生的EXE在运行时可能会在哪些方面不同? exe文件会大一些,其它的应该不会改动太大 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 VCL的结构改了好多,不过,编译成EXE,你就看不出来了 有序类型的一元负化过去,Delphi 使用 32 位操作处理有序类型数字的一元负化,这可能会导致某些奇怪的结果。这里是使用一元负化的一个代码例子:var c: Cardinal; i: Int64;begin c := 4294967294; i := -c; WriteLn(i);end;在以前版本的 Delphi 中,被显示的 i 的值会是 2 。对于这个情况显然这是错误的行为。在 Delphi 6 中,一元负化在提升有序类型为一个 64 位有符号类型后再处理,这样最终显示的 i 值为 -4294967294 。很可能现存的代码会依赖于不正确的一元负化行为。Delphi 用户应该意识到这个新的行为。你花时间去为有序变量的一元负化检查你的代码实例并确保你的应用程序适当地响应新行为是值得的。被重命名的 DsgnIntf 及其相关变化在你的工程中对 DsgnIntf 的引用应该被改变为新的 Delphi 6 名称,DesignIntf。你也许也会需要添加DesignEditors,VCLEditors 和 RTLConsts 到你的 uses 子句。你也将需要添加 designide 到你的包的requires 列表。对 dsnide50 的引用可能也应该变为 designide,如果那没有被 Delphi 自动改变的话。任何使用 IDesigner 的运行时包需要使用 IDesignerHook 来避免运行时需要 designide。在运行时代码里,IDesignerHook 应该足够。设计时代码可以使用 IDesigner,但是应该使用类似下面的代码来从 IDesignerHook 的一个实例获得实际 IDesigner 接口。var RealDesigner: IDesigner;...SomeDesignerHook.QueryInterface(IDesigner,RealDesigner);...IDesignerHook 仅要求 Classes 和 Forms 单元可用。IDesigner 需要 DesignIntf,后者包含了许多其它包,而其中一些可能不是可重新分发的。组件编辑器的变化类 TComponentEditor 在 Delphi 6 里有不同的祖先系。在 Delphi 5 里,它从 TInterfacedObject 继承;现在它从一个新的类 TBaseComponentEditor 继承。类 TComponentEditorClass 现在也是 TBaseComponentEditor 而不是 TComponentEditor 的一个类。这些层次体系上的变化会要求你修改你的旧的 Delphi 工程。TDesignWindow 的变化关于类 TDesignWindow,存在大量变化。它已经被移动到 DesignWindows 单元,并且它的 FormClosed 方法已经被 DesignerClosed 替代。过去,你可以通过使用 AForm 参数在 FormClosed 里获得对表单的访问。现在,在 DesignerClosed 里,你必须使用 Designer 的 Root 属性来访问表单。在 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 Lib 文件夹里的独立单元。在 Delphi 6 中,它已经被集成到 rtl.dcp 里。对于移植到 Delphi 6 中的 Delphi 5 工程,这会导致某些问题。这里有个例子。在一个 Delphi 5 工程里,通过放置同名的单元在你的工程路径的某个地方,你有可能做出一个工程特定的对 OpenGL 单元的覆盖。Delphi 6 中使用的同一方法也导致在使用 rtl.dcp 组件中出现许多名称冲突。现在需要名称上的改变。某些类型从 HTTPApp.pas 移动到 HTTPProd.pas 中HTTPApp 单元里的数个类型已经被移动到 HTTPProd 单元里。它们是 THTMLBgColor,THTMLAlign和THTMLVAlign。如果你的工程使用这些单元中的任何一个,你应当改变你的 uses 语句来指向 HTTPProd 而不是HTTPApp。Search 单元被删除,SearchBuf 例程被移动和改变单元 Search 不再存在于 Delphi 6 中。SearchBuf,这个在一个本文缓冲区内定位一个子字符串的例程,已经被移动到 StrUtils 单元;且它的参数已经变化了。最后的参数是一个 TStringSearchOptions 对象。如果你的工程因为编译器不能找到 Search 单元而不能编译,那么改变你的 uses 语句来包含 StrUtils 而不是Search。你也将需要检查你的 SearchBuf 调用以确保你的参数匹配新的语法。 自定义的控件,或者是网上下载的控件一般不行,我自己就是从D4到D6,然后只能回到D4,因为我在网上下载了一个表格控件,并通过自己修改后调用。控件调用VCL4,在D6中几乎不能用,而我又几乎所有的程序段都有用到自己的自定义控件,只有再回来了。如果没用其他控件,基本上是可以的。 我记得好像d4+ie5+win97有时会死的很惨 这种运算要用什么类型? 进度条的困惑 关于树型控件的小问题 Rave报表中,如何控制用可视化工具设计的Memo中字符打印时的行距 请问:串口和单片机的通讯? 每页小计怎么 如何删除filelistbox1中列出来,用户的选中的文件??? 从主窗体按钮SHOW一个普通的TFORM窗体,带参数,但老出错,详情请进来瞧!!! scrollbox中多个imag 怎么得到时焦点 返回是哪个IMAG 关于XE10 Android手机APP 上传图片FTP 到服务器目录下的问题 查找数据库中的相同数据? Query控件为什么会丢失事件?
c: Cardinal;
i: Int64;
begin
c := 4294967294;
i := -c;
WriteLn(i);
end;
在以前版本的 Delphi 中,被显示的 i 的值会是 2 。对于这个情况显然这是错误的行为。在 Delphi 6 中,一元负化在提升有序类型为一个 64 位有符号类型后再处理,这样最终显示的 i 值为 -4294967294 。很可能现存的代码会依赖于不正确的一元负化行为。Delphi 用户应该意识到这个新的行为。你花时间去为有序变量的一元负化检查你的代码实例并确保你的应用程序适当地响应新行为是值得的。被重命名的 DsgnIntf 及其相关变化在你的工程中对 DsgnIntf 的引用应该被改变为新的 Delphi 6 名称,DesignIntf。你也许也会需要添加DesignEditors,VCLEditors 和 RTLConsts 到你的 uses 子句。你也将需要添加 designide 到你的包的requires 列表。对 dsnide50 的引用可能也应该变为 designide,如果那没有被 Delphi 自动改变的话。任何使用 IDesigner 的运行时包需要使用 IDesignerHook 来避免运行时需要 designide。在运行时代码里,IDesignerHook 应该足够。设计时代码可以使用 IDesigner,但是应该使用类似下面的代码来从 IDesignerHook 的一个实例获得实际 IDesigner 接口。var
RealDesigner: IDesigner;
...
SomeDesignerHook.QueryInterface(IDesigner,RealDesigner);
...
IDesignerHook 仅要求 Classes 和 Forms 单元可用。IDesigner 需要 DesignIntf,后者包含了许多其它包,而其中一些可能不是可重新分发的。组件编辑器的变化类 TComponentEditor 在 Delphi 6 里有不同的祖先系。在 Delphi 5 里,它从 TInterfacedObject 继承;现在它从一个新的类 TBaseComponentEditor 继承。类 TComponentEditorClass 现在也是 TBaseComponentEditor 而不是 TComponentEditor 的一个类。这些层次体系上的变化会要求你修改你的旧的 Delphi 工程。TDesignWindow 的变化关于类 TDesignWindow,存在大量变化。它已经被移动到 DesignWindows 单元,并且它的 FormClosed 方法已经被 DesignerClosed 替代。过去,你可以通过使用 AForm 参数在 FormClosed 里获得对表单的访问。现在,在 DesignerClosed 里,你必须使用 Designer 的 Root 属性来访问表单。在 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 Lib 文件夹里的独立单元。在 Delphi 6 中,它已经被集成到 rtl.dcp 里。对于移植到 Delphi 6 中的 Delphi 5 工程,这会导致某些问题。这里有个例子。在一个 Delphi 5 工程里,通过放置同名的单元在你的工程路径的某个地方,你有可能做出一个工程特定的对 OpenGL 单元的覆盖。Delphi 6 中使用的同一方法也导致在使用 rtl.dcp 组件中出现许多名称冲突。现在需要名称上的改变。某些类型从 HTTPApp.pas 移动到 HTTPProd.pas 中HTTPApp 单元里的数个类型已经被移动到 HTTPProd 单元里。它们是 THTMLBgColor,THTMLAlign和THTMLVAlign。如果你的工程使用这些单元中的任何一个,你应当改变你的 uses 语句来指向 HTTPProd 而不是HTTPApp。Search 单元被删除,SearchBuf 例程被移动和改变单元 Search 不再存在于 Delphi 6 中。SearchBuf,这个在一个本文缓冲区内定位一个子字符串的例程,已经被移动到 StrUtils 单元;且它的参数已经变化了。最后的参数是一个 TStringSearchOptions 对象。如果你的工程因为编译器不能找到 Search 单元而不能编译,那么改变你的 uses 语句来包含 StrUtils 而不是Search。你也将需要检查你的 SearchBuf 调用以确保你的参数匹配新的语法。