Delphi - 在修复VCL错误时,使用不同版本的x编译单元x

时间:2014-06-25 15:05:27

标签: json delphi vcl datasnap

我正在使用Delphi XE6并在我的项目中使用Datasnap和JSON。我想在VCL单元System.JSON.pas(在TJSONString.ToString函数中)纠正一个错误,它应该转义反斜杠字符和引号。为了解决这个问题,我执行了以下操作:

  1. 将System.JSON.pas从标准VCL源文件夹复制到我的项目源文件夹
  2. 将System.JSON.pas添加到我的项目中(使用新复制的文件)
  3. 修正了错误并尝试编译
  4. 我收到错误'Unit Data.DBXCommon是用不同版本的System.JSON.TJSONObject编译的'

    我可以看到Data.DBXCommon单元引用了System.JSON,所以我猜编译器现在看到了2个版本 - 我的固定版本和标准的VCL版本。

    实施VCL更改以避免此问题的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

此问题有两个常见原因:

  1. 您对本机的界面部分进行了更改。如果不重新编译使用您正在修改的单元的所有单元,则无法执行此操作。
  2. 使用与最初构建它的编译器选项不同的编译器选项重新编译单元。通过确保用于编译您修改的单元的编译器选项与Embarcadero使用的相同来处理它。通常,Embarcadero使用默认选项进行编译。将这些直接放在要修改的源文件中,就在文件的最顶部。
  3. 话虽如此,使用上面的选项2无法解决类似主题的recent question here。在该问题中,仅在XE6下,未修改的Classes单元根本无法重新编译和链接。这让我想知道这种特殊的技术是否有它的一天。也许它甚至不可能。在您放弃之前,看看您是否可以编译和链接未修改的单元。

    更广泛地说,使用绕行通常是解决您遇到的问题的更简单方法。使用绕行而不是重新编译可以使修复程序的管理变得更清晰,更简单。

    更新1

    我无法让未经修改的System.JSON单元重新编译和链接。我认为这意味着在另一个问题中提出的问题比Classes单位更广泛。我想你会发现这是一个难以克服的障碍,并建议使用绕道而行。

    更新2

    XE6似乎已经解决了XE6中似乎已经解决的问题。未修改的System.JSON单元将在XE7中编译和链接。

答案 1 :(得分:0)

如果Delphi XE6原始System.JSON.dcu没有用Delphi XE6编译但是它是用以前版本的Delphi编译的,那该怎么办?

您声称通过更改源代码然后重新编译System.JSON,您设法使用相同的方法在Delphi XE2中实现修复。因此,我建议您首先对Delphi XE2和Delphi XE6附带的原始System.JSON文件进行比较。

如果它们相同,那么您设法使用Delphi XE2重新编译的已更改的System.JSON.dcu也可以与Delphi XE6一起使用。

答案 2 :(得分:0)

我通过以下方法解决了类似问题:

  1. 删除不同版本的 .dcu 文件(即冲突文件)。

  2. 重新生成项目以创建新的.dcu文件。