我需要更改组件中的功能。当你得到一个"你不能覆盖这个"的消息,或者你需要改变私有方法中的代码("方法不存在于基类中"的消息),使它不可能下降组件时,你该怎么办?
如果我面对这个问题,
- 我首先尝试从组件或其CustomXXX祖先继承,看看是否可以解决问题。如果没有,
- 我更深入,即尝试拦截进来的消息。这可以动态地完成。如果它太深了,因为要构建的代码太长了,或者如果我仍然要访问我不能访问的项, 我尝试黑客攻击。一种方法是将组件和依赖的代码复制到一个具有不同名称的新单元中,重命名组件并修改需要修改的部分。有时我只需要重做一两个方法来使我的新行为成为可能。
永远不要忘记给单元和组件一个不同的名字(可能是从原始组件或它的祖先继承的,所以它们保持在同一个层次结构中)。不要修改原始源代码,然后重新编译VCL。这是维护的噩梦。
我不是中间层类的粉丝,也就是说,继承了原始类,获得与原始类相同的名称但行为不同的类。它们的功能取决于在uses子句中的包含顺序,这对我来说似乎相当不可靠。我不建议那样做。
但是我做什么很大程度上取决于问题。我认为一个人不能(或不应该)给出一个涵盖所有情况的笼统建议。
但我的主要建议是:不要修改原来的单元,总是把新代码放在新单元中,并使用新类名。这样,原始版本和修改版本就可以和平共存,也可以在IDE中共存。当涉及到修改其中的私有方法或行为时,有一些(主要是黑客)选项:
- 修改原始源代码,重新编译单元,并按照这里的建议使用更改后的dcu;我从来没有这样做过,但我认为当你的代码使用新的dcu而其他VCL代码不使用 时,这会让你很头疼。
- 组件的行为通常是由许多窗口消息控制的——看看你是否可以通过修改其中一些消息的反应来实现你的改变;你可以覆盖消息处理方法(那些与
message
关键字),即使他们被声明为私有的,你也可以替换WndProc - 你可以使用像这样的技巧,它是对 进行修改
- 你可以使用一些在这里的答案中描述的绕路机制