2011-09-16 12 views
7

TCustomPanel'den türetilen bir bileşen oluşturdum. Bu panelde, TOwnedCollection'dan türetilmiş bir sınıfın yayınlanmış mülküm var. Her şey iyi çalışıyor ve nesne denetçisinde üç noktaya tıklayarak bu özellik listede bulunan TCollectionItems'i yönetebileceğim varsayılan koleksiyon editörünü açar. Ben de muktedir istiyorumBir bileşenin özellik düzenleyicisinin tasarım zamanında çağrılması nasıl yapılır?

TMyCustomPanel = class(TCustomPanel) 
    private 
    ... 
    published 
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection; 
    end; 

tasarım zamanında panelde çift tıklayın ve toplama editörü varsayılan olarak açmak var. TDefaultEditor'dan türetilen bir sınıf oluşturarak ve kaydettirerek başladım.

TMyCustomPanelEditor = class(TDefaultEditor) 
    protected 
    procedure EditProperty(const PropertyEditor: IProperty; var Continue: Boolean); override; 
    end; 

    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 

Bu doğru zamanda çalıştırılacak görünüyor, ama ben o zaman toplama özelliği editörü başlatmak için nasıl şaşırıp.

procedure TMyCustomPanelEditor.EditProperty(const PropertyEditor: IProperty; var Continue: Boolean); 
begin 
    inherited; 

    // Comes in here on double-click of the panel 
    // How to launch collection editor here for property MyOwnedCollection? 

    Continue := false; 
end; 

herhangi bir çözelti ya da farklı bir yaklaşım

takdir.

cevap

9

Anlatabildiğim kadarıyla doğru düzenleyiciyi kullanmıyorsunuz. TDefaultEditor şöyle tarif edilmektedir:

en uygun yöntem özelliğini görünümlü özelliklerini yinelemek edecektir çift tıklama için varsayılan davranış sağlar bir editör

düzenlemek için bu yanıt veren editör Yeni oluşturulmuş olay işleyicisiyle kod düzenleyicisine bırakarak formdaki çift tıklamaları. Bir TButton öğesini çift tıklattığınızda ve OnClick işleyicisine düştüğünüzde ne olacağını düşünün.

Tasarım zamanı editörü yazdığımdan beri çok uzun zaman geçti (umarım hafızam bugün çalışıyordur) ama editörünüzün TComponentEditor türetilmiş olması gerektiğine inanıyorum. Koleksiyon editörünü göstermek için ShowCollectionEditor'u ColnEdit biriminden arayın.

TComponentEditorEdit yöntemini geçersiz kılabilir ve buradan ShowCollectionEditor numaralı telefonu arayabilirsiniz. Daha gelişmiş olmak istiyorsanız, alternatif olarak, bazı fiilleri GetVerbCount, GetVerb ve ExecuteVerb ile bildirebilirsiniz. Bu şekilde yaparsanız, bağlam menüsünü genişletirsiniz ve varsayılan Edit uygulaması, fiil 0'ı yürütür.

+1

TComponentEditor'dan türetme ve ShowCollectionEditor'ı çağırmak için Get/ExecuteVerb'yi uygulamak mükemmel bir şekilde çalıştı. Çok teşekkür ederim. – avenmore

+0

Vay, itiraf etmeliyim ki, gerçekten bu kadar kolay bir şey olduğunu anladım. –

5

David'in doğru yanıtını takiben, bir Arayüzün belirli bir özelliği için CollectionEditor öğesini gösteren tamamlanmış kodu sağlamak istiyorum Tasarım zamanında çift tıklandığında kontrol edilir.

type 
    TMyCustomPanel = class(TCustomPanel) 
    private 
    ... 
    published 
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection; 
    end; 


    TMyCustomPanelEditor = class(TComponentEditor) 
    public 
    function GetVerbCount: Integer; override; 
    function GetVerb(Index: Integer): string; override; 
    procedure ExecuteVerb(Index: Integer); override; 
    end; 


procedure Register; 
begin 
    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 
end; 

function TMyCustomPanelEditor.GetVerbCount: Integer; 
begin 
    Result := 1; 
end; 

function TMyCustomPanelEditor.GetVerb(Index: Integer): string; 
begin 
    Result := ''; 
    case Index of 
    0: Result := 'Edit MyOwnedCollection'; 
    end; 
end; 

procedure TMyCustomPanelEditor.ExecuteVerb(Index: Integer); 
begin 
    inherited; 
    case Index of 
    0: begin 
      // Procedure in the unit ColnEdit.pas 
      ShowCollectionEditor(Designer, Component, TMyCustomPanel(Component).MyOwnedCollection, 'MyOwnedCollection'); 
     end; 
    end; 
end; 
+0

İyi örnek! Teşekkür ederim! – REALSOFO

İlgili konular