Какой самый простой способ переопределить значение по умолчанию для свойства Delphi? - PullRequest
4 голосов
/ 03 декабря 2008

Я пытаюсь написать потомка 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];

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

Нужно ли мне писать свои собственные методы get и set, которые вызывают " унаследованные Опции", или есть более простой способ сделать это?

Ответы [ 2 ]

10 голосов
/ 03 декабря 2008

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

property Options default [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, dgCancelOnExit];
2 голосов
/ 04 декабря 2008

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


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


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

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

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

property Options default  [dgTitles, dgTabs, dgRowSelect, dgAlwaysShowSelection, 
                           dgCancelOnExit];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...