戻る ホーム 上へ 進む

2.4 TBrush

ここではTBrush特有のことに関して解説します。

2.4.1 TBrushData のデフォルト値 DefBrushData

DefBrushDataの値を以下に示します(括弧内は対応するプロパティ名です)。
ブラシハンドル0
ブラシの色(Color)clWhite
ブラシのビットマップ(Bitmap)nil
ブラシのスタイル(Style)bsSolid

2.4.2 TBrushData から TLogBrush への変換

Figure 2.2-2

図 2.1-2 TResource(リソース)の構造(再掲)

TBrushData から TLogBrush への変換は以下のようになります。
ブラシのビットマップが nil 以外ならばブラシのスタイルは無視され
lbStyle := BS_PATTERN
lbHatch := ブラシのビットマップのハンドル
lbColor := ColorToRGB(ブラシの色)
ブラシのビットマップがnilならば
ブラシスタイル= bsSolidならば lbStyle := BS_SOLID lbHatch := 0
ブラシスタイル= bsClearならば lbStyle := BS_HOLLOW lbHatch := 0
ブラシスタイル= bsHorizontalならば lbStyle := BS_HATCHED lbHatch:=0
ブラシスタイル= bsVerticalならば lbStyle := BS_HATCHED lbHatch:=1
ブラシスタイル= bsFDiagonalならば lbStyle := BS_HATCHED lbHatch:=2
ブラシスタイル= bsBDiagonalならば lbStyle := BS_HATCHED lbHatch:=3
ブラシスタイル= bsCrossならば lbStyle := BS_HATCHED lbHatch:=4
ブラシスタイル= bsDiagCrossならば lbStyle := BS_HATCHED lbHatch:=5
lbColor := ColorToRGB(ブラシの色)

2.4.3 TBrushのプロパティ 間の相互作用

TBrush では プロパティ が互いに独立では無く、複雑に相互作用します。以下にどのようになるかを列挙します

Bitmap プロパティ に代入すると、他の プロパティ は デフォルトに戻ります。
Color プロパティ に代入すると、ブラシのビットマップは Nil になり、ブラシスタイルが bsClear ならスタイルに bsSolid がセットされます。
Style プロパティ に代入すると、ブラシのビットパップは Nil になり、代入したスタイルが bsClear ならブラシの色が clWhite(デフォルト)にセットされます。
 

これらの相互作用は、ブラシの性質を考慮しています。つまり

 

ブラシの色はブラシのスタイルが BS_SOLID か BS_HATCHED の時しか 使われません。
ビットマップブラシを使用するときはブラシスタイル、 ブラシの色は無視されます。

以上の処置は余計なリソース(そして余分なGDIオブジェクト)を作らないようにするための処置と思われますが、勝手に プロパティ 値が変わってしまうのは困った仕様です。このような配慮は ブラシを管理する BrushManager 側でもできたはずなので、設計ミスといってよいでしょう。

2.4.4 Bitmap プロパティの使用時の注意事項

TBrush の Bitmap プロパティ は TBitmap型ですが、Bitmap プロパティ へビットマップを代入は、コピー(Assign)ではなく、オブジェクトの参照が代入されてしまいます!!。ビットマップを複数のブラシで共有したいためにこのようになっていると思われますが、取り扱いには十分な注意が必要です。TBitmap のオブジェクト参照を持つ TBrush のインスタンスが存在する限り、参照されている TBitmap のインスタンスを削除する危険です。

TBrush はビットマップを自動的に削除しないので、ビットマップの削除は別途行わなくてはなりませんが、論理ブラシの作成がどの時点行われるかよく見極めて、ビットマップの削除タイミングを決める必要があります。

最も安全方法は、ブラシを使い終わったら TBrush の Bitmap プロパティ を nil に設定してからビットマップを破壊することです。

論理ブラシが作られるとTBrush の Bitmap プロパティが指すビットマップは不要になりますので、すでに論理ブラシがTBrush内に作られていると確信が持てるときは早めに ビットマップを削除してしまってもかまいません。例えば Canvas.FillRect はブラシを使いますので、Canvas,Brush.Bitmap の指すビットマップは Canvas.FillRect 実行後は破棄しても大丈夫です。

最後に、Bitmap プロパティ に関してもう一つ注意があります。TBitmap は DDB(Device Dependent Bitmap)又はDIB(Device Independent Bitmap) を保持しますが。TBrush は論理ブラシを作るとき、Bitmapプロパティの指すTBitmap のインスタンスの Bitmapのビットマップ形式を強制的に DDB に変換します。いつのまにかビットマップ形式が変わってしまうので、注意してください。

戻る ホーム 上へ 進む

inserted by FC2 system