开发 Delphi VCL 组件时应使用哪个基类?

8
如果我想替换一个VCL组件TXxx,我应该基于TXxx还是TCustomXxx来创建我的组件?
我想制作各种文本编辑组件的插件替代品(TEditTMemo等),以具有WM_PASTE处理程序,以对非常挑剔的后端进行输入清理,只接受基本上只有7位ASCII可打印字形、空格和CR / LF对...甚至制表符对其也不可接受。这些新组件必须放入现有应用程序中,并且我希望除了非默认粘贴行为之外,不做任何绝对必要的事情,使它们完全按照旧组件的方式工作。
我已经基于TMemo完成了一个组件,看起来似乎可以工作,但我有一种印象,即推荐的方法是使用TCustomMemo。我错过了什么吗?
4个回答

16

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


谢谢,这正是我所希望听到的。 - wades

1
我一直理解拥有TSomethingTCustomSomething的概念是,当你创建自己的继承,比如说从TButton到你自己的TMyButton。假设你想隐藏一个属性,比如Caption(假设你可能不想要文本)。使用TButton,你无法隐藏这个属性。但是使用TCustomButton,你可以发布任何你想在对象检查器中看到的属性,并排除那些你不想看到的属性。一旦一个属性被发布,它就不能在后续继承类中取消发布。

0

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

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

enter image description here

TMemo只是TCustomMemo控件的“包装器”。你可以同时使用两者,但我喜欢使用Custom版本,因为你可以从非可视组件派生。

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


-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子句中将unit SubClassedControls添加到StdCtrls unit之后。通过这样做,您可以继续使用现有的标准控件,但是在运行时,您的应用程序实际上将使用您的子类控件。如果您有大量控件的现有应用程序,这可能是更改控件行为的一种更简单的方法。


-1 是因为你没有读懂问题。你建议做我所说的事情,却没有注意到我不理解的部分。 - wades
@wades,抱歉,我的回答只是针对“...我想尽可能不做任何事情,除非我必须完全使它们的工作方式与旧的完全相同,除了非默认粘贴行为。”。我仍然认为,对于你手头的问题,我的解决方案是最简单的。当然,你可以用自己的TMyEdit替换数百个控件,派生自TCustomEdit等,但在我看来,这要麻烦得多。 - iamjoosy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接