2012-01-02 2 views
10

У меня есть пользовательский компонент с некоторыми опубликованными свойствами, которые некоторое время использовались во многих проектах. Я хочу внести некоторые изменения в этот компонент, который требует удаления этих старых свойств и замены их новыми. Или иначе, я не обязательно удаляю свойства, но, допустим, просто просто изменим имя свойства от PropName до MyPropName. Ну, в следующий раз, когда любой проект, использующий этот компонент, будет открыт, он не сможет найти PropName.Сохранять свойства моего компонента при их изменении?

Есть ли способ автоматизировать преобразование этого? Или это то, что люди должны будут сделать вручную? Каким будет правильный способ поддерживать значения свойств компонента при изменении имен этих свойств?

И я имею в виду только код DFM, не обязательно внутри исходного кода.

+2

Кто-то находится на безумном волнении ... –

ответ

14

Вы можете использовать точку расширения DefineProperties, чтобы помочь вам перенести ваши .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; 

Это позволит вашему новому компоненту читать старые .dfm-файлы со старым именем свойства. Когда файл .dfm будет записан снова, будет использовано новое имя свойства.

Обратите внимание, что такой метод приводит к тому, что компонент может считывать файлы .dfm, содержащие либо старое имя свойства, либо новое имя свойства, чтобы вы могли выполнить миграцию поэтапно, если хотите. Как только вы перенесли все ваши .dfm-файлы, стоило бы удалить такой код ради удобства.

Документация Delphi охватывает эту предметную область, хотя и с несколько иной точки зрения, в разделе Storing and Loading Unpublished Properties раздела Component Writer's Guide.

+3

Теперь это блестящий! –

+4

@David, я думаю, что вы переключили PropName и MyPropName в свой ответ, поскольку OP хочет заменить прежнее свойство PropName новым свойством MyPropName. Во всяком случае, отличный ответ, так как он также помог мне решить проблему, которую я мог бы получить в будущем. – iamjoosy

Смежные вопросы