2004/08/22(日)Delphi ListView挙動色々

・ListView.Canvas.Brush.Color

等を変更した場合、

ListView.Canvas.Refreshしないと反映されないことがある。再現性は不明。とりあえず、心に留めてテスとしながら作っていくほか無いようだ。

・ListViewにはDoubleBufferedプロパティがある。結構ちらつきに効きます。こんなの知らなきゃ分からないですよ。

・Brush.Style を bsCross等にして、ListView.Canvas.FillRectするとなぜか十字線の隙間が真っ黒に!
Pen.StyleをpsClear(透明)にして、Canvas.Rectangleするしかなさそう…… 何だろうこの仕様。

・ListViewのデフォルトの表示に何か付け足そうと思ったら、すなおにListView1.CustomDrawItemを全部書いた方がよい。なぜかというと、ListView本来の描画に重ね書きするのは存外に難しいのだ。この際、OwnerDraw := True, OwnerData := True, で、OnDataには何も書く必要はない(OnDataは本来のListViewの表示にオリジナルのデータを載せたいときのもの)。CustomDrawItemで、DefaultDrawをFalseにしておく。

・OwnerData等の時、OnSelectItemで送られてきたItemのItem.Indexを取るとAccessViolationするようだ。仕様は不明だが、OnMouseDown等で座標から辿るか、ListView1.Focuced等で逆から辿ることで代用する。

・ListViewでOnColumnClickが2回連続で発生してしまっていた問題。原因はListViewのWndProc(ウィンドウプロシージャ)をオリジナルの物で上書きしていたから。これは、確か多値チェックを実現するために導入したはずだったが、現在は必要なくなっていた。この部分を削除すると正常に1回発生に戻った。他のイベントが正常だったため原因の切り分けに時間がかかった。起こらないようにするための手法は分かっていない。WINDOWS APIをよく理解していない所為で、本来なら真っ先に勉強しなきゃいけないのだが、今そんな時間がない。分からなくてもやっていくしかない。
OK キャンセル 確認 その他