重新编译修改后的VCL单元

6
我必须使用更改后的VCL单元编译我的项目。我使用Delphi XE8。我将Vcl.StdCtrls.pas从D:\ Program Files(x86)\ Embarcadero \ Studio \ 16.0 \ source \ vcl复制到我的项目文件夹中,我的.dpr文件所在的位置,然后我修改了我的Vcl.StdCtrls.pas的副本。我还将此单元添加到项目树中。问题是,在Delphi XE8中,这种重新编译VCL单元的方法不再起作用。我在修改后的Vcl.StdCtrls.pas单元中放置了一个明显的语法错误。编译器没有报告错误,这意味着它甚至没有检查该文件。我总是进行完整构建Shift + F9。我发现类似的问题如何重新编译VCL中的特定单元?但是像我所说的,它不再起作用,对于Delphi XE8也一样。

另外,修改后的单元在我的.dpr文件的uses列表中:

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

// 它没有帮助


我根本不相信这是真的。 - David Heffernan
1
值得问一下为什么你想这样做。完全有可能存在一个更稳健的解决方案来解决你试图解决的根本问题。 - J...
例如类插入。 - TLama
1个回答

7
这似乎是一个bug。我猜你正在使用运行时包。在XE7中,这样的项目将无法编译 - 这是正确的行为。在XE8中,它可以编译,显然使用VCL运行时包并忽略您修改的单元。
编辑:
请注意,即使在以前的Delphi版本中,在使用运行时包的同时修改VCL单元仍需要您重新打包修改后的包及其依赖项(在本例中为vcl和rtl)。 换句话说,在链接到包含该单元另一个副本的运行时包时,您不能简单地使用修改后的单元。单元名称必须在整个项目的完整范围内是唯一的,包括主可执行文件和所有链接的运行时包。
因此,您的解决方法要么是:
1.不使用运行时包,或 2.将所有所需的单元打包到自己的运行时包中,并链接到它们,而不是Embarcadero提供的rtl、vcl等。

在遇到单元名称时,可能无法编译,因为该单元已经在一个依赖包中。因此,即使是正确的单元也无法编译。 - David Heffernan
@DavidHeffernan 是的,我也会这样假设。 - Ondrej Kelle
1
值得指出的是,您无法在不重新构建包的情况下替换包中的单元。因此,提问者尝试的操作从未有可能实现。 - David Heffernan
1
还要注意的是,许可证规定您不可以/不应该替换Embarcadero提供的单元,除非您将其重命名。 - Rudy Velthuis
2
@RudyVelthuis 我在许可证中没发现有这样的内容。你能提供一下参考吗?我多年来一直在我的项目中内部使用修改后未重命名的VCL单元,而没有进行分发。 - Ondrej Kelle
显示剩余3条评论

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