修改VCL组件代码

时间:2011-08-16 21:08:29

标签: delphi components vcl

我需要更改组件中的功能。当你得到一个“你不能覆盖这个”消息,或者你需要在私有方法中更改代码(“基类中不存在方法”消息)时,你会怎么做,使得组件无法下降?

2 个答案:

答案 0 :(得分:4)

在修改私有方法或行为时,有一些(主要是hacky)选项:

  • 修改原始来源,重新编译单位并按建议使用更改的dcu here;从来没有这样做,但我认为当你的代码使用新的dcu但其他VCL代码没有
  • 时,这会让你头疼
  • 通常组件行为由许多窗口消息控制 - 看看你是否可以通过修改其中一些消息的反应来实现你的改变;您可以覆盖消息处理方法(具有message关键字的方法),即使它们被声明为私有,您也可以替换WndProc
  • 你可以使用this之类的黑客来修补
  • 你可以使用一些绕道机制,如答案here
  • 中所述

或者你可以得到另一个组件。

答案 1 :(得分:4)

如果我遇到这个问题,

  • 我首先尝试从组件或其CustomXXX祖先继承并查看是否可以解决问题。如果没有,
  • 我更深入,即尝试拦截进来的消息。这可以动态完成。如果结果太深,因为必须构建的代码太广泛,或者我仍然必须访问我无法访问的项目,
  • 我尝试黑客攻击。一个hack是将组件和依赖代码复制到具有不同名称的新单元,重命名组件并修改需要修改的内容。
  • 有时候我只需要重做一两种方法来使我的新行为成为可能。

永远不要忘记为单元赋予不同的名称,并且组件也可以是不同的名称(可能继承自原始组件或其祖先之一,因此它们保持在同一层次结构中)。 从不修改原始源,然后重新编译VCL。这是一场维护噩梦。

我不喜欢内插器类,即从原始类中获取相同名称但行为与原始类不同的类。它们的功能取决于使用条款中包含的顺序,这对我来说似乎更加脆弱。我不能推荐。

但我做的很大程度上取决于问题。我认为不能(或应该)提供涵盖所有情况的全面建议。

但我的主要建议是: 不要修改原始单元 ,始终将新代码放在新单元中并使用新类名。这样,原始版本和修改版本可以在IDE中和平共存。