如果我要替换VCL组件TXxx
,我应该将我的组件基于TXxx
还是TCustomXxx
?
我希望为各种文本编辑组件(TEdit
,TMemo
等)进行直接替换,让WM_PASTE处理程序清理后端的输入,这非常挑剔关于它将接受什么(基本上只有7位ASCII可打印字形,空格和CR / LF对......甚至不能接受制表符字符)。这些新组件必须进入现有的应用程序,我不想做任何我不必做的事情,以使它们完全按照旧的方式工作,除了非默认的粘贴行为。
我已根据TMemo
完成了一项工作,但它似乎有效,但不知怎的,我觉得推荐的方法是使用TCustomMemo
。有什么我想念的吗?
答案 0 :(得分:16)
按照惯例,TSomething和TCustomSomething之间的区别在于后者没有或只有很少的已发布属性,因此您可以选择自己发布哪些属性。否则应该没有任何区别。
答案 1 :(得分:1)
我总是理解拥有TSomething
和TCustomSomething
的概念,当你创建自己的继承时,让我们说TButton
给你自己的TMyBytton
。假设您要隐藏属性,例如Caption
(假设您可能不想要文本)。使用TButton
,您无法隐藏此属性。但是使用TCustomButton
,您可以发布要在对象检查器中显示的属性,并排除那些您不想看到的属性。一旦发布了一个属性,就不能在其他继承的类中发布它。
答案 2 :(得分:0)
TObject - > TPersistent - > TComponent - > TControl - > TWinControl - > TCustomEdit - > TCustomMemo - > TMemo
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很重要。通过这样做,您可以继续使用现有的标准控件,但在运行时,您的应用程序将实际使用您的子类控件。如果您有一个包含大量控件的现有应用程序,这可能是更改控件行为的更简单方法。