Re[3]: TreeViewについて


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by Uz on 2001/08/06 05:52:14

In Reply to: Re[2]: TreeViewについて Posted by MASA on 2001/08/05 23:27:56


    > 質問1.名前のソートをする際は、名称の一文字目をコードに
    > 変換して、コード順にソートしていいものでしょうか?
    ??どういうことでしょうか?
    コードって文字の辞書順って事でしょうか?
    とりあえず、以下のサンプルを試してください。
    ソートに関しては、SortNodes関数の中でソート処理を
    自前でしているので、なんとでもなるでしょう。

    > 質問2. Add等のコマンドを使用することで、
    > 代入できるのですが、
    > Dim nodX As Node
    >      Set nodX = TreeView1.Nodes.Add(,,"dad","マイク")
    > と言うやり方と
    >
    > Set nodX = Treeview1.selecteditem
    > Set TreeView1.nodes(Mykey).Parent = NodX
    >
    > というやり方の二種類があります。
    > 後者のやり方だと、最初にドラッグして選択しておいたものを
    > ドロップ先にそのままの形で送れるのですが、ただし指定され
    > たものを親にしかできず困っています。
    ん〜ん、多分ちょっと使い方がまずいんじゃぁ無いかな?
    以下のサンプルでは、この方法を取りました。
    うまくいっていると思います。

    > この2種類のやり方しかないと思っているのですが、
    > 前者のやり方で何とか指定した場所の前にアイテムを送ろうと
    > 考えています。ところが、
    > For文等で一個ずつ選択を変えたりしている内に、
    > 循環参照をしていますというエラーが出てしまったために
    > 断念をしてしまいました。
    >
    > この循環参照とはいったい何なのでしょうか?
    「循環参照」ってのは、字の如く「循環する参照」で
    Set nodeP.Parent = nodeP
    のように自分の親を自分に使用としたり、
    親をたどっていくと、自分に帰ってくるとかで、参照が循環
    してしまうような状態です。
    多分、ノードをあれこれしているうちにそうなってるのでしょう。

    とりあえず、サンプル(動作確認:VB6sp4,Win2k)を用意したので、
    以下のコードをお試しください。
    D&D関連とソート関連はこれで、出来ていると思います。
    (ほかは出来てるようなので、省いています。)


    ' Form
    Option Explicit

    Private nodeDrag As Node
    Private nodeDrop As Node
    Private bExpandByCode As Boolean

    Private Sub SortNodes(nodeObj As Node)
    Dim nodeP As Node
    Dim nodeW As Node
    Dim nodeC As Node
    Dim colNodes As Collection
    Dim I As Long

    Set nodeP = nodeObj
    If Left$(nodeP, 1) = "C" Then
    Exit Sub
    End If

    Set colNodes = New Collection

    Set nodeW = nodeP.Child
    While Not (nodeW Is Nothing)
    For I = 1 To colNodes.Count
    Set nodeC = colNodes(I)
    If nodeW.Text < nodeC.Text Then
    Exit For
    End If
    Next
    If I <= colNodes.Count Then
    Call colNodes.Add(nodeW, , I)
    Else
    Call colNodes.Add(nodeW)
    End If

    Set nodeW = nodeW.Next
    Wend

    For I = colNodes.Count To 1 Step -1
    Set nodeW = colNodes(I)
    Set nodeW.Parent = nodeP
    Debug.Print nodeW.Key
    Next

    Set colNodes = Nothing
    End Sub

    Private Sub Form_Load()

    Dim nodX As Node

    Set nodX = TreeView1.Nodes.Add(, , "R", "ルート")
    Set nodX = TreeView1.Nodes.Add("R", tvwChild, "P1", "親 1")
    Set nodX = TreeView1.Nodes.Add("P1", tvwChild, "C1", "子 1")
    Set nodX = TreeView1.Nodes.Add("P1", tvwChild, "C2", "子 2")
    Set nodX = TreeView1.Nodes.Add("P1", tvwChild, "C3", "子 3")
    Set nodX = TreeView1.Nodes.Add("R", tvwChild, "P2", "親 2")
    Set nodX = TreeView1.Nodes.Add("P2", tvwChild, "C4", "子 4")
    Set nodX = TreeView1.Nodes.Add("P2", tvwChild, "C5", "子 5")
    Set nodX = TreeView1.Nodes.Add("P2", tvwChild, "C6", "子 6")
    Set nodX = TreeView1.Nodes.Add("R", tvwChild, "P3", "親 3")
    Set nodX = TreeView1.Nodes.Add("P3", tvwChild, "C7", "子 7")
    Set nodX = TreeView1.Nodes.Add("P3", tvwChild, "C8", "子 8")
    Set nodX = TreeView1.Nodes.Add("P3", tvwChild, "C9", "子 9")

    bExpandByCode = True

    TreeView1.Nodes("R").Expanded = True
    TreeView1.Nodes("P1").Expanded = True
    TreeView1.Nodes("P2").Expanded = True
    TreeView1.Nodes("P3").Expanded = True
    TreeView1.Style = tvwTreelinesText ' スタイルを 4 に設定します。
    TreeView1.BorderStyle = vbFixedSingle
    TreeView1.OLEDropMode = ccOLEDropManual
    TreeView1.Sorted = True

    bExpandByCode = False

    Set nodeDrag = Nothing
    End Sub

    Private Sub TreeView1_Collapse(ByVal Node As MSComctlLib.Node)
    If bExpandByCode Then
    ' コードによる展開
    Exit Sub
    Else
    ' DblClickによる展開
    bExpandByCode = True
    Debug.Print Node.Tag
    If Node.Tag = "Sorted" Then
    ' ソート済みなので閉じる
    Node.Expanded = False
    Else
    ' ソートを行う
    Call SortNodes(Node)
    Node.Tag = "Sorted"
    End If
    bExpandByCode = False
    Exit Sub
    End If
    End Sub

    Private Sub TreeView1_DblClick()
    Debug.Print TreeView1.SelectedItem.Text
    End Sub

    Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
    If bExpandByCode Then
    ' コードによる展開
    Exit Sub
    Else
    ' DblClickによる展開
    bExpandByCode = True
    Node.Expanded = True
    bExpandByCode = False
    Exit Sub
    End If
    End Sub

    Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
    If Button = vbLeftButton Then
    Set TreeView1.SelectedItem = TreeView1.HitTest(x, y)
    Set nodeDrag = TreeView1.SelectedItem
    Call TreeView1.OLEDrag
    End If
    End Sub

    Private Sub TreeView1_OLEDragDrop(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single)
    Dim nodeP As Node
    Dim nodeW As Node
    Dim colNodes As Collection
    Dim I As Long

    Call DataOutput(TreeView1.DropHighlight, Text2, "Drop Item Info")

    Set nodeDrop = TreeView1.DropHighlight
    If nodeDrop Is Nothing Then
    Exit Sub
    End If

    If Left$(nodeDrop.Key, 1) = "P" And Left$(nodeDrag.Key, 1) = "P" Then
    Set nodeP = TreeView1.Nodes("R")
    Set nodeDrag.Parent = TreeView1.Nodes("R")
    ElseIf Left$(nodeDrop.Key, 1) = "P" And Left$(nodeDrag.Key, 1) = "C" Then
    Set nodeP = TreeView1.Nodes(nodeDrop.Key)
    Set nodeDrag.Parent = TreeView1.Nodes(nodeDrop.Key)
    ElseIf Left$(nodeDrop.Key, 1) = "C" And Left$(nodeDrag.Key, 1) = "C" Then
    Set nodeP = TreeView1.Nodes(nodeDrop.Key).Parent
    Set nodeDrag.Parent = TreeView1.Nodes(nodeDrop.Key).Parent
    End If

    Debug.Print nodeP.Text

    Set colNodes = New Collection
    Set nodeW = nodeP.Child
    While Not (nodeW Is Nothing)

    If nodeW.Key = nodeDrop.Key Then
    Call colNodes.Add(nodeDrag)
    End If

    If nodeW.Key <> nodeDrag.Key Then
    Call colNodes.Add(nodeW)
    End If

    Set nodeW = nodeW.Next
    Wend

    For I = colNodes.Count To 1 Step -1
    Set nodeW = colNodes(I)
    Set nodeW.Parent = nodeP
    Debug.Print nodeW.Key
    Next

    nodeP.Tag = "Unsorted"

    Set TreeView1.DropHighlight = Nothing

    Set colNodes = Nothing
    End Sub

    Private Sub TreeView1_OLEDragOver(Data As MSComctlLib.DataObject, Effect As Long, Button As Integer, Shift As Integer, x As Single, y As Single, State As Integer)
    Debug.Print "OLEDragOver"
    Effect = vbDropEffectMove

    Set TreeView1.DropHighlight = TreeView1.HitTest(x, y)
    End Sub

    Private Sub TreeView1_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)
    If nodeDrag Is Nothing Then
    Exit Sub
    End If

    Debug.Print "OLEStartDrag"
    AllowedEffects = vbDropEffectMove
    Call Data.SetData(nodeDrag.Key, vbCFText)
    Call DataOutput(TreeView1.SelectedItem, Text1, "Drag Item Info")
    End Sub

    Private Sub DataOutput(nodeObj As Node, txtBox As TextBox, sMsg As String)
    If nodeObj Is Nothing Then
    txtBox.Text = "Nothing"
    Exit Sub
    End If
    With txtBox
    .Text = sMsg & vbCrLf
    .Text = .Text & "----------------------------------" & vbCrLf
    .Text = .Text & "Text:" & nodeObj.Text & vbCrLf
    .Text = .Text & "Key:" & nodeObj.Key & vbCrLf
    .Text = .Text & "Tag:" & nodeObj.Tag & vbCrLf
    End With
    End Sub


    このサンプルでわからない所があれば、聞いていただければ
    お答えします。


記事スレッド一覧