首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TFrame继承重构

TFrame继承重构
EN

Stack Overflow用户
提问于 2009-02-26 03:56:45
回答 2查看 3.6K关注 0票数 4

我又问了一个TFrame IDE注册组件问题。谢谢你的帮助,各位程序员。:)

玩弄Darrian的TFrame继承建议这里

规范:

基本上,我有一个基于TFrame的组件,我已经注册到IDE中了,它运行得非常好。我现在正在开发一些“姐妹”组件,它们将共享大量现有组件的非可视功能和属性。因此,将其中许多内容转移到父类/超类中是有意义的,新的和旧的组件都可以从中继承。

以这种方式“重构”TFrame继承的最佳方法是什么?(这可能也适用于TForm级后代,但不确定)。什么是需要注意的警告和事情?

示例:

例如,我尝试创建一个没有任何内容的新TFrame,并调用该框架TMyBaseFrame。然后修改我现有组件的类定义(让我们称之为TMyFrameTreeView)来继承它,而不是TFrame。

它编译得很好,但是当我尝试将它放到表单上时,我得到了"ClientHeight未找到“(或"ClientHeight属性未找到”),并且它不会拖放到表单上。从相关的DFM中删除ClientHeight和ClientWidth会造成严重破坏,它们最终在调整大小时被替换。我注意到了子类中的ExplicitHeight和ExplicitWidth,我认为这与属性值重写来自继承值有关,但我不确定。通过new ->继承项重新创建一个全新的框架,然后复制所有内容,也没有产生很好的结果。

Final Note

我意识到这可能会很快变得凌乱,流DFM文件和多代后代,等等.这就是为什么我要求整体的“事情要注意”的概念方面,但也给出一个具体的现实世界更简单的版本问题(在我看来,应该是可行的)。

我已经创建了一个小测试包,可以在学习尝试中进行黑客攻击,而且我学到了很多东西,但是它进展得很慢,任何来自你们德尔菲“绝地大师”的指导和洞察力,都将是非常感谢的。:)

答案更新稍后:

以下两个答案都很有帮助。此外,创建一个“基本框架类”,它与普通的TFrame没有任何变化,然后在添加任何属性、方法等之前继承它,这似乎极大地稳定了继承流。不知道为什么,但到目前为止。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-02-26 05:03:21

除了将TMyFrameTreeView的基类更改为TMyBaseFrame之外,还将TMyFrameTreeView的dfm文件中的第一个单词从object更改为inherited

票数 12
EN

Stack Overflow用户

发布于 2009-02-26 08:26:01

我现在正在开发一些“姐妹”组件,它们将共享大量现有组件的非可视功能和属性。因此,将其中许多内容转移到父类/超类中是有意义的,新的和旧的组件都可以从中继承。 以这种方式“重构”TFrame继承的最佳方法是什么?

以上文本的关键可能是“组件的非可视功能”。所以,在这种情况下,IMHO最好将可视层和非可视层分开.

所以,也许最好用一个装潢师:

代码语言:javascript
运行
复制
TMySharedEngine = class(Whatever)
property LinkedFrame: TFrame;
property P1;
property P2;
...
procedure Proc1;
procedure Proc2;
... //etc.
end;

在你的“姐妹”框架中使用它的实例:

代码语言:javascript
运行
复制
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。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/589040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档