TImageListのOverlay機能についての質問です。
TreeView上のアイコンにオーバーレイ表示させようとしています。
あるデータの内容によってTreeView上のアイコンを変化させているため
TreeView.GetImageIndexにてアイコンのセットを行っています。
ここで以下のような形でOverlayアイコンをセットしているのですが
セット後にInvalidateさせないとOverlay表示を行いません。
GetImageIndexはTreeViewのノード描画毎に発生するので
毎回Invalidateするわけにはいかず困っています。
ImageList1.Overlay(10, 1); //10番目のアイコンをOverlayの1番にセット
Node.OverlayIndex := 1;
何か良い方法はないでしょうか?
よろしくお願いします。
GetImageIndexと言っているのはOnGetImageIndex?
だとするとそのイベントに求められているのはあくまで
ImageIndexを変更することであって、他の無関係なプロパティを
いじっちゃいかんと思います。
実際、OnGetImageIndexが呼ばれるのはノードの(再)描画が
行われる時のわけですが、ImageIndexやOverlayIndexの変更
それ自体がノードの再描画を引き起こします。なので
OnGetImageIndex内でこれらを変更しても再描画が起こらないよう
ガードがかけられています。
逆に言えば、OnGetImageIndexの外で変更すれば適切に
必要な所だけ再描画が行われるはずです。
というわけで、そのデータの変化を検出したところでImageIndexと
OverlayIndexを変更してやればいいのではないでしょうか。
お返事が遅くなりました。
>逆に言えば、OnGetImageIndexの外で変更すれば適切に
>必要な所だけ再描画が行われるはずです。
確かに再描画されない原因はご指摘の通りでした。
外から変更すれば再描画されました。
>というわけで、そのデータの変化を検出したところでImageIndexと
>OverlayIndexを変更してやればいいのではないでしょうか。
データの変化をリアルタイムに所得したいので
ノードの描画毎(OnGetImageIndex)にデータチェックを
行っているのですが、データチェック構造自体を見直す
必要がありそうですね。
どうもありがとうございました。
ツイート | ![]() |