- Код: Выделить всё
Private Sub ParceGedCom(ByVal GedCom As String)
GedComArray = Split(GedCom, vbCrLf)
Dim i, j, bs1, bs2 As Integer
Dim tnNew As TreeNode
Dim tnParent As TreeNode
Dim collNode As New Collection
Dim c1, c2, c3 As String
tv.BeginUpdate()
tv.Nodes.Clear()
tnNew = tv.Nodes.Add(CType(NameFile(iFileName), String))
tnNew.Tag = "-1"
For i = 0 To GedComArray.GetUpperBound(0)
If GedComArray(i) <> "" Then
bs1 = GedComArray(i).IndexOf(" ")
bs2 = GedComArray(i).IndexOf(" ", bs1 + 1)
c1 = GedComArray(i).Substring(0, bs1)
If bs2 = -1 Then
c2 = GedComArray(i).Substring(bs1 + 1)
c3 = ""
Else
c2 = GedComArray(i).Substring(bs1 + 1, bs2 - bs1 - 1)
c3 = GedComArray(i).Substring(bs2 + 1)
End If
collNode.Add(tnNew, CType(i, String))
If c1 = tnNew.Tag Then
tnParent = CType(collNode.Item(CType(i, String)), TreeNode).Parent
ElseIf c1 > tnNew.Tag Then
tnParent = CType(collNode.Item(CType(i, String)), TreeNode)
ElseIf c1 < tnNew.Tag Then
For j = i To 0 Step -1
tnParent = CType(collNode.Item(CType(j, String)), TreeNode).Parent
If c1 >= tnParent.Tag Then
tnParent = tnParent.Parent
Exit For
End If
Next
End If
tnNew = tnParent.Nodes.Add(CType((c2 + " " + c3), String))
tnNew.Tag = c1
End If
Next
tv.EndUpdate()
tv.Nodes(0).Expand()
End Sub
Где GedCom:
0 HEAD
1 SOUR AGES
2 VERS 1.40
2 NAME AGES
2 CORP Daub EDV-Beratung
3 ADDR Glashuetter Weg 105
4 CONT 22889 Tangstedt
4 CONT Germany
1 DEST AGES
1 DATE 22 AUG 2005
1 CHAR ANSI
1 SUBM @SUBM@
1 FILE myfamily.ged
1 GEDC
2 VERS 5.5.1
2 FORM LINEAGE-LINKED
... и т.д.
Цифры в начале строк означают родительские отношения:
Если последующая больше предыдущей, то это ребенок.
Если они равны, то у них общий родитель.
Если последующая меньше предыдущей, то родителя нужно искать у вышестоящей строки с цифрой равной текущей.
Например, для строки "1 DEST AGES" родитель тот же, что и у "1 SOUR AGES", т е. это "0 HEAD"
TreeView - не самоцель. Может можно построить массив массивов?