如何最简单地覆盖 Delphi 属性的默认值?

4
我正在尝试编写一个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];

无法运行;编译器期望在类型后面是readwrite,而不是default。问题是,在TCustomDBGrid中,FOptions和SetOptions都被定义为私有的,而不是受保护的。

我需要编写自己的获取和设置方法来调用“inherited Options”,还是有更简单的方法可以做到这一点?


我也很好奇。在Borland的C++ Builder中运行得非常好。__property DefaultRowHeight = { default = 18 }; - Jeremiah
2个回答

10

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

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

2

在运行时创建的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];

实际上,要做到正确,你需要两者兼备。但是这部分不应被忽略,否则它将完全无法工作。我在我的答案中指出了这一点,但并没有像你那样用代码来说明。 - Lars Truijens
好的。由于我的大部分编码都用于非可视类,所以我不太关心默认指令(除了数组属性,在那里这个指令要有用得多)...;-) - Fabricio Araujo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接