概要
コンポーネントを作成するとき、公開されたプロパティにデフォルト値を与えるのが好きです。これにより、オブジェクト インスペクタは新しく変更されたプロパティを太字で表示します。これは、デフォルト値と変更された値を簡単に識別できるため、コンポーネントを使用するすべての人にとって非常に便利です。
例
以下は、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 に似た他のクラスにも同じことが当てはまると思います。