2011-09-16 67 views
7

我已經創建了一個派生自TCustomPanel的組件。在該面板上,我有一個派生自TOwnedCollection的類的已發佈屬性。一切正常,單擊對象檢查器中該屬性的省略號可打開默認集合編輯器,我可以在該列表中管理TCollectionItems。如何在設計時調用組件的屬性編輯器

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

我還希望能夠在設計時雙擊面板並默認打開集合編輯器。我已經開始創建一個派生自TDefaultEditor的類並註冊它。

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

    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 

這似乎是在正確的時間進行運行,但我堅持就如何在那個時候推出面向集合的屬性編輯器。

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; 

任何解決方案或不同的方法將不勝感激。

回答

9

就我所知,您沒有使用正確的編輯器。 TDefaultEditor被如此描述:

提供了雙擊將通過尋找在最適當的方法財產屬性重複默認行爲編輯器編輯

這是響應編輯器通過使用新創建的事件處理程序將代碼編輯器放入代碼編輯器,雙擊表單。想想當你雙擊一個TButton會發生什麼情況,並且你被拖入OnClick處理程序。

自從我寫了一個設計時間編輯器(我希望我的記憶在今天工作)已經很長時間了,但我相信你的編輯器應該從TComponentEditor派生。要顯示收集編輯器,請撥打ColnEdit單元的ShowCollectionEditor

您可以覆蓋TComponentEditorEdit方法,並從那裏調用ShowCollectionEditor。如果你想更先進,作爲替代,你可以聲明一些動詞GetVerbCountGetVerbExecuteVerb。如果你這樣做,那麼你擴展上下文菜單,默認Edit執行將執行動詞0.

+1

從TComponentEditor派生並實現Get/ExecuteVerb來調用ShowCollectionEditor工作完美。非常感謝你。 – avenmore

+0

哇,我必須承認我有點驚訝,這真的很容易,這是從幾年前,當我最後做了這樣的事情! –

5

以下大衛的正確答案,我想提供完整的代碼,顯示CollectionEditor的UI的特定屬性控制何時在設計時雙擊它。

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

很好的例子!謝謝! – REALSOFO

相關問題