修改VCL组件代码
我需要更改组件中的功能。当您收到“您无法覆盖此”消息,或者您需要更改私有方法中的代码(“基类中不存在该方法”消息),导致组件无法下降时,您该怎么办?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我需要更改组件中的功能。当您收到“您无法覆盖此”消息,或者您需要更改私有方法中的代码(“基类中不存在该方法”消息),导致组件无法下降时,您该怎么办?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(2)
如果我遇到这个问题,
永远不要忘记给单元一个不同的名称,也给组件一个不同的名称(可能继承自原始组件或其祖先之一,因此它们保留在同一层次结构中)。 切勿修改原始源代码然后重新编译 VCL。这是维护的噩梦。
我不喜欢插入器类,即与原始类具有相同名称但行为不同、继承自原始类的类。它们的功能取决于 use 子句中包含的顺序,这对我来说似乎很不稳定。我不能推荐这样做。
但我做什么很大程度上取决于问题。我认为人们不能(或应该)给出涵盖所有情况的一揽子建议。
但我的主要建议是:不要修改原始单位,始终将新代码放入新单位中,并且使用新类名。这样原始版本和修改版本就可以和平共存,在 IDE 中也是如此。
If I face that problem,
Never forget to give the unit a different name and the component a different name too (possibly inheriting from the original component or one of its ancestors, so they remain in the same hierarchy). Do never modify the original sources and then recompile the VCL. That is a maintenance nightmare.
I am no fan of interposer classes, i.e. classes that get the same name but different behaviour than the original classes, inheriting from the original. Their functionality depends on the order of inclusion in the uses clause, and that seems rahter flaky to me. I can't recommend that.
But what I do greatly depends on the problem. I don't think one can (or should) give a blanket advice that covers all situations.
But my main advice: do not modify the original units, always put the new code in a new unit and use a new class name. That way the original and the modified versions can peacefully co-exist, also in the IDE.
在修改私有方法或其中的行为时,有一些(主要是 hacky)选项:
message
关键字的方法),即使它们被声明为私有,您也可以替换 WndProc或者您可以获得另一个组件。
There are some (mainly hacky) options when it comes to modifying private methods or behavior therein:
message
keyword) even if they are declared private and you can also replace the WndProcOr you can get another component.