【问题标题】:TFrame inheritance refactoringTFrame继承重构
【发布时间】:2010-10-09 23:55:12
【问题描述】:

我的另一个 TFrame IDE 注册组件问题。感谢所有的帮助,各位程序员。 :)

玩转 Darrian 的 TFrame 继承建议here

具体说明:

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

以这种方式“重构”TFrame 继承的最佳方式是什么? (这也可能适用于 TForm 类的后代,不确定)。有哪些注意事项和注意事项?

示例:

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

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

最后说明

我意识到这可能会很快变得一团糟,流式传输 DFM 文件和多代后代等......这也是我要求整体“需要注意的事项”概念方面的部分原因,而且给出一个特定的现实世界更简单版本的问题(在我看来,这应该是可行的)。

我已经创建了一个小测试包来尝试学习,并且正在学习很多东西,但它进展缓慢,并且非常感谢您的 Delphi“绝地大师”提供的任何指导/见解。 :)



稍后更新答案:

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

【问题讨论】:

    标签: delphi inheritance refactoring custom-component tframe


    【解决方案1】:

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

    【讨论】:

    • 我想我在 10 年内遇到过 3 次,每次都在这里结束......谢谢(再次)也许下次我会记得。
    【解决方案2】:

    我现在正在开发几个“姐妹” 将共享一个伟大的组件 处理现有组件的 非视觉功能和 特性。那么,有道理 把很多东西移到一个 新的父/超类 然后旧组件可以 继承自。

    “重构”的最佳方式是什么 TFrame继承是这样吗?

    您上面的文字的症结可能是“组件的非视觉功能”。因此,在这种情况下,恕我直言,最好将可视层和非可视层分开。

    所以,也许使用装饰器会更好:

    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 Form Inheritance(如 Darian 建议的那样)或(更灵活)您可以手动完成:使用 IDE 创建以下框架:TBaseFrame、TChildFrame1、TChildFrame2。 .. 等等。现在继续 TChildFrame1 的单元并手动将其类定义从 TChildFrame1 = class(TFrame) 更改为 TChildFrame1 = class(TBaseFrame)。编译。它应该工作。建议您在执行此技巧时将 TBaseFrame 设为空,以避免可能的小怪癖(功能冲突等)

    HTH。

    【讨论】:

    • 目前看来,“让 TBaseFrame 完全为空”是避免许多小故障的关键。还要确保 DFM 文件在以后的类中以“继承”而不是“对象”开头。也会考虑你的装饰器想法——谢谢!
    • “到目前为止,似乎“让 TBaseFrame 完全为空”是避免许多小故障的关键” - 是的。请记住,这是“设计使然”(IOW 不会改变)——Delphi 必须尽可能灵活——所以你可以很容易地在脚下开枪。这就是我说的更安全的原因。
    • 感谢您的想法:上面的装饰器方法等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多