TImageListのOverlay機能について

解決


kenda  2008-04-04 20:47:21  No: 30423

TImageListのOverlay機能についての質問です。

TreeView上のアイコンにオーバーレイ表示させようとしています。
あるデータの内容によってTreeView上のアイコンを変化させているため
TreeView.GetImageIndexにてアイコンのセットを行っています。

ここで以下のような形でOverlayアイコンをセットしているのですが
セット後にInvalidateさせないとOverlay表示を行いません。
GetImageIndexはTreeViewのノード描画毎に発生するので
毎回Invalidateするわけにはいかず困っています。

ImageList1.Overlay(10, 1); //10番目のアイコンをOverlayの1番にセット
Node.OverlayIndex := 1;

何か良い方法はないでしょうか?
よろしくお願いします。


ttt  2008-04-05 06:03:43  No: 30424

GetImageIndexと言っているのはOnGetImageIndex?
だとするとそのイベントに求められているのはあくまで
ImageIndexを変更することであって、他の無関係なプロパティを
いじっちゃいかんと思います。

実際、OnGetImageIndexが呼ばれるのはノードの(再)描画が
行われる時のわけですが、ImageIndexやOverlayIndexの変更
それ自体がノードの再描画を引き起こします。なので
OnGetImageIndex内でこれらを変更しても再描画が起こらないよう
ガードがかけられています。
逆に言えば、OnGetImageIndexの外で変更すれば適切に
必要な所だけ再描画が行われるはずです。

というわけで、そのデータの変化を検出したところでImageIndexと
OverlayIndexを変更してやればいいのではないでしょうか。


kenda  2008-04-08 19:04:09  No: 30425

お返事が遅くなりました。

>逆に言えば、OnGetImageIndexの外で変更すれば適切に
>必要な所だけ再描画が行われるはずです。

確かに再描画されない原因はご指摘の通りでした。
外から変更すれば再描画されました。

>というわけで、そのデータの変化を検出したところでImageIndexと
>OverlayIndexを変更してやればいいのではないでしょうか。

データの変化をリアルタイムに所得したいので
ノードの描画毎(OnGetImageIndex)にデータチェックを
行っているのですが、データチェック構造自体を見直す
必要がありそうですね。

どうもありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加