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