您好我正在开发一个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类,但我只是想我是否可以重用已经存在的代码。
此致
答案 0 :(得分:10)
您无法在课程中更改课程。实例化对象后,其类将被修复。您可以破解对象以更改其VMT指针,使其引用另一个类,但这仍然无法解决您的主要问题,即内存使用情况 - 即使您更改了VMT指针,所有已经分配了对象的内存;更改VMT指针并不会神奇地使对象占用更少的内存。
您可以做的第一件事是停止从TControl
下降。正如您所指出的,您不需要它提供的任何东西。您想要的只是在设计时可以放在表单上以设置其属性。为此,您只需要TComponent
,因此请 您的基类而不是TControl
。然后你会得到更像TTimer
的东西,它没有GUI。完成后,您也不再需要TForm
。相反,您可以将组件放在TDataModule
上,该{{1}}专门用于在设计时管理非可视组件。