9

我最近修改了我的一个组件,碰巧它不再使用它以前使用的属性之一。

但是,这些属性写入整个项目的多个 .dfm 文件中。现在,当我尝试编译项目时,我得到“读取错误。:属性 <...> 不存在”

复杂的部分是属性值是二进制数据(存储在多行中),我不能用 Delphi replace 或 notepad++ regexp 删除它(因为它们是基于单行的)。

所以我的问题是:

是否有任何第三方工具或方法可以轻松地从多个 .dfm 文件中删除属性?

4

4 回答 4

9

试试这个工具Delphi DFM properties remover,它适用于旧版本的 delphi,但也许可以帮助你。

于 2012-03-02T08:23:37.613 回答
4

一种可能的方法是修改您的组件,使其能够简单地忽略这些属性。这样您就不必在每个 .dfm 文件中查找它们。

例如:

type
  TIgnoreFormPropertyHelper = class
  public
    class procedure IgnoreBooleanProperty(Reader: TReader);
    class procedure IgnoreIntegerProperty(Reader: TReader);
  end;

{ TIgnoreFormPropertyHelper }

class procedure TIgnoreFormPropertyHelper.IgnoreBooleanProperty(Reader: TReader);
begin
  Reader.ReadBoolean;
end;

class procedure TIgnoreFormPropertyHelper.IgnoreIntegerProperty(Reader: TReader);
begin
  Reader.ReadInteger;
end;

type
  TMyComponent = class(...)
  ....  
  protected
    procedure DefineProperties(Filer: TFiler); override;
  ....  

procedure TMyComponent.DefineProperties(Filer: TFiler);
begin
  inherited;
  Filer.DefineProperty('MyLegacyBooleanProperty',
    TIgnoreFormPropertyHelper.IgnoreBooleanProperty, nil, False);
  Filer.DefineProperty('MyLegacyIntegerProperty',
    TIgnoreFormPropertyHelper.IgnoreIntegerProperty, nil, False);
end;
于 2012-03-02T09:12:24.423 回答
1

Jedi VCL 包含一个名为DFMCleaner的工具:

DFMCleaner 是一个从 DFM 中删除不受支持的属性的工具。如果您在某个版本的 Delphi 中保存 dfm 文件并希望在较早的版本中使用它,则其中可能有一些不受支持的属性,在 Delphi 中打开表单时会产生错误。更糟糕的是,如果 dfm 是设计时包的一部分,Delphi 将安装包而不会出错,但是当您尝试在设计时访问表单时(如果表单由属性编辑器使用),Delphi而是生成一个 AV。

它位于jvcl-install\devtools\DFMCleaner(带有源代码和示例配置文件的项目)

于 2012-03-04T18:15:38.760 回答
0

就我而言,只需关闭项目并删除 DProj 文件即可。

于 2015-06-09T10:34:45.473 回答