2012-01-02 16 views
10

Tengo un componente personalizado con algunas propiedades publicadas que se han utilizado por un tiempo en muchos proyectos. Quiero hacer algunos cambios particulares a este componente que requiere eliminar estas propiedades antiguas y reemplazarlas por otras nuevas. De lo contrario, no eliminaré necesariamente las propiedades, pero digamos que simplemente cambio el nombre de una propiedad de PropName a MyPropName. Bueno, la próxima vez que se abra un proyecto que use ese componente, no podrá encontrar PropName.¿Mantiene las propiedades de mi componente cuando se cambian?

¿Hay alguna manera de automatizar la conversión de esto? ¿O es esto algo que la gente tendrá que hacer manualmente? ¿Cuál sería la forma correcta de mantener los valores de las propiedades de los componentes cuando se cambian los nombres de esas propiedades?

Y me refiero solo al código DFM, no necesariamente dentro del código fuente.

+2

Alguien está en una juerga enloqueciendo ... –

Respuesta

14

Puede usar el punto de extensión DefineProperties para ayudarlo a migrar sus archivos .dfm.

type 
    TMyComponent = class(...) 
    private 
    procedure ReadPropName(Reader: TReader); 
    protected 
    procedure DefineProperties(Filer: TFiler); override; 
    published 
    property MyPropName: string read ... write ...; 
    end; 

procedure TMyComponent.DefineProperties(Filer: TFiler); 
begin 
    inherited; 
    Filer.DefineProperty('PropName', ReadPropName, nil, False); 
end; 

procedure TMyComponent.ReadPropName(Reader: TReader); 
begin 
    MyPropName := Reader.ReadString; 
end; 

Esto permitirá que su nuevo componente lea en viejos archivos .dfm con el nombre de la propiedad anterior. Cuando el archivo .dfm se escribe de nuevo, se usará el nuevo nombre de propiedad.

Tenga en cuenta que dicha técnica permite que el componente pueda leer archivos .dfm que contengan el nombre de la propiedad anterior o el nombre de la propiedad nueva para que pueda migrar de forma gradual si lo desea. Una vez que haya migrado todos sus archivos .dfm, valdría la pena eliminar dicho código por motivos de orden.

La documentación de Delphi cubre este tema, aunque desde una perspectiva ligeramente diferente, en la sección Storing and Loading Unpublished Properties del Component Writer's Guide.

+3

¡Eso sí que es brillante! –

+4

@David, creo que cambiaste PropName y MyPropName en tu respuesta, ya que OP desea reemplazar la antigua propiedad PropName con la nueva propiedad MyPropName. De todos modos, excelente respuesta, ya que también me ayudó a abordar un problema que podría tener en el futuro. – iamjoosy

Cuestiones relacionadas