4 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;
Run Code Online (Sandbox Code Playgroud)
和构造函数:
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;
Run Code Online (Sandbox Code Playgroud)
问题
我遇到的问题是如何将已发布的Font属性"标记"为默认值?
当我将组件添加到窗体时,对象检查器中的TFont属性都是粗体(非默认).如果我单击每个发布字体旁边的椭圆,我可以看到我从构造函数中设置的值显示 - 但它们又是粗体.但奇怪的是,每种字体的大小值永远不会以粗体显示(即显示不变).
可以default非常容易地制作标准发布的属性,但是如何使用具有子属性的TFont这样的类?
我看不到从类结构中设置默认值的方法,只能在构造函数中.即使我可以从类结构中定义默认值(这似乎是不可能的),我怀疑它是否会起作用,因为尚未创建字体.例如(显然不起作用):
published
property FontHot: TFont read FFontHot write SetFontHot default FFontHot.Color := clRed; //< set default?
Run Code Online (Sandbox Code Playgroud)
那么,在将新组件添加到Object Inspector时,如何将已发布的TFont属性显示为默认值并保持不变?
我想这同样适用于类似于TFont的其他类作为子属性.
NGL*_*GLN 10
对于对象属性,默认存储说明符为stored.存储后False(从不保存到DFM),True(总是保存),或者返回无参数函数.你需要最后一个:
private
function IsFontStored: Boolean;
published
property Font: TFont read FFont write SetFont stored IsFontStored;
Run Code Online (Sandbox Code Playgroud)
在该IsFontStored函数中,您可以决定当前设置的字体是否为默认字体.如果是这样,请返回False.