Какой самый простой способ переопределить значение свойства Delphi по умолчанию?

Я пытаюсь написать потомка TCustomDBGrid, который будет работать как TListBox. Одна из вещей, которые я хочу изменить, - это значения по умолчанию для свойства Options. TCustomDBGrid определяет параметры как:

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

Пытаюсь переопределить это в моем классе с помощью

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

не работает; компилятор ожидает чтения или записи после типа, а не по умолчанию. Проблема в том, что FOptions и SetOptions определены как частные, а не защищенные в TCustomDBGrid.

Должен ли я писать собственные методы получения и установки, вызывающие «унаследованные параметры», или есть более простой способ сделать это?


person Mason Wheeler    schedule 03.12.2008    source источник
comment
Мне тоже любопытно. Я отлично работаю в Borland C ++ Builder. __property DefaultRowHeight = {по умолчанию = 18};   -  person Jeremiah    schedule 03.12.2008


Ответы (2)


Не указывайте тип. Затем вы можете изменить значение по умолчанию. И помните, что вы также должны установить для свойства Options значение по умолчанию в конструкторе. Приведенный ниже код на самом деле не устанавливает значение по умолчанию, он просто дает ему знать, что не следует передавать значение свойства, когда значение такое.

property Options default [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit];
person Lars Truijens    schedule 03.12.2008

Это не будет работать в среде выполнения, созданной dbgrid ... См. Это (из руководства по языку Delphi на BDS 2006):


Значения свойств не инициализируются автоматически значением по умолчанию. То есть директива по умолчанию управляет только при сохранении значений свойств в файле формы, но не начальным значением свойства во вновь созданном экземпляре.


Я думаю, что для компонентов формы во время разработки проблем нет. Но в элементах управления, созданных во время выполнения, я думаю, что лучше (я имею в виду, безопаснее) выполнить переопределение в конструкторе:

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

Чтобы все исправить, выполните также директиву default:

property Options default  [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, 
                           dgCancelOnExit];
person Fabricio Araujo    schedule 03.12.2008
comment
На самом деле вам нужно сделать и то, и другое, чтобы сделать это правильно. Но об этой части не нужно забывать, иначе она вообще не сработает. Я указал на это в своем ответе, но не таким кодом, как вы. - person Lars Truijens; 04.12.2008
comment
В порядке. Поскольку большая часть моего кодирования относится к невизуальным классам, я не особо беспокоюсь о директиве по умолчанию (за исключением свойств массива, где эта директива НАМНОГО полезнее) ... ;-) - person Fabricio Araujo; 04.12.2008