嗨,我正在开发一个 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
上,该 是专门为在设计时管理非可视组件而设计的。