2011-09-16 14 views
7

He creado un componente derivado de TCustomPanel. En ese panel tengo una propiedad publicada de una clase derivada de TOwnedCollection. Todo está funcionando bien y al hacer clic en los puntos suspensivos en el inspector de objetos para esa propiedad, se abre el editor de colecciones predeterminado donde puedo administrar los TCollectionItems en la lista.Cómo invocar el editor de propiedades de un componente en el momento del diseño

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

También me gustaría ser capaz de hacer doble clic en el panel en tiempo de diseño y tienen el editor de la colección se abren de forma predeterminada. Empecé creando una clase derivada de TDefaultEditor y registrándola.

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

    RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor); 

Esto parece ser dirigido en el momento adecuado, pero estoy atascado en cómo poner en marcha el editor de propiedades para la recogida en ese 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; 

Cualquier solución o enfoque diferente sería apreciado.

Respuesta

9

No está utilizando el editor correcto, por lo que puedo ver. TDefaultEditor se describe así:

Un editor que proporciona el comportamiento por defecto para el doble clic que repetir las propiedades que buscan la propiedad método más apropiado para editar

Este es un editor que responde a Haga doble clic en el formulario colocándolo en el editor de código con un controlador de eventos recién creado. Piense en lo que sucede cuando hace doble clic en TButton y se lo deja caer en el controlador OnClick.

Ha pasado mucho tiempo desde que escribí un editor de tiempo de diseño (espero que mi memoria esté funcionando hoy) pero creo que su editor debe derivarse de TComponentEditor. Para mostrar el editor de colecciones, llame al ShowCollectionEditor desde la unidad ColnEdit.

Puede anular el método Edit de TComponentEditor y llamar al ShowCollectionEditor desde allí. Si desea estar más avanzado, como alternativa puede declarar algunos verbos con GetVerbCount, GetVerb y ExecuteVerb. Si lo hace de esta manera, amplía el menú contextual y la implementación predeterminada Edit ejecutará el verbo 0.

+1

Derivado de TComponentEditor y la implementación de Get/ExecuteVerb para llamar a ShowCollectionEditor funcionó a la perfección. Muchas gracias. – avenmore

+0

Wow, debo admitir que estoy un poco sorprendido de que realmente haya sido así de fácil, ¡fue literalmente hace siglos cuando la última vez que hice algo así! –

5

Siguiendo la respuesta correcta de David, me gustaría proporcionar el código completo que muestra el Editor de colecciones para una propiedad específica de una UI controlar cuando se hace doble clic en el tiempo de diseño.

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

¡Buen ejemplo! ¡Gracias! – REALSOFO

Cuestiones relacionadas