2

嗨,我正在开发一个 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 类,但我只是在想我是否可以重用代码已经存在。

问候

4

1 回答 1

10

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

你能做的第一件事就是停止从TControl. 正如您所指出的,您不需要它提供的任何东西。您想要的只是在设计时可以放在表单上以设置其属性的东西。为此,TComponent您只需要TControl. 然后你会得到更像 的东西TTimer,它没有 GUI。一旦你这样做了,你也不再需要TForm了。相反,您可以将您的组件放在一个TDataModule专为在设计时管理非可视组件而设计的组件上。

于 2013-07-12T14:31:48.707 回答