更改时保持组件的属性?

Jer*_*dge 10 delphi components properties delphi-7

我有一个自定义组件,其中包含一些已在许多项目中使用过一段时间的已发布属性.我想对此组件进行一些特殊更改,这需要删除这些旧属性并将其替换为新属性.或以其他方式,我不一定移除属性,但让我们说,我只是简单地从更改属性的名称PropNameMyPropName代替.好吧,下次打开使用该组件的任何项目时,它将无法找到PropName.

有没有办法自动转换这个?或者这是人们必须手动完成的事情?当这些属性的名称发生变化时,维护组件属性值的正确方法是什么?

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

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

这将允许您的新组件使用旧属性名称读取旧的.dfm文件.再次写入.dfm文件时,将使用新的属性名称.

请注意,这种技术使组件能够读取包含旧属性名称或新属性名称的.dfm文件,以便您可以根据需要逐步迁移.一旦迁移了所有.dfm文件,那么为了整洁而删除这些代码是值得的.

Delphi文档在" 组件编写者指南"的" 存储和加载未发布的属性"部分中介绍了此主题区域,尽管从略有不同的角度来看.

  • @David,我认为你在答案中切换了PropName和MyPropName,因为OP希望用新的MyPropName属性替换旧的PropName属性.无论如何,优秀的答案,因为它也帮助我解决了将来可能遇到的问题. (4认同)
  • 现在那太棒了! (3认同)