0

DelphiのVCLには、非常に便利なクラスCustomControlがあります。このクラスは、Controlの直接の基本クラスであり、C#WFのUserControlと同等です。

VCLに精通していない人にとって、CustomControlはControlとほとんど変わりません。主な違いは、ほとんどのプロパティが保護されていることです。新しいコントロールを実装するとき、開発者は、公開するコントロールと非表示のままにするコントロールを決定できます。

Windowsフォーム用に独自のコントロールを開発していて、いくつかのプロパティとイベントを非表示にしたい。たとえば、MouseDownイベントを公開したくありません。代わりに、コントロールの要素をクリックしてキャプチャすることを許可します。

WindowsフォームにVCLのCustomControlに相当するものはありますか?そうでない場合、どうすれば不要なパブリックプロパティとイベントを自分のコントロールで非表示にできますか?


回答に応じて:

これはセキュリティの問題ではなく、コードの優雅さの問題です。Delphiでは、CustomControlから派生し、OnMouseDownイベントを保護したままにして(C#の保護のように)、コントロールのユーザーに次のように伝えます。

OnMouseDownがないため、使用できません。ユーザーがコントロールをクリックしたことに反応したい場合は、OnElementClickedを使用するだけです。クリックされた要素とその状態に関する詳細情報も取得できます。

Hans Passantが提案したように、MouseDownイベントの呼び出しを無効にすることもできますが、その場合は、コントロールのユーザーマニュアルに次の内容を含める必要があります。

OnMouseDownメソッドをオーバーライドして、MouseDownイベントが呼び出されないようにするため、MouseDownイベントは使用しないでください。これは、コントロールのロジックがそのように設計されているため、OnMouseDownではなくOnElementClickedを使用する必要があるためです。MouseDownが機能しないため、コントロールを批判しないでください。これは仕様によるものであるため、バグとして報告しないでください。コントロールのロジックが破損する可能性があるため、クラスを継承して手動でMouseDownイベントを呼び出すことにより、MouseDownの問題を修正する方法を説明するメッセージをフォーラムに投稿したりブログエントリを作成したりしないでください。罪状認否...くそったれ、そう言った!

誰かが実際に私のコントロールを継承している場合-私は、彼が何をしているのかを知っていると思います(また、私のコントロールの内部ロジックにもアクセスできるためです)。しかし、誰かが私のコントロールを使用するだけの場合は、これらのプロパティ、イベント、およびメソッドのみを彼に提供します。これは、設計どおりに機能すると確信しています。

それが私の動機を説明することを願っています:)

4

1 に答える 1

0

Delphiが行うと私が想定しているように、非表示にすること、あなたが要求したことと、アクセスできないようにすることには、根本的な違いがあります。非表示は簡単です。宣言を繰り返して属性を適用するだけです。

using System;
using System.ComponentModel;
using System.Windows.Forms;

class MyControl : Control {
    [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
    private new event MouseEventHandler MouseDown;
}

これにより、イベントが[プロパティ]ウィンドウに表示されなくなり、IntelliSenseドロップダウンに表示されず、コードでイベントを割り当てようとするとコンパイルエラーが生成されます。

ただし、クライアントプログラマーがとにかく制限を回避できなかったことを絶対的に保証するものではありません。たとえば、クラスをキャストまたはオーバーライドします。しかし、究極のバックドアはIMessageFilterインターフェースを実装することであり、それについては何もできません。したがって、エレガンスが目標である場合、これで十分なはずです。

于 2012-11-28T14:22:18.953 に答える