在阅读this question之后,我想知道是否可以修改TCustomEdit
来检查文本宽度,使其所有后代都继承更改?
答案 0 :(得分:3)
您对TCustomEdit
所做的大多数更改都将由后代继承。这通常是继承的工作原理。具体而言,它取决于你所做的改变:
如果您编辑 StdCtrls.pas ,那么您所做的任何更改都将由任何新编译的代码继承。这种技术的一个障碍是让Delphi接受对您的 StdCtrls.pas 版本的更改,而无需重新编译难以或无法重新编译的库的其他部分。
如果在运行时修补TCustomEdit
个方法(通过覆盖方法的前几个字节的常用技术来直接控制到您自己的方法),那么这些更改也将被继承由后代。
如果您修补了TCustomEdit
虚拟方法表,那么某些更改将被继承,但不是全部。对修补方法的虚拟调用将使用您的自定义版本,但非虚拟调用将继续使用原始版本。当后代使用inherited
时,对继承方法的调用的调度不是虚拟的,因此不涉及VMT,后代将最终调用原始的TCustomEdit
方法。
答案 1 :(得分:0)
TCustomEdit在stdctrls单元中。要测试将继承哪些更改,请不要修改VCL路径上的更改,将stdctrls复制到主项目文件夹并在那里进行修改。德尔福将首先找到您修改过的单位并将使用它。
这使得所有其他项目和VCL补丁使用/更新原始单元。你的补丁单位不会受到影响。
如果我是对的,那么即使在新位置修改它也会导致重建相关的VCL单元。因此,当切换到其他项目时,您需要进行构建,以便使用原始单元“切换回”来重新编译VCL部件。