将项目从Delphi 3迁移到Delphi 2010

5

我被要求重新打开一个1998/99年用Delphi 3编写的项目,该项目自那时以来一直稳定运行。我在一个老旧的Windows 98机器上拥有Delphi 3代码库,这个机器只存在于维护该项目。显然,在进行任何重大修改之前,我希望将源代码库带入21世纪。

我注意到Delphi 2010(我目前使用的是2007)声称能够导入从Delphi 2开始的项目。有没有人有从Delphi 3导入大型项目的经验?我能否期望这是一个容易的过渡,还是一个困难的过程?

此外,原始项目使用第三方组件,包括DBISAM、WPTools和TMS Planner。我注意到所有这些组件都仍然可以用于最新版本的Delphi。假设我首先将新版本安装到Delphi 2010中,那么我能否期望使用这些组件的部分应用程序也会被翻译?我知道至少WPTools自原始应用程序中使用的版本以来已经改变了一些组件结构和接口,显然我需要进行一些重新编码,但是这些程序的失败是否会阻止我的代码库被升级?


你应该首先评估一下,使用 Delphi 2010 重新编译是否真的能将应用程序“带入21世纪”。现代应用程序使用最新的控件和(Vista风格)对话框,因此外观完全不同,支持视觉样式,可以在受限用户帐户下运行,正确支持Unicode(这远远不止是在Delphi 2009+上进行编译),没有硬编码路径......也许需要改变和修复的东西太多了,使用 Delphi 2010 进行重写可能更好? - mghie
3
也许他的计划是将代码库迁移到D2010,统一开发环境,并在进行重写或大规模更改之前熟悉它。 - Fabricio Araujo
无论如何,我都需要进行一些重写,因为原始代码库(我自己编写的)并不好。尽管如此,我希望知道我可以在相对短的时间内获得一个可工作的程序版本,然后根据项目允许的情况进行重写。Unicode并不重要,这是一款面向业务的应用程序,适用于与美国单个州的法律紧密相关的公司。 - Larry Lustig
2
就Vista风格对话框而言(我相信这个应用程序运行的办公室仍然在XP上),编译后简单重构不就可以解决吗? - Larry Lustig
7个回答

6
这种迁移是完全可能的,但取决于您的代码编写方式,它可能会很痛苦或者很容易。不幸的是,在开始迁移过程之前很难说出哪种情况。
首先要做的事情是确保所有DFM文件都被转换为文本表示形式。我相信这在Delphi的后续版本中已经成为默认设置,但我记得Delphi 3使用的是二进制格式。在delphi 3 bin目录下应该有一个名为DFMConvert的实用程序文件,可以将DFM转换为文本。您需要这样做的原因是为了确保如果由于组件无法加载而需要手动编辑DFM时,您能够读取源代码。不仅您要跨越Delphi的版本,还要跨越您使用的每个组件的版本,可能会出现一些不兼容性,导致某些组件无法加载。如果出现这种情况,并且您有一个“新”版本,则可以直接编辑DFM源代码,将测试表单与其中的组件进行比较,删除任何(或重命名)位置不正确的内容,然后再次尝试加载表单。
正如Frabricio所提到的,如果您使用变体,那么您需要对uses子句进行微小的调整。
好消息是,一旦您纠正了组件/uses子句,您的代码本身应该能够正常工作。如果您直接升级到Delphi 2010,那么您唯一需要解决的问题就是Unicode,编译器会通过错误和警告向您指出所有问题。

关于“可能会有一些不兼容性导致组件加载失败”的问题,您能否提及您遇到过的任何此类不兼容性?谢谢。 - Larry Lustig
一种这样的不兼容性是属性更改,其中新组件重命名该属性或不再支持它。这将生成一个加载表单时出现错误的错误,并可能从表单中删除该组件。通过手动编辑 DFM,您可以纠正其行为并完全加载表单。 - skamradt
3
dfm文件转换工具名为"convert"。 - dummzeuch

5
假设您已经安装了D2007并且所有这些组件集都附带有D2007 dcus,我建议您首先尝试在D2007上重新打开代码库。然后再转到D2010,因为实际的VCL具有Unicode功能,可能会导致一些迁移问题(这里不讨论,因为它已经在网上和这里深入讨论过)。
我要说的是,在D5和D7之间(不确定确切的版本),rtl发生了单元重组织(创建了Variants.pas单元和许多OTAPI单元更改了名称等)。所以这将是您遇到的第一个问题。编辑:不仅Variants被重定位,很多IDE集成工具也是如此-为了避免未经许可的代码部署。如果您有一些OTAPI代码(例如,允许在继承窗体上发布属性的代码),它将需要重定位到一个包项目中。
正如skramradt所说,您可能需要处理二进制DFM文件的问题...
在那之后,如果一切正常,请开始考虑Unicode问题。根据应用程序的不同,可能会很容易或很困难。对于我的应用程序来说,不会有太大的麻烦。但我知道有些人比我面临更大的问题。

但是我的理解是,D3项目在D2007中甚至无法打开,而D2010声称可以这样做。我认为,为更改的RTL进行重构是D2010升级过程的一部分。 - Larry Lustig
无论是D2007还是D2010都可以打开D3项目,或者至少应该可以打开。 - Craig Stuntz
谢谢。我是否误解了D2010中的旧版本导入功能是新功能? - Larry Lustig
所有的 Delphi 版本都尝试升级来自所有先前版本的项目。它们甚至大多数情况下都成功了。 - dummzeuch
3
没错。D6 中的单元布局发生了重大变化,因为我们在这里使用了 Kylix 和 CLX,因此 Delphi 代码发生了显着变化。D2007 的第二个原因是 Unicode - 这是升级的另一个重要点。所以,一步一步来:首先升级到 D2007(单元),然后再升级到 D2010(Unicode)。 - Alex

4
这里有一些关于升级到Delphi 2010的注意事项:
  1. 使用Delphi2010编译的可执行文件比Delphi3编译的文件大约多了3倍。
  2. 任何编译都会产生比Delphi3更多的警告和提示。最好的做法是删除所有的提示和警告。
  3. 我发现在Delphi3中可以正常编译的Pascal文件,在Delphi2010中不能正常编译。视觉上看不出问题或区别,但编译错误清楚地指出错误行号。在我的例子中,问题与CR/LF有关,在我的Delphi中只有一个CR。这是一个难以解决的问题,也是一个真正的时间浪费。不过,这些文本可以在Notepad或WinHex.exe中查看。我编写了一个名为PARSER.EXE的程序,可以识别这些控制字符。一旦知道控制字符在哪里,这是在Notepad中编辑这些文件的最佳方法。
  4. AnsiString。Delphi 2010现在使用AnsiStrings、MBCS和WideStrings(Unicode),而不是Delphi 3使用的ASCII字符串。标准的Delphi 2010实现使用字符串作为Unicode和Chars作为16位字符。现在需要确保许多8位ASCII字符串被定义为AnsiStrings。显然,使用PChars定义接口的旧dll现在需要PAnsiChar。
  5. 以下是Delphi平台之间代码不可互换的原因:
  6. Delphi 2010有额外的函数和变量类型,如AnsiChar、AnsiStrings。
  7. 版本间的窗体不兼容,因为后期的Delphi版本具有额外的属性。
  8. dcu在版本之间不兼容。
  9. 包在版本之间不兼容。Delphi 2010中没有Crystal Reports,因此您可能需要单独购买它。使用的任何其他包也可能需要升级,需要花费成本。
  10. 许多函数,例如Readfile、Writefile、GettickCount现在要求参数为DWORD,而Delphi3更加宽容。其中一些函数与更高的磁盘容量相关。
  11. 弹出菜单。这些具有一个名为AUTOHOTKEY的新属性。这应该设置为手动。如果将其设置为默认值,则标题将插入“&”以提供热键功能。
  12. 光标。使用光标的方法已经改变。
  13. 似乎Delphi2010增加了很多新功能,但代价是使其更难使用。可能Delphi 3拥有更好、更易于使用的界面。
  14. 帮助。可能比Delphi 3更好。但似乎会在寻找帮助信息时消失几分钟。交互式帮助是一个麻烦。
  15. BorlandMM.dll在Windows 2000上无法与Delphi 2010应用程序一起使用。因此,如果要使用该dll,您可能需要升级大量PC。

我需要升级大约100个应用程序DLL和COM服务器,预计需要12周的工作时间进行调试和验证。希望这可以帮助到您。


3

为了让您放心,我最近将我正在开发的软件从Delphi 4转换到Delphi 2009以获得Unicode功能,遇到了一些问题,但这些问题都可以在几周内解决。

需要注意的一点是:如果您使用任何第三方包,请确保它们有可用于升级的Delphi 2010版本,在进行转换之前。Delphi 2009也可以,但我不会尝试在D2010中使用旧的packages。


1

关于将D3迁移到D2010,我无法多说,但我最近成功地将D6迁移到了D2010。首先,我做的是确保在D2010中也有您在D3中使用的所有第三方组件。将从D6构建的任何自定义组件重新编译为D2010。加载我的D6源代码并进行编译。逐个处理所有Unicode问题和编译器错误...大约花了3天时间(约30000行代码)。


0
我有一个 Delphi 7 项目组,可以轻松升级到 Delphi 2010。 不幸的是,在使用新创建的 Delphi 2010 项目组文件进行下一次启动时, IDE 在加载项目后会崩溃并消失。没有显示任何异常,也没有错误消息。 我的解决方法是始终使用 Delphi 7 文件,并让 Delphi 2010 升级它所喜欢的内容,而不使用新创建的项目文件。

你尝试过在D2010中手动重新创建项目吗?也就是让Delphi创建一个新项目,然后添加所有单元并设置所有所需的项目选项。 - Uli Gerhardt

0

我确认其他人所说的:将D3应用程序转换为D2010通常很容易,只要涉及到您自己的代码。

我看到两个困难:

  1. 您使用String作为通用缓冲区,存储除字符以外的其他内容。
  2. 您的代码假定sizeof(char)为1,即在应该使用SizeOf()时使用Length()或反之。

最困难的部分是第三方组件。

看起来您正在使用的所有组件仍然存在于D2010中,这是一个好消息。但是它们的接口可能已更改,当然需要进行一些代码更改。


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