2012-02-24 6 views
7

Object Inspectorのトップレベルではないカテゴリの下に、パブリッシュされたプロパティが表示されるように非表示にするコンポーネントが必要です。オブジェクトインスペクタでコンポーネントのプロパティをグループ化するにはどうすればよいですか?

enter image description here

type 
    TMyComponent = class(TComponent) 
    protected 
    function GetSomeValue: string; 
    function GetSomeValueExt: string; 
    published 
    property SomeValue: string read GetSomeValue; 
    property SomeValueExt: string read GetSomeValueExt; 
    end; 

procedure Register; 

implementation 

procedure Register; 
begin 
    RegisterComponents('My Component', [TMyComponent]); 
end; 

function TMyComponent.GetSomeValue: string; 
begin 
    Result := 'test'; 
end; 

function TMyComponent.GetSomeValueExt: string; 
begin 
    Result := 'extended..'; 
end; 

がどのように私は私のコンポーネントがMyPropertiesのようなものというカテゴリの下にsomeValueのとSomeValueExtとオブジェクトインスペクタに登録してもらうん:

は、以下の例を見てみましょうか?

イラスト:

enter image description here

私のコンポーネントは、潜在的にパブリッシュプロパティの多くを持っている可能性があり、私はむしろ、彼らのような共通の特性から離れて、それを維持するためにオブジェクトインスペクタのが自分のレベルのサブカテゴリの下に行ってきましたでしょう名前とタグ。

感謝:)

+0

オブジェクトインスペクタで使用されるカテゴリ用語についてお話ししていますか?これは、OIを右クリックして「カテゴリ別に表示」を選択する機能です。 –

+0

TFormなどのコンポーネントをクリックすると、Anchors、BorderIcons、Fontなどのカテゴリの下にあるプロパティが表示されます。私はそれが理にかなっている場合、私の財産のいくつかが自分の両親を持つことを望みます。 –

+0

AnchorsとBorderIconsはセットです。あなたはそれを望んでいません。 'Font'プロパティはクラスです。だから、クラス内でサブプロパティをラップして、あなたが自由に望む動作を得ることができます。 –

答えて

17

これらのプロパティを持つクラスを作成し、コンポーネント、そのクラス型の単一のプロパティを与えます。それが作成され、破棄される必要があるように、コンポーネントは、そのプロパティのオブジェクトを所有している

type 
    TComponentProperties = class(TPersistent) 
    private 
    function GetSomeValue: string; 
    function GetSomeValueExt: string; 
    published 
    property SomeValue: string read GetSomeValue; 
    property SomeValueExt: string read GetSomeValueExt; 
    end; 

    TMyComponent = class(TComponent) 
    private 
    FProperties: TComponentProperties; 
    public 
    constructor Create(AOwner: TComponent); override; 
    destructor Destroy; override; 
    published 
    property Properties: TComponentProperties read FProperties; 
    end; 

:プロパティクラスは、TPersistent子孫すべきことは、コード付き

constructor TMyComponent.Create; 
begin 
    inherited; 
    FProperties := TComponentProperties.Create; 
end; 

destructor TMyComponent.Destroy; 
begin 
    FProperties.Free; 
    inherited; 
end; 

を、コンポーネントのプロパティは現在、一覧表示されます「プロパティ」項目の下に表示されます。しかしカテゴリではありません。カテゴリはまったく別のものです。カテゴリはコンポーネントを再配置しません。オブジェクトインスペクタでプロパティがと表示される方法を変更するだけでと表示されます。私のコードでは、TMyComponentにはもうSomeValueというプロパティがありません。代わりに、Propertiesという1つのプロパティがあり、オブジェクトには他のプロパティがあります。それが実際にあなたのコンポーネントの消費者がそれにアクセスする必要があるかどうかを検討してください。


Propertiesプロパティは読み取り専用でない場合、それは、プロパティのセッターを持っている必要があります。 FPropertiesに直接書き込むことはできません。このようにそれを書く:我々はまた、プロパティオブジェクトのプロパティは読み取り専用されていないことを想定している

procedure TComponentProperties.Assign(Other: TPersistent); 
begin 
    if Other is TComponentProperties then begin 
    SomeValue := TComponentProperties(Other).SomeValue; 
    SomeValueEx := TComponentProperties(Other).SomeValueEx; 
    end else 
    inherited; 
end; 

:また、あなたが正しいことを行うためのAssignメソッドをオーバーライドする必要があり

procedure TMyComponent.SetProperties(const Value: TProperties); 
begin 
    FProperties.Assign(Value); 
end; 

を、どちらか。プロパティーオブジェクトのプロパティーが変更されると、所有しているオブジェクトはおそらくそれを知りたいので、コンポーネントが値を割り当てるイベントが必要です。プロパティが変更されると、イベントがトリガーされます。

+0

情報をいただきありがとうございます、私は気分のカテゴリは、これを説明していない可能性があります。私は個人的な使用のためにDelphiを使用していますので、私のコンポーネントを使用する他の誰かになることはありませんが、将来誰かがそれを使用するかどうかは常に検討する価値があります。ありがとう:) –

+1

私は "あなたのコンポーネントの消費者"と言いました。 *あなたはいつも 'Properties.SomeValue'と打ちますか? –

+0

私が行っていたことを心配しないで、私にそれをすべてチェックし、最初にそれを理解する機会を与えてください! :) –

関連する問題