4

概要

コンポーネントを作成するとき、公開されたプロパティにデフォルト値を与えるのが好きです。これにより、オブジェクト インスペクタは新しく変更されたプロパティを太字で表示します。これは、デフォルト値と変更された値を簡単に識別できるため、コンポーネントを使用するすべての人にとって非常に便利です。

以下は、2 つの Color プロパティと 2 つの 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 プロパティをデフォルトとして「マーク」する方法ですか?

コンポーネントをフォームに追加すると、オブジェクト インスペクタの両方の TFont プロパティが太字になります (デフォルトではありません)。公開された各フォントの横にある楕円をクリックすると、コンストラクターから設定した値が表示されますが、やはり太字になっています。奇妙なことに、各フォントのサイズ値が太字で表示されることはありません (つまり、変更されていないように見えます)。

標準のパブリッシュされたプロパティはdefault非常に簡単に作成できますが、サブプロパティを持つ TFont のようなクラスでこれを行うにはどうすればよいでしょうか?

コンストラクターでのみ、クラス構造からデフォルト値を設定する方法がわかりません。クラス構造からデフォルト値を定義できたとしても (これは不可能に思えます)、フォントがまだ作成されていないため、うまくいくとは思えません。例(明らかに機能しません):

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

では、オブジェクト インスペクタに新しいコンポーネントを追加するときに、公開された TFont プロパティをデフォルトとして表示し、変更しないようにするにはどうすればよいでしょうか?

サブプロパティとして TFont に似た他のクラスにも同じことが当てはまると思います。

4

1 に答える 1

10

オブジェクト プロパティの場合、デフォルトのストレージ指定子storedです。保存された後に、( FalseDFM に保存しない)、True(常に保存する)、またはいずれかを返すパラメーターなしの関数が続きます。最後が必要です:

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

IsFontStored関数内で、現在設定されているフォントがデフォルトのフォントかどうかを決定できます。その場合は、 を返しFalseます。

于 2013-02-13T12:04:47.740 に答える