【问题标题】:How to make a TFont property show as default in the Object Inspector?如何使 TFont 属性在 Object Inspector 中显示为默认值?
【发布时间】:2013-01-28 23:03:38
【问题描述】:

概述

在编写组件时,我喜欢给我发布的属性一个默认值,通过这样做,对象检查器会以粗体显示任何新更改的属性,这对于使用该组件的任何人来说都非常有用,因为他们可以轻松识别默认值和修改后的属性价值观。

示例

下面是一个包含两个 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;

问题

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

当我将组件添加到表单时,对象检查器中的两个 TFont 属性都是粗体(非默认)。如果我单击每个已发布字体旁边的椭圆,我可以看到我从构造函数中设置的值显示出来——但它们再次以粗体显示。奇怪的是,每种字体的 Size 值从未以粗体显示(即看起来没有变化)。

标准发布的属性可以很容易地变成default,但是你怎么能用像TFont这样有子属性的类来做到这一点呢?

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

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

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

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

【问题讨论】:

    标签: delphi custom-controls delphi-xe


    【解决方案1】:

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

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

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

    【讨论】:

    • 太棒了,我永远不会知道这个神奇的词。我发誓 Delphi 的帮助永远不会帮助我找到我需要的东西。
    • 无需帮助;在这些情况下,我会深入研究 VCL 代码以探索它是如何在那里完成的。
    • 我想是的,但通常我不知道我在寻找什么或从哪里开始 - 特别是在学习存储说明符等新事物时,我什至不会意识到它,直到你回答了这个问题:)
    • 我完全理解,而且确实:VCL 代码没有解释它是如何工作的,也没有解释它的名字是什么。但我想说的是,出于普通程序员的好奇心,在随机的 Font 属性上按 ctrl 键单击最终会引导您找到它的声明。然后,一旦找到存储的指令,您就可以搜索关键字。更多的好奇心会导致在存储的指令后按 ctrl-click 标识符,一个全新的世界将展现在您面前.... ;-)
    • 好点,虽然 Ctrl+click 并不总是想要工作。即使我确实迷路了,我也应该尝试更多地研究底层的 Delphi 代码,这与尝试使用我并不总是清楚的帮助文件没有什么不同。不用说几乎每天都在使用 Delphi,无论是通过像您这样的答案还是通过发现它,我仍然在学习新事物。
    猜你喜欢
    • 2011-06-03
    • 2020-08-16
    • 2012-01-03
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    相关资源
    最近更新 更多