コラム / テトリスぽいもの / 7



TForm1のpublic変数に、
TBitmap型の、BackScreenを追加してください。
 TForm1 = class(TForm)
   PaintBox1: TPaintBox;
   Timer1: TTimer;
 private
   { Private 宣言 }
 public
   { Public 宣言 }
   BackScreen:TBitmap;
 end;
BackScreenというのは、そのまんま、
裏画面です。
TBitmapというのは、なんでしょうか。
その名のとおり、画面系統のクラスなのはわかると思います。
しかし、
TImage,TPaintBox,TCanvas,TBitmap
とここまででも4つもでてきて、
そろそろワケわからないと思うので、
それぞれのクラスの継承関係を見て見ましょう。
あ、覚える必要はないですよ つーか無理wwww
TImage
TObject>TPersistent>TComponent>TControl>TGraphicControl>TImage
TImage.Canvas:TCanvas
TPaintBox
TObject>TPersistent>TComponent>TControl>TGraphicControl>TPaintBox
TPaintBox.Canvas:TCanvas
TCanvas
TObject>TPersistent>TCanvas
TBitmap
TObject>TPersistent>TInterfacedPersistent>TGraphic>TBitmap
TBitmap.Canvas:TCanvas
さて、コンポーネントのTImageとTPaintBoxは、
かなり似ている継承構造ですね。いうなれば兄弟です。
二人とも、TComponent>TControl>TGraphicControl の3世代を通ってます。
一方、TCanvasとTBitmapは、
TObject>TPersistent以降は違う家系になっています。
なんか見たら余計意味わかんなくなりました。
俺もちょっと混乱してきたぞ
しかし、TCanvas以外は、みんな最終的に、
プロパティーによってTCanvasを持っていることに注目です。
つまり、どいつもこいつも、なんだかんだいって、
画像の実体はTCanvasなんじゃないかあああああああああああああああああああ
なぜTBitmapを裏画面に使うか、ですが、
TCanvasの手続きにこんなのがあるからです。(ヘルプより転載
procedure Draw(X, Y: Integer; Graphic: TGraphic); 
Draw メソッドは,Graphic パラメータで指定したグラフィックを,座標(X, Y)で定義されるキャンバス上の位置に描画します。
つまり、Canvasに他の画像を描く関数として、
一番簡単なものとして、Drawがあるから、これを使うぜ!って意味です。
え?引数はTGraphicだろ って?
ふっふっふっふ だが、それが良い ニヤッ
TBitmapの家系図をもう一度見てみるのです。
TObject>TPersistent>TInterfacedPersistent>TGraphic>TBitmap
TBitmap.Canvas:TCanvas
TBitmapの親はTGraphicです!!!
子どもクラスは親クラスの全要素を受け継いでいるのですから、
TBitmapはTGraphicの全要素をもちろん持っています。
そこで、
「TGraphic型の引数として、TGraphicを継承した、TBitmapを渡せる」
という不思議な技が使えます。
型にうるさいDelphiなのに変なの><
んまぁ、これで、TCanvasに、TBitmapを転送するのは簡単なので、
TBitmapを裏画面に使う 理由がわかったと思います。
んじゃ、次回、
メインループを組んでみます。
早く何か結果を見たいですもんね@w@