Delphi中从.dfm文件中删除属性的快速方法

9
我最近修改了其中一个组件,结果它不再使用以前使用过的某些属性。然而,这些属性写在项目的多个 .dfm 文件中。当我尝试编译该项目时,出现“无法读取文件:属性 <...> 不存在”的错误提示。复杂的问题是该属性值是二进制数据(存储在多行中),我不能使用 Delphi replace 或 notepad++ regexp 删除它(因为它们是基于单行的)。所以我的问题是:有没有第三方工具或方法可以轻松地从多个 .dfm 文件中删除属性?

如果您打开dfm并重新保存,无效属性是否会被删除?看起来很奇怪。 - teran
@teran 问题在于首先打开 .dfm 文件。流式编码将会在 .dfm 文件读取点处抛出异常。 - David Heffernan
@DavidHeffernan 我以为IDE会要求“忽略”或“删除”二进制字段的不正确属性。比如说:我在窗体上放置了TMS中的TAdvGlowButton,然后我替换了表单类中的字段定义(button1:TButton),之后我打开形式作为文本(alt + f12),并将TAdvGlowButton替换为TButton(当然,TMS按钮具有比标准更多的属性)。因此,现在DFM有无效的属性。如果我尝试打开表单,IDE会问:“忽略错误并继续吗?”,如果我按确定,则无效属性将被删除。 - teran
@teran 或许我还停留在旧时代。我总是让我的组件能够无声地处理所有问题。 - David Heffernan
4个回答

9

尝试使用此工具 Delphi DFM属性移除器,它可以与旧版本的Delphi一起使用,但可能会对您有所帮助。


谢谢,这个很好用,完全符合预期。不确定为什么我之前无法在谷歌上找到它。 - ertx

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;

1

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

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

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


0
在我的情况下,简单地关闭项目并删除DProj文件就解决了问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接