如何在 Delphi 中的运行时更改继承类的父类



嗨,我正在开发一个 TControl 后代,让我们将其命名为 THTMLBaseControl,在运行时,该控件仅根据该控件的设置生成和输出 HTML 代码,因此基本 TControl 类和方法的所有其他属性(包括 Windows 消息传递系统(实际上不会在运行时使用,并导致内存开销。

我需要从 TControl 继承该控件,以便在设计时我可以使用所有 IDE 设计器的东西。

但是在运行时,几乎所有那些在设计时需要的属性我都不需要它们。

我的所有控件都继承自该 THTMLBaseControl,因此不是一个选项,因为它会大量复制代码。

所以我需要的是一些东西,在运行时,在类被实例化之前,我可以更改父类,以便它基于另一个类似 TControl 的类进行实例化,可能命名为 TmyBaseControl,继承自"TComponent",就像 TControl 一样,但这不会有所有的 TControl 内存开销,只会有我的 THTMLBaseControl 所需的属性和方法。

我真的没有 GUI 在 rutime 是一个只提供 HTML 的 Web 服务器,这是 intraweb 和 Raudus 所做的一些事情,但问题总是都是基于 TControl,所以它们必须在运行时创建并产生大量未使用的内存和进程开销。 也许可以有一个解决方案,因此在运行时实例化的任何 THTMlBaseControl 后代都将继承所有属性以及来自 TmyBaseControl 而不是来自 TControl 的方法。

我已经看到了破解VMT的方法,但也许还有其他解决方案并且还没有看到它。我已经完成了对NewInstance,ClassParent和TnstanceSize类方法的更改,但是我必须指定来自哪个类,显然我必须为每个继承的THTMLBaseControl类执行相同的步骤

为了所有人:这只是一个疑问,我需要组件是 TEdit、TPanel 等控件,由设计器 IDE 可见和编辑,我什至可以创建自己的 TControl 类,但我只是在想我是否可以重用已经存在的代码。

问候

不能在运行时更改类。一旦对象被实例化,它的类就是固定的。您可以破解对象以更改其 VMT 指针,使其引用不同的类,但这仍然无法解决您的主要问题,即内存使用情况 — 即使您更改 VMT 指针,对象的所有内存都已分配;更改 VMT 指针不会神奇地使对象占用更少的内存。

您可以做的第一件事就是停止从TControl下降。正如您所指出的,您不需要它提供的任何东西。您想要的只是可以在设计时放在窗体上以设置其属性的内容。为此,您所需要的只是 TComponent ,因此将其设为基类而不是TControl 。然后你会得到更像 TTimer 的东西,它没有 GUI。一旦你这样做了,你也不再需要TForm。相反,您可以将组件放在 TDataModule 上,该 是专门为在设计时管理非可视组件而设计的。

最新更新