开发Delphi VCL组件时使用什么基类?

时间:2012-06-11 22:33:04

标签: delphi vcl

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

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

我已根据TMemo完成了一项工作,但它似乎有效,但不知怎的,我觉得推荐的方法是使用TCustomMemo。有什么我想念的吗?

4 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:1)

我总是理解拥有TSomethingTCustomSomething的概念,当你创建自己的继承时,让我们说TButton给你自己的TMyBytton 。假设您要隐藏属性,例如Caption(假设您可能不想要文本)。使用TButton,您无法隐藏此属性。但是使用TCustomButton,您可以发布要在对象检查器中显示的属性,并排除那些您不想看到的属性。一旦发布了一个属性,就不能在其他继承的类中发布它。

答案 2 :(得分:0)

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

enter image description here

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

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

答案 3 :(得分:-1)

另一种选择是简单地将各个组件子类化为:

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很重要。通过这样做,您可以继续使用现有的标准控件,但在运行时,您的应用程序将实际使用您的子类控件。如果您有一个包含大量控件的现有应用程序,这可能是更改控件行为的更简单方法。