Mar*_*lot 4 delphi delphi-10.4-sydney
我在自定义组件上有一个属性,我不想将其保存在 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;
Run Code Online (Sandbox Code Playgroud)
不保存此属性的原因是因为我已将一个项目从 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;
Run Code Online (Sandbox Code Playgroud)
为了兼容性,保留这些“假”属性的正确方法是什么,而不让它们用真实属性的无用副本填充 DFM 文件?
谢谢你。
向为 false 或返回 false 的属性添加存储说明符。
property CommandTimeout: integer read GetCommandTimeout write SetCommandTimeout stored False;
Run Code Online (Sandbox Code Playgroud)
另一种防止属性被保存到 DFM 的方法是简单地将属性声明为public而不是published,因为只有published属性会流入/流出 DFM。
type
TAEFDQuery = class(TFDQuery)
private
function GetCommandText: string;
procedure SetCommandText(AValue: string);
public
property CommandText: integer read GetCommandText write SetCommandText;
end;
Run Code Online (Sandbox Code Playgroud)
published如果无法保存,则在设计时将属性公开给对象检查器是没有意义的。如果您只是想移植一些旧代码,那么您不需要为旧属性添加设计时支持。
话虽如此,为了移植旧代码,请考虑使用类助手而不是派生完整组件,例如:
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.
Run Code Online (Sandbox Code Playgroud)
现在,您可以简单地添加MyFDQueryHelper到uses单元的子句中,该单元中的任何TFDQuery对象都将自动获得新CommandText属性。无需TFDQuery用TAEFDQuery对象替换对象。
| 归档时间: |
|
| 查看次数: |
176 次 |
| 最近记录: |