はじめまして。
TTreeNodeのStateIndexについて質問させてください。
TTreeViewのImagesとStateImagesにそれぞれTImageListを指定して
いるのですが、TTreeNodeのStateIndexが0のとき、なぜかイメージが
表示されないのです。(ImageIndexの場合は0でも表示されます)
これは正常なのでしょうか?
初歩的な質問で申し訳ないのですが、よろしくお願いします。
Delphi 6 Professionalを使っています。
StateIndexの変更は、TreeView_SetItemで処理されます。
これは、TreeView_SetItemの仕様ですね。
Index=0でもIndex=-1でも、TreeView_SetItemでは0が渡され、結果、表示されません。
同じく、TreeView_SetItemのStateに対して、12bitシフトした状態で渡されるため、1〜15までのイメージしか使えません。
にしのさん、アドバイスどうもありがとうございます。
もう少し質問させてください。
> これは、TreeView_SetItemの仕様ですね。
そうですか、仕様なのですね。
ヘルプには全く書かれていないのは、製造元も意図していない仕様
だから、でしょうか?
> Index=0でもIndex=-1でも、TreeView_SetItemでは0が渡され、結果、表示されません。
そうしますと、StateImagesで指定するTImageListの最初のイメージは
ダミーにしておけばよろしいのでしょうか?
よろしくお願いします。
ダミーでOKです。
意図していないかどうかはわかりませんが、ソースを見ると0以上の時に1引いて、TreeView_SetItemのstateに入れるときに1足しています。
もしかしたら、この1引くというのが要らないのかも。
1引かなければ、0が1になるので、0〜14の画像が使えますから。
ただ、StateIndexをTreeItemのチェック状態と考えれば、
0:チェックボックスなし
1:チェックボックスあり、チェックなし
2:チェックボックスあり、チェックあり
3:チェックボックスあり、チェックあり(灰色)
と、この程度しか使わないと思います(もちろん、使い方によってはもっと必要になりますが)。
なので、あまり細かく見ていないのかもしれません。
# 使用者がなんとかしろと・・・^^;
結構、そういうアラはありますよ。TComboBoxのItemsのObjectsに-1が入れられない(CB_ERRとかぶる)など。
> ソースを見ると0以上の時に1引いて、TreeView_SetItemのstateに入れるときに1足しています。
TTreeNode.SetStateIndexを確認してみました。
確かにそうなっていますね。
> もしかしたら、この1引くというのが要らないのかも。
試しにComCtrls.pasを開発しているプロジェクトのフォルダにコピーして
if Value >= 0 then Dec(Value);
をコメント化してみました。
これで、StateIndexが0の場合にイメージが表示されるのですが、
TImageListの2番目(インデックス1)のイメージになってしまいます。
Windowsはインデックスが1以上のイメージしか認識してくれないようですね。
> ダミーでOKです。
ダミーを入れておくことで対処しようと思います。
にしのさん、今回はどうもありがとうございました。
解決のチェックを忘れました。
ツイート | ![]() |