首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Delphi中在运行时更改继承类的父类?

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

Stack Overflow用户
提问于 2013-07-12 14:15:51
回答 1查看 1.1K关注 0票数 3

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

我需要从TControl继承该控件,所以在设计时我可以使用所有的inherited工具。

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

我还继承了从那个THTMLBaseControl继承的所有控件,所以每个控件类创建一个包装类不是一个选项,因为它会经常重复代码。

所以,我需要的是,在运行时,在类实例化之前,我可以更改父类,以便它将基于另一个类似TControl的类实例化,可能像TmyBaseControl那样从"TComponent“继承来的,但它不会占用所有TControl内存,并且只具有我的THTMLBaseControl所需的属性和方法。

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

我已经看到了破解VMT的方法,但是也许还有其他的解决方案,而且还没有看到。我已经更改了NewInstance、ClassParent和TnstanceSize类方法,但是我必须从哪个类中指定,而且很明显,我必须为每个继承的THTMLBaseControl类执行相同的步骤。

为了一切:这只是一个疑问,我需要组件是像TEdit、TPanel这样的控件,可以被designer IDE看到和编辑--我甚至可以创建自己的TControl类,但我只是在考虑是否可以重用已经存在的代码。

问候

EN

回答 1

Stack Overflow用户

发布于 2013-07-12 14:31:48

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

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17617023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档