我最近修改了我的一个组件,碰巧它不再使用它以前使用的属性之一。
但是,这些属性写入整个项目的多个 .dfm 文件中。现在,当我尝试编译项目时,我得到“读取错误。:属性 <...> 不存在”
复杂的部分是属性值是二进制数据(存储在多行中),我不能用 Delphi replace 或 notepad++ regexp 删除它(因为它们是基于单行的)。
所以我的问题是:
是否有任何第三方工具或方法可以轻松地从多个 .dfm 文件中删除属性?
我最近修改了我的一个组件,碰巧它不再使用它以前使用的属性之一。
但是,这些属性写入整个项目的多个 .dfm 文件中。现在,当我尝试编译项目时,我得到“读取错误。:属性 <...> 不存在”
复杂的部分是属性值是二进制数据(存储在多行中),我不能用 Delphi replace 或 notepad++ regexp 删除它(因为它们是基于单行的)。
所以我的问题是:
是否有任何第三方工具或方法可以轻松地从多个 .dfm 文件中删除属性?
试试这个工具Delphi DFM properties remover
,它适用于旧版本的 delphi,但也许可以帮助你。
一种可能的方法是修改您的组件,使其能够简单地忽略这些属性。这样您就不必在每个 .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;
Jedi VCL 包含一个名为DFMCleaner的工具:
DFMCleaner 是一个从 DFM 中删除不受支持的属性的工具。如果您在某个版本的 Delphi 中保存 dfm 文件并希望在较早的版本中使用它,则其中可能有一些不受支持的属性,在 Delphi 中打开表单时会产生错误。更糟糕的是,如果 dfm 是设计时包的一部分,Delphi 将安装包而不会出错,但是当您尝试在设计时访问表单时(如果表单由属性编辑器使用),Delphi而是生成一个 AV。
它位于jvcl-install\devtools\DFMCleaner(带有源代码和示例配置文件的项目)
就我而言,只需关闭项目并删除 DProj 文件即可。