ツリービューのチェックボックスについて

解決


ハル  2006-04-28 00:02:53  No: 131157

はじめまして。よろしくお願い致します。

ツリービューのチェックボックスのチェック可/不可の設定を、Nodeごとに行いたいと
思うのですが、可能でしょうか?

色々検索してみたところ、NodeCheckイベントでNodeを取得し、チェック不可の場合は
MouseUpイベントでNodeのCheckedプロパティをFalseにする、という方法を見つけましたが、
実行すると一瞬チェックが入るのが気になります。
他にいい方法があれば、教えて下さい。

VB6(SP5)です。


特攻隊長まるるう  2006-04-28 04:07:03  No: 131158

普通に考えれば NodeCheck で問答無用に .Checked = False にして
チェック可の場合に MouseUp イベントで Node の Checked プロパティ
を True にするのを試すんだけど、NodeCheck イベント内での Checked
プロパティ変更が効かないヘボい作りみたいなので無理矢理な方法か
技術レベルの高い方法になりそうな気がします。

>色々検索してみたところ
それって過去ログ?MouseUp を使ってるのでそのコードを書いた人は
同じ問題に気づいてると思います。正確なコードやコードについての
説明が知りたいです。
公開できませんか?(もしくはリンク貼れませんか?)

# ところで Node 選択後、キーボードのスペースキーには対応しないん
ですか?まぁ、別の内容になるかもしれませんが、書いてあってもいい
内容かと思います。


ハル  2006-04-28 17:56:19  No: 131159

特攻隊長まるるう様、さっそくのご回答ありがとうございます。

> それって過去ログ?MouseUp を使ってるのでそのコードを書いた人は
> 同じ問題に気づいてると思います。正確なコードやコードについての
> 説明が知りたいです。
> 公開できませんか?(もしくはリンク貼れませんか?)

↓こちらを参考にしました。
http://www.gizshare.com/vbtomo/boards/vbqanda.php?do=spread&num=10031

> # ところで Node 選択後、キーボードのスペースキーには対応しないん
> ですか?まぁ、別の内容になるかもしれませんが、書いてあってもいい
> 内容かと思います。

スペースキーを押してもチェックが入るのですね。
すみません、知りませんでした。
こちらは、MouseDownイベントではじくことで対応できました。


特攻隊長まるるう  2006-04-28 21:22:18  No: 131160

>こちらは、MouseDownイベントではじくことで対応できました。
多分、KeyDown か KeyPress だろうな…w。

隣りの掲示板でも見つけたけど
http://madia.world.coocan.jp/vb/vb_bbs/200309_03090017.html
うーん。やっぱり問題があるって事だけは分かったけど解決法の
参考にはならなかったか…。自分で考えるしかなさそうねぇ。

クリックされた以降のイベントで修正しても、一瞬チェックされる
のは回避できないでしょう。もっと前の、どの段階かでマウスが
クリックされたことをブロックするか、命令を上書きする必要が
ありそうです。

[即興で考えた無理矢理の方法]
こちらの環境ではそれなりに動きましたが、実はうまく動作しなくても
不思議じゃないコード…。ブロックできてるわけじゃなくて、フォーカス
が移動しちゃうから、その後の処理がうやむやになってくれるような気が
する…(適当)。クリックイベントとか発生しなくなるから、何かイベントで
処理してたら自前でどうにかする必要があるでしょう。
[Vb6.0]
Private Const チェック不可 As Boolean = True
Private Sub TreeView1_MouseDown(Button As Integer _
                               , Shift As Integer _
                               , x As Single, y As Single)
    Dim w_Node As MSComctlLib.Node
    
    If Button = vbLeftButton Then
        With TreeView1
            Set w_Node = .HitTest(x, y)
            If w_Node Is Nothing Then
                Debug.Print "Nothing"
            Else
                Debug.Print w_Node.Text
                If チェック不可 = True Then
                    Set .DropHighlight = w_Node
                    Set .SelectedItem = w_Node
                    w_Node.Checked = False
                    .Enabled = False
                    .Enabled = True
                    .SetFocus
                End If
            End If
        End With
    End If
End Sub

[技術レベルの高い方法]はシステムのマウスがクリックされたメッセージに
割り込む方法です。
『ローカルフック  マウス』辺りをキーワードにぐーぐる検索してみてください。


ハル  2006-04-29 01:26:11  No: 131161

試してみたところ、一瞬チェックが付いてしまう現象はなくなりました。
フォーカスの移動の対策と、どうしてEnabledプロパティを一旦Falseに設定する
のかがわからないのですが、調べてみることにします。
とても助かりました。
特攻隊長まるるう様、ありがとうございました。


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

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






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