【问题标题】:What's the simplest way to override a Delphi property's default value?覆盖 Delphi 属性默认值的最简单方法是什么?
【发布时间】:2010-09-25 05:10:11
【问题描述】:

我正在尝试编写一个 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。问题是,FOptions 和 SetOptions 在 TCustomDBGrid 中都被定义为私有的,不受保护的。

我是否必须编写自己的 get 和 set 方法来调用“inherited Options”,还是有更简单的方法来做到这一点?

【问题讨论】:

  • 我也很好奇。我在 Borland 的 C++ Builder 中工作得很好。 __property DefaultRowHeight = { default = 18 };

标签: delphi properties default-value


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这在运行时创建的 dbgrid 中不起作用... 请参阅此(来自 BDS 2006 上的 Delphi 语言指南):


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


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

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

    为了使事情正确,也请执行 default 指令:

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

    【讨论】:

    • 实际上你需要同时做这两件事才能把它做好。但这部分不需要忘记,否则根本不起作用。我确实在回答中指出了这一点,但没有像您那样使用代码。
    • 好的。由于我的大部分编码都用于非可视类,因此我不会过多地使用默认指令(数组属性除外,该指令更有用)... ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2019-07-26
    • 2016-01-29
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    相关资源
    最近更新 更多