2012-01-02 10 views
10

Ho un componente personalizzato con alcune proprietà pubblicate che sono state utilizzate per un po 'in molti progetti. Voglio apportare alcune modifiche particolari a questo componente che richiede la rimozione di queste vecchie proprietà e la loro sostituzione con quelle nuove. O altrimenti, non sto necessariamente rimuovendo le proprietà, ma diciamo semplicemente cambiare semplicemente il nome di una proprietà da PropName a MyPropName. Bene, la prossima volta che viene aperto qualsiasi progetto che utilizza quel componente, non sarà in grado di trovare PropName.Mantenere le proprietà del mio componente quando vengono cambiate?

C'è un modo per automatizzare la conversione di questo? O è qualcosa che le persone dovranno fare manualmente? Quale sarebbe il modo corretto di mantenere i valori delle proprietà del componente quando i nomi di tali proprietà vengono modificati?

E intendo solo nel codice DFM, non necessariamente all'interno del codice sorgente.

+2

Qualcuno è in una follia da downvoting ... –

risposta

14

È possibile utilizzare il punto di estensione DefineProperties per facilitare la migrazione dei file .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; 

Ciò consentirà al nuovo componente di leggere in vecchi file .dfm con il nome della vecchia proprietà. Quando il file .dfm viene scritto di nuovo, verrà utilizzato il nuovo nome della proprietà.

Si noti che una tale tecnica consente al componente di leggere file .dfm contenenti il ​​nome della vecchia proprietà o il nome della nuova proprietà in modo da poter migrare in modo graduale, se lo si desidera. Dopo aver migrato tutti i file .dfm, sarebbe opportuno rimuovere tale codice per motivi di ordine.

La documentazione di Delphi copre questa area tematica, anche se da una prospettiva leggermente diversa, nella sezione Storing and Loading Unpublished Properties dello Component Writer's Guide.

+3

Ora è geniale! –

+4

@David, penso che tu abbia cambiato PropName e MyPropName nella tua risposta, poiché l'OP vuole sostituire la vecchia proprietà PropName con la nuova proprietà MyPropName. Comunque, ottima risposta, in quanto mi ha anche aiutato ad affrontare un problema che potrei avere in futuro. – iamjoosy

Problemi correlati