8

VCL コンポーネントを置き換えたい場合TXxx、コンポーネントをベースにする必要がありますTXxxTCustomXxx?

TEditさまざまなテキスト編集コンポーネント ( 、など)のドロップイン置換を作成TMemoして、WM_PASTE ハンドラーを使用して、受け入れるものについて非常にうるさいバックエンドへの入力をサニタイズすることを検討しています (基本的には 7 ビット ASCII 印刷可能のみ)。グリフ、スペース、および CR/LF ペア...タブ文字でさえ受け入れられません)。これらの新しいコンポーネントは既存のアプリケーションに組み込む必要があり、デフォルト以外の貼り付け動作を除いて、古いコンポーネントとまったく同じように機能させるために絶対に必要でないことは何もしたくありません。

私はに基づいて1つを実行しましたがTMemo、うまくいくようですが、どういうわけか、推奨されるアプローチはTCustomMemo. 足りないものはありますか?

4

4 に答える 4

16

慣例により、TSomething と TCustomSomething の違いは、後者には公開されたプロパティがまったくないか、ほとんどないため、公開するプロパティを自分で選択できることです。そうでなければ、違いはないはずです。

于 2012-06-11T22:35:48.520 に答える
1

TSomethingとを持つという概念を私が常に理解している方法は、 の独自TCustomSomethingの継承を作成するときです。次のようなプロパティを非表示にしたいとします (テキストが不要であると仮定します)。では、このプロパティを非表示にすることはできません。しかし、 を使用すると、オブジェクト インスペクタに表示したいプロパティを公開し、表示したくないプロパティを除外できます。プロパティが公開されると、さらに継承されたクラスで非公開にすることはできません。TButtonTMyByttonCaptionTButtonTCustomButton

于 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 句で、ユニット SubClassedControls を StdCtrls ユニットの後ろに追加することが重要です。これにより、既存の標準コントロールを引き続き使用できますが、実行時にアプリケーションは実際にサブクラス化されたコントロールを使用します。多くのコントロールを持つ既存のアプリケーションがある場合、これはコントロールの動作を変更するためのより簡単な方法かもしれません。

于 2012-06-12T15:00:02.190 に答える