■ 4月28日 (月)
◆ 「ばからっく」
バート・バカラックのベスト・アルバムが発売されているのを発見。
『スウィート・メロディーズ ( Sweet Melodies ) 』
/ワーナー・ミュージック・ジャパン
バート・バカラックの名前を知らなくても、映画やCMなどで氏の曲は知っている、とゆー方は沢山いると推測する。
「雨にぬれても」と「ニューヨーク・シティ・セレナーデ」が原曲のまま(ほとんどの曲が原曲のまま)一緒に入っているとゆーことなので、即購入。
拝聴するとさすがに古い音の曲もあるが、満足である。
中にはやはり、曲は知っていても曲名を知らなかったものが。
(「恋の面影」「世界は愛を求めている」「素晴らしき恋人たち」など)
感動。
◆ 「 Delphi 備忘録」
今まで、マジメに Delphi アプリを作ったことが無かったので、ポチポチといじっていると、妙なトコロで詰まってしまうのである。
色々と試したり、ソースを見て、一つずつ理解しようと努めているのであるが、私の場合「解決すると忘れてしまう」とゆー悪い癖があるので、備忘録がわりにここへ記しておく。
今回は、 TBitmap オブジェクトについて。
便利な TBitmap も、使うには色々とコツが必要なようである。
例えば、あるグラフィック Image を退避させるのに使うとき。
var
TmpBitmap : TBitmap;
begin
// ビットマップ・テンポラリの確保
TmpBitmap := TBitmap.Create;
TmpBitmap.Width := 16;
TmpBitmap.Height := 16;
// エリア・グラフィックの退避
TmpBitmap.Canvas.CopyRect(Rect( 0 , 0 , 16 , 16 ),
MapDisp.Canvas,
Rect( xp , yp , xp+16 , yp+16 ));
end;
CopyRect メソッドで退避(矩形コピー)する前に、 TBitmap オブジェクトを確保し、 Width プロパティと Height プロパティを設定。 (このソースの場合 16x16 dot )
今回、 Create で確保したは良いが、 Width と Height プロパティの設定とゆーものを忘れた為、 1x1 dot が引き延ばされてコピーされるばかりで頭を抱えた。(笑)
このアプリでは、 Image コントロールに表示された「エリア・マップ」をクリックすると、クリックしたエリアに「カーソル・ポインタ(矢印)」が表示されるプロシージャに使用している。
///// マップのカレントエリアを選択
procedure TMainForm.PointArea(ar: Integer);
var
ax , ay : Integer;
Tmp0Bitmap : TBitmap;
frRect , toRect : TRect;
begin
Tmp0Bitmap := TBitmap.Create;
Tmp0Bitmap.Width := 16;
Tmp0Bitmap.Height := 16;
ax:=area[ar].xp; ay:=area[ar].yp;
// エリア・グラフィックの退避
toRect := Rect( 0,0,16,16 );
frRect := Rect( ax-8,ay-16,ax-8+16,ay-16+16 );
Tmp0Bitmap.Canvas.CopyRect(toRect,MapDisp.Canvas,frRect);
// カーソルポインタの消去(退避したエリア・グラフィックの上書き)
toRect := Rect( area[CrArea].xp-8,area[CrArea].yp-16,
area[CrArea].xp-8+16,area[CrArea].yp-16+16 );
frRect := Rect( 0,0,16,16 );
MapDisp.Canvas.CopyRect(toRect,TmpBitmap.Canvas,frRect);
// エリアにカーソル・ポインタ(矢印)のパターンを描く
BitBlt(MapDisp.Canvas.Handle,ax-8,ay-16,
16,16,MapChipImg.Canvas.Handle,0,160,SRCERASE);
BitBlt(MapDisp.Canvas.Handle,ax-8,ay-16,
16,16,MapChipImg.Canvas.Handle,16,160,SRCINVERT);
// マップ・グラフィック再表示( Reflesh より Invalidate )
MapDisp.Invalidate;
// 退避したエリアグラフィックを確保(次回にカーソルを消すため)
TmpBitmap.Assign(Tmp0Bitmap);
// ビットマップ・テンポラリ解放
Tmp0Bitmap.Free;
// カレントエリアを変更
CrArea := ar;
end;
ちょっと(かなり)ムダなことをしているが、
「一時 Bitmap テンポラリを確保」→
「これからカーソルを表示するエリアの一部を、一時 Bitmap テンポラリに退避」→
「今までカーソルを表示していた所へ、退避用 Bitmap テンポラリから矩形コピー (カーソルを消す)」→
「カーソルを描く (何故か BitBlt による)」→
「マップを表示している Image コントロールを再表示 (全体を描き換える Reflesh ではなく Invalidate を使っている)」→
「一時 Bitmap テンポラリから、退避用 Bitmap テンポラリへデータを移動 ( Assign メソッドを使用する)」→
「一時 Bitmap テンポラリを解放」
とゆー具合に、カーソルを消すのに TBitmap オブジェクトを使用している。
ここの場合、 TBitmap から TBitmap へデータを移動するとき、「 Assign メソッド」を使用するということに気付くのが遅れたのである。
あと、 Rect (矩形)の指定で 16x16 dot の指定をする時に、 (0,0,15,15) ではなく、 (0,0,16,16) とゆートコロ。(笑)
このソースは、 TBitmap 使用の練習を兼ねている。
良い子は、作業用の Image コントロール(不可視)に描き込んで、終わったら丸ごと表示用 Image コントロール(可視)に転送するが、よろしいかもしれぬ。
///// このフォームを閉じるとき
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// TBitmap 解放
TmpBitmap.Free;
end;
あとは、アプリを終わらせる時(もしくはフォームを閉じる時)、忘れずにオブジェクトを解放である。
めでたしめでたし。
◆ 「 Delphi 備忘録 2」
先ほどのように1つの Image コントロールをいじくって、ちまちまと色々なものを表示していると、ちらつきがひどくなることがある。
// フォーム全体を描画する際の明滅を防ぐ。
procedure TMainForm.WMEraseBkgnd(var m : TWMEraseBkgnd);
begin
m.Result := LRESULT(False);
end;
とのプロシージャを追加すると、 WMEraseBkgnd とゆー Windows API を呼び出して TMainForm の頻繁な再描画を避けてくれる。
……ハズなのだが、今回の Image コントロールのちらつきは抑えられず。
しょーがないので、 FormCreate の一節に、
// このフォーム描画時のちらつきを無くす
MainForm.DoubleBuffered := True;
の一文を追加して、フォームの DoubleBuffered プロパティを True に。
メモリをガバチョと食う、オススメできないとりあえずの手段なのだが、まぁ完成を第一に考えたアプリなので、よしとする。
実際、効果てきめんで、クリックするたびに明滅していた Image コントロールは静かになったのである。
ズバッと解決。
……出来ていない面はある。
◆ 「同じようなことを」
つらつらと過去の日記を読んでいたら、
昨年この月にも Delphi をいじっていたことを発見する。
うむむ。 この時期はプログラムしたくなる季節なのであらうか。
さらにまた、今年と昨年も同じソースをいじっているのが、ちと泣けるのである。
前回いじっていた時は、 ListBox コントロールにテキストとグラフィックを混在させるのが面白くなってしまい色々と試していたら、別の関係で忙しくなってしまいプログラミングを中断。
……して、そのまま半分忘れさっていたのである。
とほほ。
|