【问题标题】:What base class to use when developing Delphi VCL component?开发 Delphi VCL 组件时使用什么基类?
【发布时间】:2012-06-14 20:21:08
【问题描述】:

如果我想替换一个 VCL 组件 TXxx,我应该将我的组件基于 TXxx 还是 TCustomXxx

我希望对各种文本编辑组件(TEditTMemo 等)进行直接替换,以使用 WM_PASTE 处理程序来清理后端的输入,该后端对它将做什么非常挑剔接受(基本上只有 7 位 ASCII 可打印字形、空格和 CR/LF 对……甚至制表符也不可接受)。这些新组件必须进入现有应用程序,我不想做任何我绝对不必做的事情,以使它们完全按照旧组件的方式工作,除了非默认粘贴行为。

我已经根据TMemo 做了一个,它似乎可以工作,但不知何故我觉得推荐的方法是使用TCustomMemo。有什么我遗漏的吗?

【问题讨论】:

    标签: delphi vcl


    【解决方案1】:

    按照惯例,TSomething 和 TCustomSomething 之间的区别在于后者没有或只有很少的已发布属性,因此您可以选择自己发布哪些属性。否则应该没有任何区别。

    【讨论】:

    • 谢谢,这正是我希望听到的。
    【解决方案2】:

    我一直理解拥有TSomethingTCustomSomething 概念的方式是,当您创建自己的继承时,比如说TButton 到您自己的称为TMyBytton。假设您想隐藏一个属性,例如Caption(假设您可能不需要文本)。使用TButton,您无法隐藏此属性。但是使用TCustomButton,您可以发布您希望在对象检查器中可见的属性,并排除那些您不想看到的属性。属性一旦发布,就不能在后续继承的类中取消发布。

    【讨论】:

      【解决方案3】:

      TObject -> TPersistent -> TComponent -> TControl -> TWinControl -> TCustomEdit -> TCustomMemo -> TMemo

      TMemo 只是 TCustomMemo 控件的“包装器”。两者都可以使用,但我喜欢使用自定义版本,因为您从非可视组件派生。

      如果您想在未来的项目中替换组件,您可以围绕控件构建一个数据模块并在数据模块中管理其属性。替换后,您只需更改数据模块处理组件的方式,而不是项目中的每个组件。

      【讨论】:

        【解决方案4】:

        另一种选择是像这样简单地对各个组件进行子类化:

        unit SubClassedControls;
        
        interface
        
        uses StdCtrls, Messages;
        
        type
        
          TEdit = class(StdCtrls.TEdit)
          private
            procedure WMPaste(Message: TWMPaste); message WM_PASTE;
          end;
        
        implementation
        
        { TEdit }
        
        procedure TEdit.WMPaste(Message: TWMPaste);
        begin
          // do whatever is necessary
        end;
        
        end.
        

        那么重要的是在表单的uses子句中的StdCtrls单元后面添加单元SubClassedControls。通过这样做,您可以继续使用现有的标准控件,但在运行时您的应用程序将实际使用您的子类控件。如果您有一个包含大量控件的现有应用程序,这可能是更改控件行为的一种更简单的方法。

        【讨论】:

        • -1 因为您没有阅读问题。你建议完全按照我所说的去做,而没有注意我不理解的部分。
        • @wades,对不起,我的回答只是为了回应“......我不想做任何我绝对不需要做的事情,以使它们完全按照旧的方式工作做了,除了非默认的粘贴行为。”。而且我仍然认为我的解决方案对于您手头的问题来说是最简单的。当然,您可以使用从 TCustomEdit 等派生的自己的 TMyEdit 交换数百个控件,但这在 IMO 中要麻烦得多。
        猜你喜欢
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 2018-12-25
        • 2012-03-25
        • 1970-01-01
        • 2014-11-06
        • 1970-01-01
        • 2012-02-26
        相关资源
        最近更新 更多