|
Es kann mitunter sehr lange dauern, bis ein
TreeView-Steuerelement bis in die letzten Verästelungen der Knoten
gefüllt ist. Wenn etwa die Ordner-Struktur einer Festplatte
eingelesen werden soll, spielt da zudem nicht nur die nicht gerade
berauschende Performance des TreeView-Steuerelements eine Rolle,
sondern auch das Lesen der Festplatte dauert seine Zeit und
strapaziert die Geduld des Anwenders.
Wesentlich flotter geht das vonstatten, und außerdem auch noch
den Arbeitsspeicher entlastend, wenn Sie zunächst nur die oberste
Ebene der Ordnerstruktur bzw. einer beliebigen anderen
Knotenstruktur einlesen. Sie brauchen allerdings nicht auf die
Kennzeichnung mit dem Pluszeichen derjenigen Knoten zu verzichten,
die Unter-Ordner enthalten sollen.
Fügen Sie einfach einen Dummy-Knoten in diese Knoten ein. Und
wenn der Anwender (oder Ihr Code) den Knoten öffnet und das
Expand-Ereignis des TreeView-Steuerelements ausgelöst wird,
entfernen Sie diesen Dummy-Knoten wieder und füllen den geöffneten
Knoten mit dem ihm zugedachten Inhalt. Das kann dann zwar auch
wieder etwas dauern, wird aber von den Anwendern eher verschmerzt.
Sie können natürlich auch bei entsprechender Auslegung Ihrer
Anwendung nach dem ersten Füllen der obersten Ebene und der Anzeige
des TreeViews im Hintergrund nach und nach die Knoten füllen, etwa
durch einen separaten, in einen ActiveX-EXE-Server ausgelagerten
Programmfaden (Thread), während der Anwender bereits mit der
Anwendung arbeiten kann.
Das folgende Beispiel zeigt Ihnen, wie Sie solche Dummy-Knoten
einfügen und wieder entfernen. Damit die Wiederverwendung des
Prinzips ein wenig bequemer wird, habe ich den Code dazu in die
Prozeduren TvwAddDummyNode und TvwRemoveDummyNode eines
Standard-Moduls gepackt.
' z.B. in einem Form:
Private mKeys As Long
Private Sub Form_Load()
Dim i As Integer
Dim nNode As Node
With tvw.Nodes
For i = 1 To 5
mKeys = mKeys + 1
Set nNode = .Add(, , "I" & mKeys, "Node " & i, "folder")
TvwAddDummyNode tvw.Nodes, nNode
Next 'i
End With
End Sub
Private Sub tvw_Expand(ByVal Node As MSComctlLib.Node)
Dim i As Integer
Dim nNode As Node
TvwRemoveDummyNode tvw.Nodes, Node
With tvw.Nodes
For i = 1 To 5
mKeys = mKeys + 1
Set nNode = .Add(Node.Key, tvwChild, "I" & mKeys, _
"Node " & i, "folder")
TvwAddDummyNode tvw.Nodes, nNode
Next 'i
End With
End Sub
' Standard-Modul modDummyNodes:
Public Sub TvwAddDummyNode(Nodes As Nodes, Node As Node)
With Node
Nodes.Add .Key, tvwChild, "§" & .Key
End With
End Sub
Public Sub TvwRemoveDummyNode(Nodes As Nodes, Node As Node)
With Node
If .Children Then
With .Child
If Left$(.Key, 1) = "§" Then
Nodes.Remove .Key
End If
End With
End If
End With
End Sub
|