Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 578
Mason Wheeler Avatar asked Dec 17 '22 09:12

Mason Wheeler


2 Answers

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];
like image 83
Lars Truijens Avatar answered Dec 24 '22 00:12

Lars Truijens


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];
like image 36
Fabricio Araujo Avatar answered Dec 24 '22 01:12

Fabricio Araujo