> 質問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
このサンプルでわからない所があれば、聞いていただければ お答えします。
|