我有一个自定义组件,其中包含一些已发布的属性,这些属性已在许多项目中使用了一段时间。我想对此组件进行一些特殊更改,这需要删除这些旧属性并将其替换为新属性。或者,我不一定要删除属性,但是我只想简单地将属性的名称从PropName
更改为MyPropName
。好吧,下次打开使用该组件的任何项目时,它将无法找到PropName
。
有没有办法自动转换这个?或者这是人们必须手动完成的事情?当这些属性的名称发生变化时,维护组件属性值的正确方法是什么?
我的意思是在DFM代码中,不一定在源代码中。
答案 0 :(得分:15)
您可以使用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部分,虽然视角略有不同,但涵盖了这一主题领域。