8

如果我想更换一个 VCL 组件TXxx,我应该将我的组件建立在TXxxTCustomXxx吗?

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

我做了一个基于TMemo它似乎工作,但不知何故我有这样的印象,推荐的方法是使用TCustomMemo. 有什么我想念的吗?

4

4 回答 4

16

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

于 2012-06-11T22:35:48.520 回答
1

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

于 2012-06-13T01:14:04.037 回答
0

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

在此处输入图像描述

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

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

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

于 2012-06-12T15:00:02.190 回答