将项目从 Delphi 7 迁移到 Delphi XE 有多难?

Posted

技术标签:

【中文标题】将项目从 Delphi 7 迁移到 Delphi XE 有多难?【英文标题】:How hard is it to migrate a project from Delphi 7 to Delphi XE? 【发布时间】:2011-08-07 09:15:56 【问题描述】:

我们公司的软件已经开发了 10 多年,所以里面有一些非常过时的东西。它仍然很实用,而且一切都很好,但是我看到了 Delphi XE 上的新功能,这让我想要切换。问题是源代码本身有超过 300mb 的 .pas 文件(包含组件等总共 1gb)。

我们正在使用自定义组件、旧的 jvcl 东西和最新的 devexpress。

如果我决定从 Delphi 7 迁移到 Delphi XE,我的期望会有多难?

谢谢。

【问题讨论】:

这应该很容易,因为你的项目很大,所以它会花费你一些时间 这是主观问题。是的,这很难,但不,并不多。 @user422039 - 我想是的,但这里的答案对我帮助很大,当转换的时间到来时,我会做好更好的准备。谢谢大家。 【参考方案1】:

唯一真正的问题是转换为 Unicode。你应该了解如何在 Delphi 中实现 Unicode 支持 - 从 Marco Cantu White Paper: Delphi and Unicode开始

在不知道实际代码的情况下,无法估计将旧应用程序升级到 Unicode 所需的工作量。如果您以标准方式使用字符串类型,则转换将很容易。任何字符串类型的低级技巧(如将二进制数据存储在字符串中)现在都已弃用,应重写相应的代码。

【讨论】:

【参考方案2】:

一些小工具无需进行任何修改即可迁移,或者只需修复几个 unicode 即可使其运行。

但是,如果您的代码库如您所解释的那样庞大,则您不应完全依赖这里的任何人将要告诉您的内容。只需获取 XE 的副本并加载代码。查看您遇到了哪些问题,以了解需要付出的努力。

此时我已将所有代码移植到 XE(甚至是旧项目)。我尽可能地重复使用相同的库,所以一旦我转换了其中的大部分,将应用程序从 Delphi 7“移植”到 Unicode Delphi 通常只是一项重复性任务,要么处理库中的更新接口,要么修复编译器错误和警告。

我遇到的最常见错误:

Unicode 的东西。这将花费 90% 的时间。如果代码做了很多低级字符串处理会很烦人,但大多数问题都可以通过添加一些类型转换来轻松解决。

当您使用 c in ['a'..'z'] 时,编译器会出错。您应该将CharInSet() 用于unicode 字符串。

如果您设置 ShortDateFormat,您将收到一个编译器警告,提示您应该改用 FormatSettings.ShortDateFormat。在新代码中这是个好主意。如果您正在移植,如果您只是想开始,请先忽略它。

此外,您可能会将第三方库升级到较新的版本,这样您就不必自己移植这些库。改变界面或工作方式的情况并不少见,所以我会下载一些试用版,看看有什么改变。

【讨论】:

谢谢,那时我会遇到很多这样的问题。我只是四处逛逛,因为那样我们就不得不购买 Delphi XE。【参考方案3】:

您在其中一个响应 cmets 中提到了 SQL...您的数据库是否支持 unicode?如果没有,你可能需要做很多工作。您可能需要即时转换数据库或为您的用户制作转换工具。您可能需要升级数据库,甚至切换到其他东西。例如,DBISAM 不支持 unicode,但供应商制造了 ElevateDB。过渡并非微不足道。其他一些库,如 Hyperstring,主要是用汇编程序编写的,是另一个痛处。

【讨论】:

我使用的是 Microsoft SQL Server 2008 SQL_Latin1_General_CP1_CI_AS,我认为我应该不会遇到问题,不是吗? 您不必将数据库更改为 Unicode(只要您不需要存储整个 Unicode 集)。 DB客户端和驱动程序会来回转换,但要注意写什么可以不丢失转换,只要你使用LATIN1。许多 Delphi 程序员错过的是许多数据库不受应用程序私有控制。它们是许多应用程序使用的公司数据,应用程序必须符合数据库设计,反之亦然。【参考方案4】:

我已经做了很多这样的转换。

您应该准备好让您当前的代码库可测试。最好使用自动化单元测试,但至少要有一个好的最终用户测试计划。

那么您应该计划最大的部分:应用程序和数据库的 Unicode 转换。

最后还有一些不太重要但可能非常耗时的方面:

如果您使用的是 BDE,现在是时候摆脱它了 Delphi XE 比 Delphi 7 更严格 第 3 方库版本增加了很多版本,并且通常远不如 VCL 向后兼容

移植后,是时候进行更改了:既然您已经看到了整个代码库,现在您知道自己的弱点在哪里,因此您可以开始重构它们并获得比以前更好的应用程序。

【讨论】:

【参考方案5】:

我的项目大约有一百万行代码,我最近从 CB9 移植到 XE。为了减少工作量,我首先重写了很多,因此我不再依赖 3rd 方组件包,然后仔细检查了所有与字符串相关的内容(unicode),然后才转移到 XE。准备工作很多,实际移植比较容易。

【讨论】:

啊,这是个好主意,我的也很大。我面临的最大问题是自定义组件,它们是专门为 delphi 7 制作的,它们是通用控件的变体(编辑、标签、按钮等的编辑版本)。自定义组件的最大原因是添加了一个从 sql 读取其标题的属性,这是作为本地化手段实现的,我认为这已经过时了。 这根本不是问题 别担心,Delphi 自己的本地化技术在 D7 之后就被破坏了,直到 XE 才修复。因此在这方面你没有错过任何新的东西。【参考方案6】:

执行此迁移绝对是一项挑战。但需要良好的规划!

我们首先需要找到所有可能的组件,这些组件也需要与代码一起迁移。如果 Delphi7 项目中使用了不可用的 3rd 方组件,那么进一步进行下去就相当复杂了。 其次,与Unicode相关的其他类型转换,这很容易。 最后,我们当然需要其他支持库、BDE 和数据库适配器。

对于丰富的用户界面,可以使用 Delphi FireMonkey。

Delphi 越来越好,因为它现在支持从桌面到 Web 再到移动应用程序的开发。

【讨论】:

以上是关于将项目从 Delphi 7 迁移到 Delphi XE 有多难?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi:从 IBO 迁移到 FireDac

PDevMode 和 DocumentProperties。在 Delphi 7+XE 之间迁移时出错

Delphi XE7 - 字段 FTBcd - 数字超出范围

delphi 各新版本特性收集

将 Delphi 7 应用程序移植到 Delphi 2007 后性能下降 [关闭]

将 Delphi 6 第三方组件添加到 Delphi 2010?