ツリービューのノードを閉じたときに選択されてしまうのを防ぐには?

解決


YUU  2005-05-13 01:58:50  No: 121592

ツリービューにフォルダを階層表示しています。
例えば、あるノード1の下にたくさんのノードが存在していた場合に、
ノードが展開されている状態で、ノード1を閉じると(+マーククリック)、
スクロールして、ノード1の表示位置が変わるのですが、
その時に、ツリー表示の位置が変わってしまうので、そのクリック位置が選択されてしまいます。(+マーククリックではなくノードをダブルクリックだとうまくいきます。)

エクスプローラで同じことをしてみると、ノードを閉じた直後は、クリックイベントは、発生していないのか、ノードは、選択されることは、ありません。

VBでは、このような制御は、無理なのでしょうか?

VB6.0
Win2000


特攻隊長まるるう  2005-05-13 21:24:36  No: 121593

新規でテストした限りではエクスプローラと同じ動きのように思いますが…。
ノード1を閉じた時に、ノード1以下のフォルダが多く、スクロールして
表示位置が変わった場合でも、ノード1以下のフォルダを選択していない
限り選択中のフォルダは変わりませんでした。…しかし、それはエクスプローラ
でも同じ動きだと思います。

サンプルコードを提示して、どのノードが選択状態の時、どこをクリックした
時の動作について言っているのか具体的に教えてもらいたいです。


YUU  2005-05-16 18:26:20  No: 121594

サンプルコードを書いてみました。

Option Explicit

Private Sub Form_Load()
        
    Dim i As Integer
    
    Form1.Height = 8000
    Form1.Width = 8000
    TreeView1.Top = 0
    TreeView1.Left = 0
    TreeView1.Height = 7000
    TreeView1.Width = 7000
    TreeView1.LineStyle = tvwRootLines
    
    Call TreeView1.Nodes.Add(, , "top", "top", "Folder")
    Call TreeView1.Nodes.Add(, , "top2", "top2", "Folder")
    Call TreeView1.Nodes.Add("top", tvwChild, "root", "root", "Folder")
    Call TreeView1.Nodes.Add("top", tvwChild, "root2", "root2", "Folder")
    
    For i = 0 To 50
        Call TreeView1.Nodes.Add("root", tvwChild, "a1" & i, i & "1000", "Folder")
    Next

    For i = 0 To 50
        Call TreeView1.Nodes.Add("root2", tvwChild, "a2" & i, i & "1000", "Folder")
    Next
    
    For i = 0 To 50
        Call TreeView1.Nodes.Add("a11", tvwChild, "41000\a" & i, i & "2000", "Folder")
    Next

End Sub

1.プログラム起動後、top2を選択します。
2.topのプラスを押し、ノードを展開します。
3.さらに、その下のrootのプラスを押し、ノードを展開します。
4.rootのプラスを押し、ノードを閉じます。
5.その時に、topが選択されてしまわないでしょうか?

以上のようですが、どうでしょうか?


特攻隊長まるるう  2005-05-16 19:45:39  No: 121595

再現しました。えーと、どうしましょうかねぇ。
スクロール後にクリックが有効な Node 上にカーソルが移動する
状態で発生しますね。
エクスプローラの場合、展開(Expand)の時は、そのフォルダが
表示の一番上部に移動するようスクロールするけど、閉じる時に
スクロールしませんね。
[VB6.0]のツリービューでもスクロール後にクリックが有効でない
場所に移動すれば問題ない…(例えばサンプルで root も root2 も
展開した後、root2 の操作では起こらない)。

うーん。色々と制御方法はあると思うけど、例えば
[VB6.0]
Option Explicit

Private mSelectNode As Node
Private mCollapse As Boolean

Private Sub Form_Load()
    Dim i As Integer
    
    '/////////////////////
'    Form1.Height = 8000
'    Form1.Width = 8000
    Me.Height = 8000
    Me.Width = 8000
    '/////////////////////
    TreeView1.Top = 0
    TreeView1.Left = 0
    TreeView1.Height = 7000
    TreeView1.Width = 7000
    TreeView1.LineStyle = tvwRootLines
    '/////////////////////
    TreeView1.ImageList = ImageList1
    '/////////////////////
    
    Call TreeView1.Nodes.Add(, , "top", "top", "Folder")
    Call TreeView1.Nodes.Add(, , "top2", "top2", "Folder")
    Call TreeView1.Nodes.Add("top", tvwChild, "root", "root", "Folder")
    Call TreeView1.Nodes.Add("top", tvwChild, "root2", "root2", "Folder")
    
    For i = 0 To 50
        Call TreeView1.Nodes.Add("root", tvwChild, "a1" & i, i & "1000", "Folder")
    Next

    For i = 0 To 50
        Call TreeView1.Nodes.Add("root2", tvwChild, "a2" & i, i & "1000", "Folder")
    Next
    
    For i = 0 To 50
        Call TreeView1.Nodes.Add("a11", tvwChild, "41000\a" & i, i & "2000", "Folder")
    Next

End Sub

Private Sub TreeView1_Click()
    mCollapse = False
End Sub

Private Sub TreeView1_Collapse(ByVal Node As MSComctlLib.Node)
    Debug.Print "Collapse " & Node
    mCollapse = True
End Sub

Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
    Debug.Print "Expand " & Node
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
    Debug.Print "NodeClick " & Node
    
    If mCollapse _
    And True Then
        '↑ここにノードが子でない条件が必要
        mCollapse = False
        mSelectNode.Selected = True
        Exit Sub
    End If
    
    Set mSelectNode = Node
End Sub

ただし、今度は操作しているノードの下(子)に選択フォルダがある時に
閉じませんの、そこを調整する必要があります。


特攻隊長まるるう  2005-05-16 19:54:20  No: 121596

あ、もう一つ不具合がありました。
キーボードで Collapse が起こった時もフラグを立てないようにしないと
いけませんね。
Private Sub TreeView1_KeyDown(KeyCode As Integer, Shift As Integer)
    mCollapse = False
End Sub
でいけるかな?…要テストという事で。他の方法も考えてみて下さい。


YUU  2005-05-17 02:34:19  No: 121597

特攻隊長まるるうさまありがとうございます。
参考にして、見たいと思います。


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

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






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