Mason Wheeler
Mason Wheeler

Reputation: 84540

What's the simplest way to override a Delphi property's default value?

I'm trying to write a TCustomDBGrid descendant that's designed to feel like a TListBox. One of the things I want to change is the Options property's defaults. TCustomDBGrid defines Options as:

property Options: TDBGridOptions read FOptions write SetOptions
  default [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines,
  dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit];

Trying to override that in my class with

  property Options: TDBGridOptions default
     [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit];

doesn't work; the compiler expects read or write after the type, not default. Problem is, FOptions and SetOptions are both defined as private, not protected, in TCustomDBGrid.

Do I have to write my own get and set methods that invoke "inherited Options", or is there a simpler way to do this?

Upvotes: 4

Views: 4415

Answers (2)

Fabricio Araujo
Fabricio Araujo

Reputation: 3820

That would not work in a runtime created dbgrid... See this (from Delphi Language Guide on BDS 2006):


Property values are not automatically initialized to the default value. That is, the default directive controls only when property values are saved to the form file, but not the initial value of the property on a newly created instance.


For components on a form in design time, I think there's no trouble. But in runtime created controls, I think it's better (I mean, safer) to do the override on the constructor:

constructor Create(Aowner:TComponent);
begin  
  inherited;
  Options := [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit];
end;

To make things right, do the default directive also:

property Options default  [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, 
                           dgCancelOnExit];

Upvotes: 2

Lars Truijens
Lars Truijens

Reputation: 43587

Don't specify the type. Then you can change the default. And remember that you also have to set the Options property to this default in the constructor. The code below does not actually set the default, it just lets it know to not stream the property value when the value is like that.

property Options default [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit];

Upvotes: 10

Related Questions