我又问了一个TFrame IDE注册组件问题。谢谢你的帮助,各位程序员。:)
玩弄Darrian的TFrame继承建议这里
规范:
基本上,我有一个基于TFrame的组件,我已经注册到IDE中了,它运行得非常好。我现在正在开发一些“姐妹”组件,它们将共享大量现有组件的非可视功能和属性。因此,将其中许多内容转移到父类/超类中是有意义的,新的和旧的组件都可以从中继承。
以这种方式“重构”TFrame继承的最佳方法是什么?(这可能也适用于TForm级后代,但不确定)。什么是需要注意的警告和事情?
示例:
例如,我尝试创建一个没有任何内容的新TFrame,并调用该框架TMyBaseFrame。然后修改我现有组件的类定义(让我们称之为TMyFrameTreeView)来继承它,而不是TFrame。
它编译得很好,但是当我尝试将它放到表单上时,我得到了"ClientHeight未找到“(或"ClientHeight属性未找到”),并且它不会拖放到表单上。从相关的DFM中删除ClientHeight和ClientWidth会造成严重破坏,它们最终在调整大小时被替换。我注意到了子类中的ExplicitHeight和ExplicitWidth,我认为这与属性值重写来自继承值有关,但我不确定。通过new ->继承项重新创建一个全新的框架,然后复制所有内容,也没有产生很好的结果。
Final Note
我意识到这可能会很快变得凌乱,流DFM文件和多代后代,等等.这就是为什么我要求整体的“事情要注意”的概念方面,但也给出一个具体的现实世界更简单的版本问题(在我看来,应该是可行的)。
我已经创建了一个小测试包,可以在学习尝试中进行黑客攻击,而且我学到了很多东西,但是它进展得很慢,任何来自你们德尔菲“绝地大师”的指导和洞察力,都将是非常感谢的。:)
答案更新稍后:
以下两个答案都很有帮助。此外,创建一个“基本框架类”,它与普通的TFrame没有任何变化,然后在添加任何属性、方法等之前继承它,这似乎极大地稳定了继承流。不知道为什么,但到目前为止。
发布于 2009-02-26 05:03:21
除了将TMyFrameTreeView的基类更改为TMyBaseFrame之外,还将TMyFrameTreeView的dfm文件中的第一个单词从object更改为inherited。
发布于 2009-02-26 08:26:01
我现在正在开发一些“姐妹”组件,它们将共享大量现有组件的非可视功能和属性。因此,将其中许多内容转移到父类/超类中是有意义的,新的和旧的组件都可以从中继承。 以这种方式“重构”TFrame继承的最佳方法是什么?
以上文本的关键可能是“组件的非可视功能”。所以,在这种情况下,IMHO最好将可视层和非可视层分开.
所以,也许最好用一个装潢师:
TMySharedEngine = class(Whatever)
property LinkedFrame: TFrame;
property P1;
property P2;
...
procedure Proc1;
procedure Proc2;
... //etc.
end;在你的“姐妹”框架中使用它的实例:
var
TMyFrame1 = class(TFrame)
...
FDecorator: TMySharedEngine;
...
public
property MySharedPart: TMySharedEngine read FDecorator;
constructor Create(AOwner: TComponent); override;
...
end;
constructor TMyFrame1.(AOwner: TComponent); override;
begin
inherited;
FDecorator:=TMySharedEngine.Create; //ok, ok do not forget to Free it .Destroy
FDecorator.LinkedFrame:=Self;
...
end;OTOH,如果您想使用您的方法,您可以使用Visual继承(如Darian建议的那样)或(更灵活的)您可以手工完成它: Create,使用TBaseFrame,TChildFrame1,TChildFrame2 .等等,现在继续使用TChildFrame1 1的单元,手工将它的类定义从TChildFrame1 = class(TFrame)更改为TChildFrame1= class(TBaseFrame)。编译。应该管用的。不过,建议您在执行此操作时,TBaseFrame为空,以避免可能出现的小怪癖(功能冲突等)。
HTH。
https://stackoverflow.com/questions/589040
复制相似问题