3. 公布Pen和Brush
在缺省情況下,一個Canvas具有一個細的、黑筆和實心的白刷,為了使用戶在使用Shape控制時能改變Canvas的這些性質,必須能在設計時提供這些對象;然後在畫時使用這些對象,這樣附屬的Pen或Brush被稱為Owned對象。
管理Owned對象需要下列三步:
● 聲明對象域
● 聲明訪問屬性
● 初始化Owned對象
⑴ 聲明Owned對象域
擁有的每一個對象必須有對象域的聲明,該域在部件存在時總指向Owned對象。通常,部件在constructor中創建它,在destructor中撤消它。
Owned對象的域總是定義為私有的,如果要使用戶或其它部件訪問該域,通常要提供訪問屬性。
下面的代碼聲明了Pen和Brush的對象域:
type
TSampleShape=class(TGraphicControl)
private
FPen: TPen;
FBrush: TBrush;
end;
⑵ 聲明訪問屬性
可以通過聲明與Owned對象相同類型的屬性來提供對Owned對象的訪問能力。這給使用部件的開發者提供在設計時或運行時訪問對象的途徑。
下面給Shape控制提供了訪問Pen和Brush的方法
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;
然後在庫單元的implementation部分寫SetBrush和SetPen方法:
procedure TSampleShape.SetBrush(Value: TBrush);
begin
FBrush.Assign(Value);
end;
procedure TSampleShape.SetPen(Value: TPen);
begin
FPen.Assign(Value);
end;
⑶ 初始化Owned對象
部件中增加了的新對象,必須在部件constructor中建立,這樣用戶才能在運行時與對象交互。相應地,部件的destructor必須在撤消自身之前撤消Owned對象。
因為Shape控制中加入了Pen和Brush對象,因此,要在constructor中初始化它們,在destructor中撤消它們。
① 在Shape控制的constructor中創建Pen和Brush
constructor TSampleShape.Create(Aowner: TComponent);
begin
inherited Create(AOwner);
Width := 65;
Height := 65;
FPen := TPen.Create;
FBrush := TBrush.Create;
end;
② 在部件對象的聲明中覆蓋destructor
type
TSampleShape=class(TGraphicControl)
public
construstor.Create(Aowner: TComponent); override;
destructor.destroy; override;
end;
③ 在庫單元中的實現部分編寫新的destructor
destructor TSampleShape.destroy;
begin
FPen.Free;
FBrush.Free;
inherited destroy;
end;