如何在对象检查器中将TFont属性显示为默认值?

时间:2013-02-13 11:50:23

标签: delphi custom-controls delphi-xe

概述

在编写组件时,我喜欢给我的已发布属性一个默认值,通过这样做,Object Inspector在Bold中显示任何新更改的属性,这当然对使用该组件的任何人都非常有用,因为他们可以轻松识别默认值和修改后的属性值。

示例

以下是包含两个Color和两个Font属性的组件示例:

我在类结构中创建了已发布的属性default

type
  TMyComponent = class(TComponent)
  private
    FColor: TColor;
    FColorTo: TColor;
    FFont: TFont;
    FFontHot: TFont;
    procedure SetColor(const Value: TColor);
    procedure SetColorTo(const Value: TColor);
    procedure SetFont(const Value: TFont);
    procedure SetFontHot(const Value: TFont);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property Color: TColor read FColor write SetColor default clGreen;
    property ColorTo: TColor read FColorTo write SetColorTo default clBlue;
    property Font: TFont read FFont write SetFont; //< set default?
    property FontHot: TFont read FFontHot write SetFontHot; //< set default?
  end;

和构造函数:

constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FColor := clGreen;
  FColorTo := clBlue;

  FFont := TFont.Create;
  FFont.Color := clRed;
  FFont.Name := 'Segoe UI';
  FFont.Size := 10;
  FFont.Style := [];

  FFontHot:= TFont.Create;
  FFontHot.Color := clNavy;
  FFontHot.Name := 'Verdana';
  FFontHot.Size := 8;
  FFontHot.Style := [fsItalic];
end;

destructor TMyComponent.Destroy;
begin
  FFont.Free;
  FFontHot.Free;

  inherited Destroy;
end;

问题

我遇到的问题是如何将已发布的Font属性“标记为”默认值?

当我将组件添加到Form时,Object Inspector中的TFont属性都是Bold(非默认)。如果我单击每个发布字体旁边的椭圆,我可以看到我从构造函数中设置的值显示 - 但它们又是粗体。但奇怪的是,每种字体的大小值永远不会以粗体显示(即显示不变)。

标准发布的属性可以很容易地default,但是如何使用具有子属性的TFont这样的类呢?

我看不到从类结构中设置默认值的方法,只能在构造函数中。即使我可以从类结构中定义默认值(这似乎是不可能的),我怀疑它是否会起作用,因为尚未创建字体。例如(显然不起作用):

published
  property FontHot: TFont read FFontHot write SetFontHot default FFontHot.Color := clRed; //< set default?

那么,在将新组件添加到Object Inspector时,如何将已发布的TFont属性显示为默认值并保持不变?

我想这同样适用于类似于TFont的其他类作为子属性。

1 个答案:

答案 0 :(得分:10)

对于对象属性,默认storage specifier stored 。存储后False(永不保存到DFM),True(始终保存),或返回无参数函数。你需要最后一个:

private
  function IsFontStored: Boolean;
published
  property Font: TFont read FFont write SetFont stored IsFontStored;

IsFontStored函数中,您可以决定当前设置的字体是否为默认字体。如果是,请返回False