Public Tree As BTree 'The Tree created by Me
Public CTree As BTree 'The Tree created by Me
Public OCode As Object
Public CG As Integer
Public TreeN As Variant 'Label Array to contain the Info
Public ShapeN As Variant 'Shape Array: Circle
Public LineN As Variant 'Line Array to point to the "node"
Public DistDefault As Single
Public MaxLevel As Long
Public LastX() As Single
Public DistNodes() As Single
Public PosY() As Single
Public Sub ShowNodesInForm(MeForm As Form, TrN As Variant, ShpN As Variant, LnN As Variant)
If Tree.Valid = True Then
Dim i As Long
Set TreeN = TrN
Set ShapeN = ShpN
Set LineN = LnN
DistDefault = TreeN(0).Width
Set OCode = New OrdersCode
CTree = Tree
'MaxLevel = Tree.Height + 1 'Normal
MaxLevel = 4
ReDim LastX(MaxLevel)
ReDim DistNodes(MaxLevel)
ReDim PosY(MaxLevel)
For i = 1 To MaxLevel
DistNodes(i) = CalcDNode(Tree, i)
LastX(i) = CalcFirstX(DistNodes(i))
PosY(i) = 2 * DistDefault * (i - 1)
Next i
CG = 0
Tree.Node(Tree.Root).GraphNode = CG
TreeN(CG).Left = LastX(1)
TreeN(CG).Top = (Tree.Node(Tree.Root).Level - 1) * 2 * DistDefault
ShapeN(CG).Left = TreeN(CG).Left
ShapeN(CG).Top = TreeN(CG).Top
TreeN(CG).Top = TreeN(CG).Top + 90
TreeN(CG).Visible = True
TreeN(CG).Caption = Tree.Node(Tree.Root).Info(0)
ShapeN(CG).Visible = True
LineN(CG).Visible = False
CG = CG + 1
PreOrden Tree.Node, Tree.Root, OCode, "PrintNode"
Else
MsgBox "Error, not a valid Tree", vbCritical, "Error"
End If
End Sub
Public Function CalcFirstX(DistNodes As Single) As Single
If DistNodes = DistDefault Then
CalcFirstX = 0
Else
CalcFirstX = (DistNodes - 1 * DistDefault) / 2
End If
End Function
Public Function CalcDNode(Arbol As BTree, Nivel As Long) As Single
If MaxLevel - Nivel = 0 Then
CalcDNode = DistDefault
Else
CalcDNode = (2 * CalcDNode(Arbol, Nivel + 1)) + 1 * DistDefault
End If
End Function
Public Sub PreOrden(n() As BTNode, Num As Long, MyObject As Object, MyFun As String)
CallByName MyObject, MyFun, VbMethod, Num 'PreOrder
If n(Num).ChildLeft >= 0 Then PreOrden n(), n(Num).ChildLeft, MyObject, MyFun
If n(Num).ChildRight >= 0 Then PreOrden n(), n(Num).ChildRight, MyObject, MyFun
End Sub
'---- This is inside of a Class Module called "OrdersCode" ----
Public Sub PrintNode(Num As Long)
Dim Lvl As Long
With CTree
Lvl = .Node(Num).Level
If Lvl < MaxLevel Then
Dim Dist As Single
Dim ChL As Long
Dim ChR As Long
ChL = .Node(Num).ChildLeft
ChR = .Node(Num).ChildRight
If ChL <> -1 Then
Dist = (DistNodes(Lvl + 1) + 1 * DistDefault) / 2
.Node(ChL).GraphNode = CG
TreeN(CG).Left = TreeN(.Node(Num).GraphNode).Left - Dist
TreeN(CG).Top = (.Node(ChL).Level - 1) * 2 * DistDefault
ShapeN(CG).Left = TreeN(CG).Left
ShapeN(CG).Top = TreeN(CG).Top
LineN(CG).X1 = TreeN(CG).Left + (DistDefault / 2)
LineN(CG).X2 = TreeN(.Node(Num).GraphNode).Left + (DistDefault / 2)
LineN(CG).Y1 = TreeN(CG).Top
LineN(CG).Y2 = TreeN(.Node(Num).GraphNode).Top + (DistDefault / 2)
TreeN(CG).Top = TreeN(CG).Top + 90
TreeN(CG).Visible = True
TreeN(CG).Caption = .Node(ChL).Info(0)
ShapeN(CG).Visible = True
LineN(CG).Visible = True
CG = CG + 1
End If
If ChR <> -1 Then
.Node(ChR).GraphNode = CG
TreeN(CG).Left = TreeN(.Node(Num).GraphNode).Left + Dist
TreeN(CG).Top = (.Node(ChR).Level - 1) * 2 * DistDefault
ShapeN(CG).Left = TreeN(CG).Left
ShapeN(CG).Top = TreeN(CG).Top
LineN(CG).X1 = TreeN(CG).Left + (DistDefault / 2)
LineN(CG).X2 = TreeN(.Node(Num).GraphNode).Left + (DistDefault / 2)
LineN(CG).Y1 = TreeN(CG).Top
LineN(CG).Y2 = TreeN(.Node(Num).GraphNode).Top + (DistDefault / 2)
TreeN(CG).Top = TreeN(CG).Top + 90
TreeN(CG).Visible = True
TreeN(CG).Caption = .Node(ChR).Info(0)
ShapeN(CG).Visible = True
LineN(CG).Visible = True
CG = CG + 1
End If
End If
End With
End Sub