2008-12-03 4 views
4

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

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.

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

+0

Мне тоже любопытно. Я отлично работаю в C++ Builder от Borland. __property DefaultRowHeight = {default = 18}; – Jeremiah 2008-12-03 20:52:57

ответ

10

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

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

Спасибо! Я знал, что должен быть какой-то простой способ сделать это ... – 2008-12-03 21:02:05

2

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


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


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

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

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

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

На самом деле вам нужно сделать оба, чтобы сделать это правильно. Но эту часть нельзя забывать или она не будет работать вообще. Я указал на это в своем ответе, но не с кодом, как вы. – 2008-12-03 21:51:28