2011-09-16 7 views
7

Ho creato un componente derivato da TCustomPanel. Su quel pannello ho una proprietà pubblicata di una classe derivata da TOwnedCollection. Funziona tutto bene e facendo clic sui puntini di sospensione nell'Ispettore oggetti per quella proprietà si apre l'editor di raccolta predefinito in cui posso gestire i TCollectionItems nell'elenco.Come richiamare l'editor di proprietà di un componente in fase di progettazione

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

Vorrei anche essere in grado di fare doppio clic sul pannello in fase di progettazione e hanno l'editor collezione aprirsi per impostazione predefinita. Ho iniziato creando una classe derivata da TDefaultEditor e registrandola.

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

    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 

Questo sembra essere eseguito al momento giusto, ma mi sono bloccato su come avviare l'editor di proprietà per la raccolta in quel momento.

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; 

Qualsiasi soluzione o approccio diverso sarebbe apprezzato.

risposta

9

Non si sta utilizzando l'editor corretto, per quanto ne so. TDefaultEditor è descritto così:

Un editor che fornisce il comportamento di default per il doppio clic che iterazioni sulle proprietà alla ricerca della proprietà metodo più appropriato per modificare

Si tratta di un editor che risponde alle doppio clic sul modulo facendoti cadere nell'editor di codice con un gestore di eventi appena creato. Pensa a cosa succede quando fai doppio clic su un TButton e ti ritrovi nel gestore OnClick.

E 'passato molto tempo da quando ho scritto un editor del tempo di progettazione (spero che la memoria funzioni oggi) ma credo che il tuo editor debba essere derivato da TComponentEditor. Per mostrare l'editor della raccolta, chiamare ShowCollectionEditor dall'unità ColnEdit.

È possibile ignorare il metodo Edit di TComponentEditor e chiamare il numero ShowCollectionEditor da lì. Se vuoi essere più avanzato, in alternativa puoi dichiarare alcuni verbi con GetVerbCount, GetVerb e ExecuteVerb. Se lo fai in questo modo, estendi il menu contestuale e l'implementazione Edit predefinita eseguirà verbo 0.

+1

Derivando da TComponentEditor e implementando Get/ExecuteVerb per chiamare ShowCollectionEditor ha funzionato perfettamente. Grazie mille. – avenmore

+0

Wow, devo ammettere che sono un po 'sorpreso che sia stato così facile, è stato letteralmente secoli fa quando ho fatto l'ultima volta qualcosa del genere! –

5

In seguito alla risposta corretta di David, vorrei fornire il codice completato che mostra il CollectionEditor per una proprietà specifica di un'interfaccia utente. controllo quando si fa doppio clic in fase di progettazione.

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

Buon esempio! Grazie! – REALSOFO