您好,我正在开发 TControl 后代,我们将其命名为 THTMLBaseControl,在运行时该控件仅根据该控件的设置生成和输出 HTML 代码,因此基础 TControl 类和方法的所有附加属性,包括 Windows消息系统在运行时确实不使用,会造成内存开销。
我需要从 TControl 继承该控件,因此在设计时我可以使用所有 IDE 设计器的东西。
但在运行时几乎所有那些在设计时需要的属性我都不需要它们。
我的所有控件都继承自该 THTMLBaseControl,因此不能为每个控件类创建一个包装类,因为它会大量重复代码。
所以我需要的是在运行时,在类被实例化之前,我可以更改父类,因此它将基于另一个类似 TControl 的类进行实例化,可能命名为 TmyBaseControl 从“TComponent”继承,如 TControl 所做的那样,但是这不会有所有的 TControl 内存开销,只会有我的 THTMLBaseControl 所需的属性和方法。
我真的没有 rutime 的 GUI 是一个只提供 HTML 服务的 web 服务器,这是 intraweb 和 Raudus 做的事情,但问题总是所有都基于 TControl,所以它们必须在运行时创建时间并产生大量未使用的内存和进程开销。也许有一个解决方案,所以在运行时实例化的任何 THTMlBaseControl 后代都将从 TmyBaseControl 继承所有属性和方法,而不是从 TControl 继承。
我已经看到了破解 VMT 的方法,但也许还有其他解决方案,但还没有看到。我已经完成了对 NewInstance、ClassParent 和 TnstanceSize 类方法的更改,但我必须指定从哪个类开始,显然我必须为每个继承的 THTMLBaseControl 类执行相同的步骤
为了大家: 这只是一个疑问,我需要组件是像 TEdit、TPanel 这样的控件,由设计器 IDE 可见和可编辑我什至可以创建自己的 TControl 类,但我只是在想我是否可以重用已经存在的代码。
问候
最佳答案
您不能更改类的运行时间。一旦一个对象被实例化,它的类就固定了。您可以破解对象以更改其 VMT 指针,使其引用不同的类,但这仍然无法解决您的主要问题,即内存使用情况 — 即使您更改了 VMT 指针,所有对象的内存已经分配;更改 VMT 指针不会神奇地使对象占用更少的内存。
您可以做的第一件事是停止从 TControl
下降。正如您所指出的,您不需要它提供的任何东西。您想要的只是在设计时可以放在表单上以设置其属性的东西。为此,您只需要 TComponent
,所以将 that 设为您的基类,而不是 TControl
。然后你会得到更像 TTimer
的东西,它没有 GUI。完成此操作后,您也不再需要 TForm
。相反,您可以将组件放在 TDataModule
上,该组件专为在设计时管理非可视组件而设计。
关于delphi - 如何在 Delphi 运行时更改继承类的父类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617023/