¿Cuál es la forma más sencilla de anular el valor predeterminado de una propiedad Delphi?

StackOverflow https://stackoverflow.com/questions/338628

Pregunta

Estoy tratando de escribir un descendiente TCustomDBGrid diseñado para sentirse como un TListBox. Una de las cosas que quiero cambiar son los valores predeterminados de la propiedad Opciones. TCustomDBGrid define las opciones como:

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

Intentando anular eso en mi clase con

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

no funciona; el compilador espera lectura o escritura después del tipo, no predeterminado . El problema es que FOptions y SetOptions se definen como privadas, no protegidas, en TCustomDBGrid.

¿Tengo que escribir mis propios métodos get y set que invocan " opciones heredadas " ;, o hay una forma más sencilla de hacerlo?

¿Fue útil?

Solución

No especifique el tipo. Entonces puedes cambiar el valor predeterminado. Y recuerde que también debe establecer la propiedad Opciones a este valor predeterminado en el constructor. El siguiente código en realidad no establece el valor predeterminado, solo le indica que no transmita el valor de la propiedad cuando el valor es así.

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

Otros consejos

Eso no funcionaría en un tiempo de ejecución creado dbgrid ... Vea esto (de Delphi Language Guide en BDS 2006):


Los valores de propiedad no se inicializan automáticamente al valor predeterminado. Es decir, la directiva predeterminada controla solo cuando los valores de propiedad se guardan en el archivo de formulario, pero no el valor inicial de la propiedad en una instancia recién creada.


Para componentes en un formulario en tiempo de diseño, creo que no hay problemas. Pero en los controles creados en tiempo de ejecución, creo que es mejor (quiero decir, más seguro) hacer la anulación en el constructor:

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

Para hacer las cosas bien, haga también la directiva predeterminada :

property Options default  [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, 
                           dgCancelOnExit];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top