Delphi 组件自定义 属性 不保存在 DFM 文件中
Delphi Component Custom property not to be saved on the DFM files
我在自定义组件上有一个 属性,我不想将其保存在 DFM 文件中。我已经覆盖了 DefineProperties 方法以不提供 ReadData 和 WriteData 过程,期望它不会保存它的值,但它仍然会。
procedure TAEFDQuery.DefineProperties(Filer: TFiler);
begin
inherited;
// Set the ADO Compatibility custom properties to not be saved on the DFM
Filer.DefineProperty('CommandText', nil, nil, False);
end;
不保存这个 属性 的原因是因为我已经将一个项目从 ADO 移植到 FireDAC 并且我创建了允许一些 ADO 代码 运行 不变的“假”属性,重定向它对应的 FireDAC 属性。
type
TAEFDQuery = class(TFDQuery)
private
function GetCommandText: string;
procedure SetCommandText(AValue: string);
protected
procedure DefineProperties(Filer: TFiler); override;
published
property CommandText: integer read GetCommandText write SetCommandText;
end;
implementation
procedure TAEFDQuery.SetCommandText(AValue: string);
begin
SQL.Text := AValue;
end;
function TAEFDQuery.GetCommandText: string;
begin
Result := SQL.Text;
end;
procedure TAEFDQuery.DefineProperties(Filer: TFiler);
begin
inherited;
// Set the ADO Compatibility custom properties to not be saved on the DFM
Filer.DefineProperty('CommandText', nil, nil, False);
end;
为了兼容性,如何保留这些“假”属性的正确方法,而不是让它们用真实属性的无用副本填充 DFM 文件?
谢谢。
将存储说明符添加到 属性 或 returns false。
property CommandTimeout: integer read GetCommandTimeout write SetCommandTimeout stored False;
另一种防止 属性 被保存到 DFM 的方法是简单地将 属性 声明为 public
而不是 published
,因为只有 [=13] =] 属性流式传输 in/out 的 DFM。
type
TAEFDQuery = class(TFDQuery)
private
function GetCommandText: string;
procedure SetCommandText(AValue: string);
public
property CommandText: integer read GetCommandText write SetCommandText;
end;
如果 published
属性 无法保存,则在 design-time 处向对象检查器公开它是没有意义的。如果您只是想移植一些旧代码,那么您不需要添加对旧属性的 design-time 支持。
话虽如此,为了移植旧代码,请考虑使用 class helper 而不是派生完整的组件,例如:
unit MyFDQueryHelper;
interface
uses
FireDAC.Comp.Client;
type
TAEFDQuery = class helper for TFDQuery
private
function GetCommandText: string;
procedure SetCommandText(AValue: string);
public
property CommandText: integer read GetCommandText write SetCommandText;
end;
implementation
procedure TAEFDQuery.SetCommandText(AValue: string);
begin
Self.SQL.Text := AValue;
end;
function TAEFDQuery.GetCommandText: string;
begin
Result := Self.SQL.Text;
end;
end.
现在,您只需将 MyFDQueryHelper
添加到单元的 uses
子句中,该单元中的任何 TFDQuery
对象将自动获得新的 CommandText
属性。无需将 TFDQuery
个对象替换为 TAEFDQuery
个对象。
我在自定义组件上有一个 属性,我不想将其保存在 DFM 文件中。我已经覆盖了 DefineProperties 方法以不提供 ReadData 和 WriteData 过程,期望它不会保存它的值,但它仍然会。
procedure TAEFDQuery.DefineProperties(Filer: TFiler);
begin
inherited;
// Set the ADO Compatibility custom properties to not be saved on the DFM
Filer.DefineProperty('CommandText', nil, nil, False);
end;
不保存这个 属性 的原因是因为我已经将一个项目从 ADO 移植到 FireDAC 并且我创建了允许一些 ADO 代码 运行 不变的“假”属性,重定向它对应的 FireDAC 属性。
type
TAEFDQuery = class(TFDQuery)
private
function GetCommandText: string;
procedure SetCommandText(AValue: string);
protected
procedure DefineProperties(Filer: TFiler); override;
published
property CommandText: integer read GetCommandText write SetCommandText;
end;
implementation
procedure TAEFDQuery.SetCommandText(AValue: string);
begin
SQL.Text := AValue;
end;
function TAEFDQuery.GetCommandText: string;
begin
Result := SQL.Text;
end;
procedure TAEFDQuery.DefineProperties(Filer: TFiler);
begin
inherited;
// Set the ADO Compatibility custom properties to not be saved on the DFM
Filer.DefineProperty('CommandText', nil, nil, False);
end;
为了兼容性,如何保留这些“假”属性的正确方法,而不是让它们用真实属性的无用副本填充 DFM 文件?
谢谢。
将存储说明符添加到 属性 或 returns false。
property CommandTimeout: integer read GetCommandTimeout write SetCommandTimeout stored False;
另一种防止 属性 被保存到 DFM 的方法是简单地将 属性 声明为 public
而不是 published
,因为只有 [=13] =] 属性流式传输 in/out 的 DFM。
type
TAEFDQuery = class(TFDQuery)
private
function GetCommandText: string;
procedure SetCommandText(AValue: string);
public
property CommandText: integer read GetCommandText write SetCommandText;
end;
如果 published
属性 无法保存,则在 design-time 处向对象检查器公开它是没有意义的。如果您只是想移植一些旧代码,那么您不需要添加对旧属性的 design-time 支持。
话虽如此,为了移植旧代码,请考虑使用 class helper 而不是派生完整的组件,例如:
unit MyFDQueryHelper;
interface
uses
FireDAC.Comp.Client;
type
TAEFDQuery = class helper for TFDQuery
private
function GetCommandText: string;
procedure SetCommandText(AValue: string);
public
property CommandText: integer read GetCommandText write SetCommandText;
end;
implementation
procedure TAEFDQuery.SetCommandText(AValue: string);
begin
Self.SQL.Text := AValue;
end;
function TAEFDQuery.GetCommandText: string;
begin
Result := Self.SQL.Text;
end;
end.
现在,您只需将 MyFDQueryHelper
添加到单元的 uses
子句中,该单元中的任何 TFDQuery
对象将自动获得新的 CommandText
属性。无需将 TFDQuery
个对象替换为 TAEFDQuery
个对象。