畫布預設細黑筆/實心白刷,為了讓設計者自訂外觀,必須將 TPen/TBrush 作為 Owned 物件 發布。標準三步驟:
type
TSampleShape = class(TGraphicControl)
private
FPen: TPen;
FBrush: TBrush;
end;
欄位全程持有物件參考,建構子建立、解構子釋放。
type
TSampleShape = class(TGraphicControl)
private
procedure SetBrush(Value: TBrush);
procedure SetPen(Value: TPen);
published
property Brush: TBrush read FBrush write SetBrush;
property Pen: TPen read FPen write SetPen;
end;
關鍵實作:指派而非替換——FBrush.Assign(Value) 複製屬性值,保持物件身分不變,避免事件綁定失效與記憶體洩漏。
procedure TSampleShape.SetBrush(Value: TBrush);
begin
FBrush.Assign(Value);
end;
constructor TSampleShape.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
Width := 65; Height := 65;
FPen := TPen.Create;
FBrush := TBrush.Create;
end;
destructor TSampleShape.Destroy;
begin
FPen.Free;
FBrush.Free;
inherited Destroy;
end;
鐵律: 解構子先釋放 Owned 物件,再呼叫 inherited Destroy;宣告時必須 override 覆寫虛擬解構子。