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

我需要从TControl继承该控件,因此在设计时我可以使用所有IDE设计器内容。

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

我还从THTMLBaseControl继承了所有控件,因此每个控件类都不能创建包装器类,因为它会重复很多代码。

因此,我需要的是在运行时,在实例化该类之前,我可以更改父类,以便将其基于另一个类似TControl的类进行实例化,该类可能像TControl那样从“ TComponent”继承的命名为TmyBaseControl,但不会具有所有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,因此使您的基类代替TControl。然后,您会得到更像TTimer的东西,它没有GUI。完成此操作后,您也将不再需要TForm。相反,您可以将组件放在TDataModule上,该CC是专门为在设计时管理非可视组件而设计的。

关于delphi - 如何在运行时在Delphi中更改继承类的父类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17617023/

10-14 07:22