我最近修改了其中一个组件,结果它不再使用以前使用过的某些属性。然而,这些属性写在项目的多个 .dfm 文件中。当我尝试编译该项目时,出现“无法读取文件:属性 <...> 不存在”的错误提示。复杂的问题是该属性值是二进制数据(存储在多行中),我不能使用 Delphi replace 或 notepad++ regexp 删除它(因为它们是基于单行的)。所以我的问题是:有没有第三方工具或方法可以轻松地从多个 .dfm 文件中删除属性?
尝试使用此工具 Delphi DFM属性移除器
,它可以与旧版本的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 中(带有源代码和示例配置文件的项目)
TMS
中的TAdvGlowButton
,然后我替换了表单类中的字段定义(button1:TButton
),之后我打开形式作为文本(alt + f12),并将TAdvGlowButton
替换为TButton
(当然,TMS
按钮具有比标准更多的属性)。因此,现在DFM有无效的属性。如果我尝试打开表单,IDE会问:“忽略错误并继续吗?”,如果我按确定,则无效属性将被删除。 - teran