Delphi 重新编译修改的VCL单元

Delphi 重新编译修改的VCL单元,delphi,delphi-xe8,Delphi,Delphi Xe8,我必须用一个改变了的VCL单元来编译我的项目。我使用delphixe8。我将Vcl.StdCtrls.pas从D:\Program Files(x86)\Embarcadero\Studio\16.0\source\Vcl复制到我的项目文件夹中,我的.dpr文件位于该文件夹中,然后我更改了Vcl.StdCtrls.pas的副本。我还将这个单元添加到项目树中。问题是,对于DelphiXE8,这种重新编译VCL单元的方法不再有效。我在修改后的Vcl.StdCtrls.pas单元中出现了一个明显的语法

我必须用一个改变了的VCL单元来编译我的项目。我使用delphixe8。我将Vcl.StdCtrls.pas从D:\Program Files(x86)\Embarcadero\Studio\16.0\source\Vcl复制到我的项目文件夹中,我的.dpr文件位于该文件夹中,然后我更改了Vcl.StdCtrls.pas的副本。我还将这个单元添加到项目树中。问题是,对于DelphiXE8,这种重新编译VCL单元的方法不再有效。我在修改后的Vcl.StdCtrls.pas单元中出现了一个明显的语法错误。编译器不报告错误,这意味着它甚至不检查文件。我总是做一个完整的构建转换+F9。我发现了一个类似的问题,但正如我所说的,它不再适用于Delphi XE8

此外,修改后的装置位于.dpr文件中的“我的用途”列表中:

uses
  Vcl.StdCtrls in 'D:\Dev\MYPROJECT\Vcl.StdCtrls.pas',
  ...

//它没有帮助

这似乎是一个bug。我猜您正在使用运行时包。在XE7中,这样的项目不会编译-这是正确的行为。在XE8中,它进行编译,显然使用VCL运行时包并忽略修改的单元

编辑:

请注意,即使在以前的Delphi版本中,在使用运行时包时修改VCL单元仍需要重新打包修改后的包及其依赖项(在本例中为VCL和rtl)。 换句话说,在链接包含该单元的另一个副本的运行时包时,不能简单地使用修改过的单元。单元名称在整个项目范围内必须是唯一的,包括主可执行文件和所有链接的运行时包

因此,您的解决方案是:

  • 不使用运行时包,或
  • 将所有必需的单元重新打包到您自己的运行时包中,并链接到它们,而不是Embarcadero提供的rtl、vcl等

  • 我只是不相信这是真的。也许值得问一下你为什么希望这样做。对于您试图解决的基本问题,完全有可能存在一个不那么脆弱的解决方案……例如类插入……可能在遇到单元名称时没有编译,因为该单元已经在依赖包中。因此,即使是正确的单元也无法编译。@DavidHeffernan是的,我也会这样认为。可能值得向询问者指出,如果不重建包,就不能从包中替换单元。因此,询问者的尝试从来都不可能。还要注意的是,许可证上说,你可以/不应该在不重命名的情况下更换Embarcadero提供的设备。@RudyVelthuis我在许可证中找不到类似的内容。你能提供一份推荐信吗?多年来,我一直在我的项目内部使用修改过的未命名VCL单元,而没有分发它们。