从Delphi 7迁移到Delphi XE有多难?

37

我们公司有一款软件已经开发了10年以上,所以里面有一些非常陈旧的东西。它仍然相当实用,但是我看到Delphi XE上的新功能让我想要升级。问题在于源代码本身超过300mb的.pas文件(包括组件等总共1gb)。

我们正在使用自定义组件、旧版JVCL和最新的DevExpress。

如果我决定从Delphi 7迁移到Delphi XE,我可以期望遇到多大的困难呢?

谢谢。


3
没问题,你的项目很庞大,翻译需要一些时间,但这并不难。 - David Heffernan
这是一个主观问题。是的,它很难,但不是太难。 - user422039
@user422039 - 我想是这样的,但这里的答案对我很有帮助,等到需要转换的时候我会做好更充分的准备。谢谢大家。 - Rosenberg
6个回答

29

唯一的真正问题是转换为Unicode。你应该学习Delphi中的Unicode支持实现 - 从Marco Cantu 白皮书: Delphi和Unicode开始。

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


16

有些小工具可以无需修改就迁移到Unicode,或者只需要进行一些Unicode修复即可运行。

然而,如果你的代码库像你所描述的那样庞大,你不应该完全依赖于任何人在这里告诉你的。只需获取XE的副本并加载代码。看看你遇到了什么问题,以便了解需要投入的工作量。

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

我遇到的最常见的错误:

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

  • 编译器会在使用c in ['a'..'z']时发出警告。对于unicode字符串,你应该使用CharInSet()

  • 如果设置了ShortDateFormat,编译器会发出一个警告,建议使用FormatSettings.ShortDateFormat。在新代码中这是个好主意。如果你正在移植,如果你只想开始就忽略它。

此外,你可能会升级第三方库的版本,这样你就不必自己进行移植。这些库可能已经改变了它们的接口或功能,所以我建议下载一些试用版来看看有什么变化。


谢谢,那我将会面临很多这样的情况。我只是在试探一下,因为否则我们就得购买 Delphi XE。 - Rosenberg

6

你在回复评论中提到了SQL……你的数据库是否支持Unicode?如果不支持,你可能需要做很多工作。你可能需要实时转换数据库或为用户创建一个转换工具。你可能需要升级数据库甚至切换到其他数据库。例如,DBISAM不支持Unicode,但该供应商推出了ElevateDB,它支持Unicode。这个过渡并不容易。而一些像Hyperstring这样的库,主要是用汇编语言编写的,也是另一个痛点。


我正在使用 Microsoft SQL Server 2008 SQL_Latin1_General_CP1_CI_AS, 我认为不应该遇到任何问题,对吗? - Rosenberg
1
只要您不需要存储整个Unicode集,就无需强制更改数据库为Unicode。DB客户端和驱动程序会来回转换,但请注意编写可在LATIN1下转换而不会丢失的内容。 许多Delphi程序员忽视的是,许多数据库不受应用程序私有控制。它们是公司数据,由许多应用程序使用,并且应用程序必须遵守数据库设计,而不是相反。 - user160694

6

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

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

然后,您应该计划最大的部分:Unicode转换,包括您的应用程序和数据库。

最后,还有一些不太重要,但潜在非常耗时的方面:

  • 如果您正在使用BDE,则现在是摆脱它的时候了
  • Delphi XE比Delphi 7更严格
  • 第三方库版本会升级几个版本,并且通常远不如VCL向后兼容

当您完成移植后,就可以开始改变事物:由于您已经看到了整个代码库,现在您知道您的弱点在哪里,因此您可以开始重构它们并获得比以前更好的应用程序。


5

我的项目有一百万行代码,最近我从CB9升级到XE。为了减少工作量,我首先重写了很多内容,使其不再依赖第三方组件包,然后仔细检查了所有与字符串相关的内容(Unicode),然后才转移到XE上。准备工作很繁琐,实际移植相对容易。


啊,这是个好主意,我的代码也很大。我面临的最大问题是自定义组件,它们是专门为Delphi 7制作的,它们是常见控件的变体(编辑、标签、按钮等的编辑版本)。自定义组件的最大原因是添加一个属性,从SQL中读取它们的标题,这是作为本地化手段实现的,我认为这已经过时了。 - Rosenberg
这完全不是问题。 - David Heffernan
不用担心,Delphi自己的本地化技术在D7之后就被破坏了,直到XE才得以修复。因此,在这方面,您没有错过任何新内容。 - user160694

0

执行这次迁移肯定是个挑战。但是需要良好的规划!

首先,我们需要找出所有可能需要与代码一起迁移的组件。如果Delphi7项目中使用了不可用的第三方组件,则进一步操作变得相当复杂。 其次,还有涉及Unicode的其他类型转换,这很容易。 最后当然我们需要安排其他支持库、BDE和数据库适配器。

对于丰富的用户界面,可以使用DelphiFireMonkey

Delphi的支持范围从桌面到Web再到移动应用程序开发,越来越好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接