2012-02-24 11 views
7

Yayımlanan özelliklerinin, Object Inspector'ın en üst düzeyinde olmayan bir kategori altında olması için görsel olmayan bileşenimi istiyorum.Bileşenimin özelliklerini Object Inspector'da nasıl gruplandırırım?

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; 

nasıl bileşen MyProperties gibi bir şey adlı bir kategori altında birdeğer ve SomeValueExt ile nesne denetleyici kayıt alabilirim:

aşağıda bir örneği ele alalım?

İllüstrasyon:

enter image description here

Benim bileşen potansiyel olarak yayınlanan çok sayıda mülk olabilir ve ben bunun yerine gibi yaygın özelliklerinden uzak tutmak için Nesne Müfettişi orada kendi seviyesi alt kategorisi altına girdi ediyorum İsim ve Etiket.

Teşekkür :)

+0

Nesne Denetçisi tarafından kullanılan Kategori teriminden mi bahsediyorsunuz? OI'ye sağ tıklayıp "Kategoriye göre Görüntüle" yi seçebileceğiniz özellik budur. –

+0

Örnek olarak, TForm veya başka bir bileşene tıkladığınızda, bazı özellikler Çapalar, BorderIcons ve Yazı Tipi vb.Bazı özelliklerin ebeveynleri var, eğer bu mantıklıysa, istiyorum. –

+0

'Anchors' ve' BorderIcons' kümeleridir. Bunu istemiyorsun. 'Font' özelliği bir sınıftır. Böylece alt özelliklerinizi bir sınıfa sarın ve ardından istediğiniz davranışa ücretsiz sahip olabilirsiniz. –

cevap

17

bu özelliklere sahip bir sınıf oluşturun ve sonra bileşen o sınıf türünde bir tek özelliğini verir. mülkiyet sınıfı TPersistent soyundan olmalıdır:

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; 

bileşeni olan mülkiyet nesneyi sahiptir, bu yüzden oluşturulan ve yok edilmelidir: o kod ile

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

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

, bileşenin özelliklerini şimdi listelenmiş olmalıdır "Özellikler" öğesi altında. Yine de, kategori değil. Kategoriler tamamen başka bir şey. Kategoriler bileşeni yeniden düzenlemez; Object Inspector'da, özelliklerin görüntülenme şeklini değiştirirler. Benim kodumla, TMyComponent artık hiçbir SomeValue mülküne sahip olmadığını unutmayın. Bunun yerine, Properties ve numaralı bir özelliğin, nesnesinin başka özellikleri vardır. Bunun, bileşeninizin tüketicilerinin buna erişmek zorunda olmalarını gerçekten isteyip istemediğinizi düşünün.


Properties özelliği salt okunur değilse, o zaman bir özellik ayarlayıcı olması gerekir; doğrudan FProperties'a yazamazsınız. Bu şekilde yaz: Biz de mülkiyet nesnenin özelliklerini salt okunur olmadığını varsayıyoruz

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

: Ayrıca doğru olanı yapmak için Assign yöntemini geçersiz gerektirir

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

ya da. Özellik nesnesinin özellikleri değiştiğinde, sahip olan nesne muhtemelen bunu bilmek isteyecektir, bu nedenle bileşenin bir değer atadığı bir olaya sahip olması gerekir. Özellikler değiştiğinde, etkinliği tetiklerler.

+0

Bilgi için teşekkürler, bu kategoriyi en iyi açıklayamayacağımı hissettim. Ben kişisel kullanım için Delphi kullanıyorum, bu yüzden gerçekten benim bileşenimi kullanan başka biri olmayacak, ancak gelecekte birisinin kullanmak için her zaman düşünmeye değer. Teşekkürler :) –

+1

"Bileşeninizin tüketicileri" dediğimde, bu size * dahil oldu. Her zaman "Properties.SomeValue" yazmak istiyor musunuz? –

+0

Endişelenme, her şeyi kontrol etmem için bana şans ver ve önce anladığımdan emin ol! :) –

İlgili konular