【发布时间】: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,我的错。我假设
TControl是TCustomControl的后裔。我以前从未使用过它,所以我现在检查了一下。你是对的,TComponent是去这里的最佳方式。 -
@Lightbulb 我并不懒惰,这只是一个问题,如果“它可以用另一种方式完成”,我也可以从 TControl 复制所有代码并创建我的,或者只是让包装器下降从 TComponent 并通过 TControl.Canvas 在设计器中显示它。这只是一个关于是否可以完成或“有其他方法”的简单问题,我需要编辑控件,例如调整为 TEdit 的大小。只是想尽可能重用代码,否则我会找到自己的方式。 TBaseHTMLControl 是一个例子来说明我的怀疑。感谢赐教
标签: delphi inheritance parent