我们公司有一款软件已经开发了10年以上,所以里面有一些非常陈旧的东西。它仍然相当实用,但是我看到Delphi XE上的新功能让我想要升级。问题在于源代码本身超过300mb的.pas文件(包括组件等总共1gb)。
我们正在使用自定义组件、旧版JVCL和最新的DevExpress。
如果我决定从Delphi 7迁移到Delphi XE,我可以期望遇到多大的困难呢?
谢谢。
我们公司有一款软件已经开发了10年以上,所以里面有一些非常陈旧的东西。它仍然相当实用,但是我看到Delphi XE上的新功能让我想要升级。问题在于源代码本身超过300mb的.pas文件(包括组件等总共1gb)。
我们正在使用自定义组件、旧版JVCL和最新的DevExpress。
如果我决定从Delphi 7迁移到Delphi XE,我可以期望遇到多大的困难呢?
谢谢。
唯一的真正问题是转换为Unicode。你应该学习Delphi中的Unicode支持实现 - 从Marco Cantu 白皮书: Delphi和Unicode开始。
如果不知道实际代码,就无法估计将旧应用程序升级到Unicode所需的工作量。如果您按照标准方式使用字符串类型,则转换会很容易。任何关于字符串类型的低级技巧(例如在字符串中存储二进制数据)现在已过时,相应的代码应进行重写。
有些小工具可以无需修改就迁移到Unicode,或者只需要进行一些Unicode修复即可运行。
然而,如果你的代码库像你所描述的那样庞大,你不应该完全依赖于任何人在这里告诉你的。只需获取XE的副本并加载代码。看看你遇到了什么问题,以便了解需要投入的工作量。
目前,我已经将所有的代码都迁移到了XE(甚至是旧项目)。我尽可能地重用相同的库,因此一旦我转换了大部分库,“移植”从Delphi 7到Unicode Delphi通常只是处理库中更新的接口或修复编译器错误和警告的重复任务。
我遇到的最常见的错误:
Unicode问题。这将占用90%的时间。如果代码做了很多低级字符串处理,这会很烦人,但大多数问题可以通过添加一些类型转换来轻松解决。
编译器会在使用c in ['a'..'z']
时发出警告。对于unicode字符串,你应该使用CharInSet()
。
如果设置了ShortDateFormat,编译器会发出一个警告,建议使用FormatSettings.ShortDateFormat。在新代码中这是个好主意。如果你正在移植,如果你只想开始就忽略它。
此外,你可能会升级第三方库的版本,这样你就不必自己进行移植。这些库可能已经改变了它们的接口或功能,所以我建议下载一些试用版来看看有什么变化。
你在回复评论中提到了SQL……你的数据库是否支持Unicode?如果不支持,你可能需要做很多工作。你可能需要实时转换数据库或为用户创建一个转换工具。你可能需要升级数据库甚至切换到其他数据库。例如,DBISAM不支持Unicode,但该供应商推出了ElevateDB,它支持Unicode。这个过渡并不容易。而一些像Hyperstring这样的库,主要是用汇编语言编写的,也是另一个痛点。
我已经做了很多这样的转换。
您应该通过使当前代码库可测试来进行准备。最好使用自动化单元测试,但至少要有一个良好的终端用户测试计划。
然后,您应该计划最大的部分:Unicode转换,包括您的应用程序和数据库。
最后,还有一些不太重要,但潜在非常耗时的方面:
当您完成移植后,就可以开始改变事物:由于您已经看到了整个代码库,现在您知道您的弱点在哪里,因此您可以开始重构它们并获得比以前更好的应用程序。
我的项目有一百万行代码,最近我从CB9升级到XE。为了减少工作量,我首先重写了很多内容,使其不再依赖第三方组件包,然后仔细检查了所有与字符串相关的内容(Unicode),然后才转移到XE上。准备工作很繁琐,实际移植相对容易。
执行这次迁移肯定是个挑战。但是需要良好的规划!
首先,我们需要找出所有可能需要与代码一起迁移的组件。如果Delphi7项目中使用了不可用的第三方组件,则进一步操作变得相当复杂。 其次,还有涉及Unicode的其他类型转换,这很容易。 最后当然我们需要安排其他支持库、BDE和数据库适配器。
对于丰富的用户界面,可以使用DelphiFireMonkey。
Delphi的支持范围从桌面到Web再到移动应用程序开发,越来越好。