ツリービューにフォルダを階層表示しています。
例えば、あるノード1の下にたくさんのノードが存在していた場合に、
ノードが展開されている状態で、ノード1を閉じると(+マーククリック)、
スクロールして、ノード1の表示位置が変わるのですが、
その時に、ツリー表示の位置が変わってしまうので、そのクリック位置が選択されてしまいます。(+マーククリックではなくノードをダブルクリックだとうまくいきます。)
エクスプローラで同じことをしてみると、ノードを閉じた直後は、クリックイベントは、発生していないのか、ノードは、選択されることは、ありません。
VBでは、このような制御は、無理なのでしょうか?
VB6.0
Win2000
新規でテストした限りではエクスプローラと同じ動きのように思いますが…。
ノード1を閉じた時に、ノード1以下のフォルダが多く、スクロールして
表示位置が変わった場合でも、ノード1以下のフォルダを選択していない
限り選択中のフォルダは変わりませんでした。…しかし、それはエクスプローラ
でも同じ動きだと思います。
サンプルコードを提示して、どのノードが選択状態の時、どこをクリックした
時の動作について言っているのか具体的に教えてもらいたいです。
サンプルコードを書いてみました。
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が選択されてしまわないでしょうか?
以上のようですが、どうでしょうか?
再現しました。えーと、どうしましょうかねぇ。
スクロール後にクリックが有効な 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
ただし、今度は操作しているノードの下(子)に選択フォルダがある時に
閉じませんの、そこを調整する必要があります。
あ、もう一つ不具合がありました。
キーボードで Collapse が起こった時もフラグを立てないようにしないと
いけませんね。
Private Sub TreeView1_KeyDown(KeyCode As Integer, Shift As Integer)
mCollapse = False
End Sub
でいけるかな?…要テストという事で。他の方法も考えてみて下さい。
特攻隊長まるるうさまありがとうございます。
参考にして、見たいと思います。
ツイート | ![]() |