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 已经改变了它的一些组件结构和接口,显然我将在那里进行一些重新编码,但是程序的这些部分的失败会阻止我的代码库正在升级吗?

4

7 回答 7

6

应该很有可能进行这种迁移,并且根据您的代码编写方式,它可能是痛苦的,也可能是无痛的。不幸的是,在您开始迁移过程之前很难说出哪个。

我要做的第一件事是确保所有 DFM 文件都转换为它们的文本表示。我相信这在后来的 Delphi 版本中被设置为默认值,但我记得 Delphi 3 使用了二进制格式。在 delphi 3 bin 目录中应该有一个名为 DFMConvert 的实用程序文件,它允许您将 DFM 转换为文本。这样做的原因是为了确保在由于组件未加载而必须手动编辑 DFM 时可以读取源代码。您不仅要跳转 Delphi 的版本,而且还要跳转您使用的每个组件的版本,并且可能存在一些不兼容问题,可能会导致组件加载失败。我发现如果是这种情况并且您有一个“新”版本,然后直接使用编辑 DFM 源并将测试表单及其上的组件与旧版本包含的内容进行比较。删除任何不合适的内容(或重命名),然后再次尝试加载表单。

正如 Frabricio 提到的,如果您使用变体,那么您将需要对您的使用条款进行细微调整。

好消息是,一旦您纠正了组件/使用子句,您的代码本身应该可以正常工作。如果您直接访问 Delphi 2010,您唯一的其他问题将是 Unicode,并且编译器出色地通过错误和警告将所有这些问题指出给您。

于 2009-10-02T16:20:39.957 回答
5

由于您拥有 D2007,并且假设所有这些组件集都带有 D2007 dcus,我建议您首先尝试重新打开 D2007 上的代码库。在那之后,转到 D2010,因为实际 VCL 的 Unicode 功能 - 这可能会产生一些迁移问题(我不会在这里讨论,因为它在 web 和这里的 SO上进行了深入讨论)。

我会说,因为在 D5 和 D7 之间的某个地方(不准确记录)发生了 rtl 的单元重组(随着 Variants.pas 单元的创建和许多 OTAPI 单元更改名称等)。所以这将是你的第一个问题出现的地方。编辑:不仅变体被重新定位,而且还有很多 IDE 集成的东西——以避免部署未经许可的代码。如果您有一些 OTAPI 代码(例如,允许在继承表单上发布属性的代码),则需要将其重新定位到包项目中。

正如skramradt所说,您可能必须处理二进制 DFM 的事情......

之后,如果一切正常,请转到 Unicode。根据应用程序,它可能容易或不容易。对于我的人来说,不是很烦人。但我知道还有其他人比我面临更大的问题。

于 2009-10-02T15:35:21.740 回答
4

以下是我们对升级到 Delphi 2010 所做的一些说明

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

我有大约 100 个应用程序 dll 和 COM 服务器要升级。调试工作大概需要 12 周。希望这可以帮助。

于 2010-10-20T06:25:11.260 回答
3

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

需要注意的一件事:如果您使用任何 3rd 方包,请确保它们具有可用的 Delphi 2010 版本,您可以在转换之前升级到该版本。Delphi 2009 可以,但我不会尝试在 D2010 中使用较旧的软件包。

于 2009-10-02T18:50:27.970 回答
1

关于将 D3 迁移到 D2010 我不能说太多,但我最近成功地将 D6 迁移到了 D2010。首先,我所做的是确保您在 D3 中使用的所有第三方组件在 D2010 中也可用。将任何自定义构建的组件从 D6 重新编译到 D2010。加载我的 D6 源代码,然后编译。处理所有 unicode 问题。一一处理所有编译器错误...全部在大约 3 天内完成(大约 30000 行代码)

于 2010-06-15T03:32:40.973 回答
0

我有一个 Delphi 7 项目组,Delphi 2010 很容易升级。不幸的是,在下次启动新创建的 Delphi 2010 项目组文件时,IDE 在加载项目后崩溃并消失。没有显示异常,没有错误消息。我的解决方法是一直使用 Delphi 7 文件,让 Delphi 2010 随意升级,而不使用新创建的项目文件。

于 2010-04-06T15:46:23.463 回答
0

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

我看到两个困难:

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

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

看起来您使用的所有组件对于 D2010 仍然存在,这是一个好点。但很可能他们的界面已经改变,当然需要一些代码更改。

于 2009-10-13T13:29:03.073 回答