2012-01-02 30 views
10

我有一些自定义组件,其中包含一些在许多项目中已经使用了一段时间的已发布属性。我想对这个组件进行一些特殊的更改,它需要删除这些旧属性并用新的属性替换它们。否则,我不一定要删除属性,但我们假设我只是简单地将属性名称从PropName更改为MyPropName。那么,下次打开使用该组件的任何项目时,将无法找到PropName维护我的组件的属性时,它们被更改?

有什么办法可以自动转换这个吗?或者这是人们必须手动做的事情?当这些属性的名称被更改时,维护组件属性值的正确方法是什么?

我的意思是只在DFM代码中,不一定在源代码中。

+2

有人正在疯狂downvoting狂欢... – 2012-01-03 11:12:23

回答

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文件,那么为了整洁起见,应该删除这些代码。

Component Writer's GuideStoring and Loading Unpublished Properties部分,Delphi文档涵盖了这个主题领域,虽然略有不同。

+3

现在,这是辉煌! – 2012-01-02 23:12:26

+4

@David,我想你在你的答案中切换了PropName和MyPropName,因为OP想用新的MyPropName属性替换旧的PropName属性。无论如何,这是非常好的答案,因为它也帮助我解决了将来可能会遇到的问题。 – iamjoosy 2012-01-03 07:23:37

相关问题