【问题标题】:How to change the parent class of an inherited class at runtime in Delphi?如何在 Delphi 运行时更改继承类的父类?
【发布时间】:2013-07-11 02:53:45
【问题描述】:

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

问候

【问题讨论】:

  • 您提出的建议不是解决问题的方法,即使有可能。您主要关心的是开销吗?你有多少个这个对象的实例?你知道TComponent后代的属性会出现在设计器中吗?
  • 你为什么要使用 TCustomControl,@Lightbulb? TCustomControl 与 TConrol 相同,除了它有 更多 东西,特别是窗口句柄和画布。
  • 那真是大错特错。说的不够详细,您是否考虑过 THTMLControlConfigComponent 用于设计时行为,然后根据它的设置实例化您的控件?
  • @RobKennedy,我的错。我假设TControlTCustomControl 的后裔。我以前从未使用过它,所以我现在检查了一下。你是对的,TComponent 是去这里的最佳方式。
  • @Lightbulb 我并不懒惰,这只是一个问题,如果“它可以用另一种方式完成”,我也可以从 TControl 复制所有代码并创建我的,或者只是让包装器下降从 TComponent 并通过 TControl.Canvas 在设计器中显示它。这只是一个关于是否可以完成或“有其他方法”的简单问题,我需要编辑控件,例如调整为 TEdit 的大小。只是想尽可能重用代码,否则我会找到自己的方式。 TBaseHTMLControl 是一个例子来说明我的怀疑。感谢赐教

标签: delphi inheritance parent


【解决方案1】:

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

您可以做的第一件事是停止从TControl 下降。正如您所指出的,您不需要它提供的任何东西。您想要的只是在设计时可以放在表单上以设置其属性的东西。为此,您只需要TComponent,所以将that 设为您的基类,而不是TControl。然后你会得到更像TTimer 的东西,它没有GUI。完成此操作后,您也不再需要 TForm。相反,您可以将您的组件放在 TDataModule 上,它专门用于在设计时管理非可视组件。

【讨论】:

  • 谢谢,这只是一个疑问,我需要组件是像 TEdit、tpanel 这样的控件,由设计器 IDE 可见和可编辑我什至可以创建自己的 tControl 类,但我只是想如果我可以重用已经存在的代码。问候
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 2015-11-25
相关资源
最近更新 更多