I have a property on a custom component that I don't want to be saved on the DFM files. I have overrided the DefineProperties method to provide no ReadData and WriteData procedures, expecting that it won't save its value, but it still does.
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;
The reason to not save this property is because I have ported a project from ADO to FireDAC and I have created "fake" properties that allows some ADO code to run unchanged, redirecting it to their correspondent FireDAC properties.
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;
How is the correct way to keep these "fake" properties, for compatibility sake, without having them filling the DFM files with useless copies of the real properties ?.
Thank you.
Add a storage specifier to the property that is or returns false.
property CommandTimeout: integer read GetCommandTimeout write SetCommandTimeout stored False;
ref: Properties (Delphi) -> Storage Specifiers
Another way to prevent the property from being saved to the DFM is to simply declare the property as public
instead of published
, as only published
properties are streamed in/out of a DFM.
type
TAEFDQuery = class(TFDQuery)
private
function GetCommandText: string;
procedure SetCommandText(AValue: string);
public
property CommandText: integer read GetCommandText write SetCommandText;
end;
It doesn't make sense to have a published
property exposed to the Object Inspector at design-time if it can't be saved. If you are just trying to port some old code, then you don't need the added design-time support for old properties.
With that said, for purposes of porting old code, consider using a class helper instead of deriving a full component, eg:
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.
Now, you can simply add MyFDQueryHelper
to the uses
clause of a unit and any TFDQuery
objects in that unit will automatically gain the new CommandText
property. No need to replace TFDQuery
objects with TAEFDQuery
objects.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With