【问题标题】:Move project from Delphi 3 to Delphi 2010将项目从 Delphi 3 移至 Delphi 2010
【发布时间】:2009-10-02 15:14:05
【问题描述】:

我被要求重新打开一个我在 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 也许他的计划是将代码库带到 D2010 以统一开发环境并在冒险进行重写或重大更改之前适应它。
  • 我无论如何都要重写一些代码,因为原始代码库(我自己写的)不是很好。不过,我想知道我可以在相对较短的时间内获得该程序的工作版本,然后我将在项目允许的情况下重写。 Unicode 并不那么重要,它是一个业务线应用程序,适用于一家公司,其业务严格遵守美国单个州的法律。
  • 至于 Vista 风格的对话框(而且我相信运行这个应用程序的办公室仍然在 XP 上)难道不能在应用程序可编译后通过简单的重构来处理吗?

标签: delphi migration delphi-2010


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢。 WRT 到“可能存在一些可能导致组件加载失败的不兼容问题”,您能否提及您遇到的任何此类不兼容问题?
  • 这样的不兼容性之一是属性更改,其中新组件重命名该属性或不再支持它。这将在加载表单时生成错误,该错误可能会从表单中删除组件。通过手动编辑 DFM,您可以更正行为并完全加载表单。
  • dfm 文件转换实用程序称为“convert”。
【解决方案2】:

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

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

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

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

【讨论】:

  • 但我的理解是,D3 项目甚至没有希望在 D2007 中打开,而 D2010 声称能够这样做。我假设对更改后的 RTL 进行重构是 D2010 升级过程的一部分。
  • D2007 和 D2010 都将打开 D3 项目,或者至少应该打开它们。
  • 谢谢。我是不是误会了以前版本的导入功能是 D2010 中的新功能?
  • 所有 Delphi 版本都尝试从所有以前的版本升级项目。他们甚至大部分都成功了。
  • 没错。 D6 中的单元布局发生了重大变化,因为我们在这里得到了 Kylix 和 CLX,因此 Delphi 代码发生了重大变化。 D2007 的第二个原因是 unicode - 升级的另一个重点。所以,一次做一步:先升级到 D2007(单位),然后再升级到 D2010(unicode)。
【解决方案3】:

这里有一些关于升级到 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 周。希望这会有所帮助。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我有一个 Delphi 7 项目组,Delphi 2010 很容易升级。 不幸的是,在下一次开始使用新创建的 Delphi 2010 项目组文件时, 加载项目后,IDE 会崩溃并消失。没有显示异常,没有 错误信息。我的解决方法是一直使用 Delphi 7 文件并让 Delphi 2010 在不使用新创建的项目文件的情况下升级任何它喜欢的东西。

        【讨论】:

        • 您是否尝试在 D2010 中手动重新创建项目? IE。让 Delphi 创建一个新项目,然后添加所有单元并根据需要设置所有项目选项。
        【解决方案7】:

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

        我看到两个困难:

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

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

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

        【讨论】:

          猜你喜欢
          • 2010-12-10
          • 2011-08-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-09
          • 2011-05-09
          相关资源
          最近更新 更多