覆盖Delphi属性默认值的最简单方法是什么?

时间:2008-12-03 20:47:06

标签: delphi properties default-value

我正在尝试编写一个TCustomDBGrid后代,它的设计感觉就像TListBox一样。我想要改变的一件事是Options属性的默认值。 TCustomDBGrid将Options定义为:

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];

不起作用;编译器在类型后期望读取写入,而不是默认。问题是,在TCustomDBGrid中,FOptions和SetOptions都被定义为私有,而不是受保护。

我是否必须编写自己的get和set方法来调用“继承的选项”,或者是否有更简单的方法来执行此操作?

2 个答案:

答案 0 :(得分:10)

不指定类型。然后您可以更改默认值。请记住,您还必须在构造函数中将Options属性设置为此默认值。下面的代码实际上并没有设置默认值,它只是让它知道当值是这样时不流传输属性值。

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

答案 1 :(得分:2)

这在运行时创建的dbgrid中无效... 见(来自BDS 2006上的Delphi语言指南):


属性值不会自动初始化为默认值。也就是说,默认指令仅在属性值保存到表单文件时控制,而不是在新创建的实例上保存属性的初始值。


对于设计时表单上的组件,我认为没有问题。但是在运行时创建的控件中,我认为在构造函数上执行覆盖更好(我的意思是,更安全):

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

为了使事情正确,还要执行默认指令:

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