Rubrik: Dateisystem · Ordner & Verzeichnisse | VB-Versionen: VB4, VB5, VB6 | 24.04.03 |
Ordner im TreeView à la Explorer Alle Ordner eines Verzeichnisses im TreeView darstellen. Um die Perfomance zu steigern, werden jedoch nur die Ordner geladen, die man auch tatsächlich sehen kann! | ||
Autor: Hermann Klinke | Bewertung: | Views: 24.491 |
ohne Homepage | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | Beispielprojekt auf CD |
In einem unserer früheren Tipps ( Folder-TreeView im Eigenbau) wurde gezeigt, wie man ein TreeView-Steuerelement mit einem Mal mit allen Unterordner eines Verzeichnisses füllt. Diese Methode war sehr langsam. Zudem musste man, um das Verzeichnis zu aktualisieren, alles komplett neu laden.
Deshalb wurde dort schon aufgerufen, eine Methode zu entwickeln, um nur die Ornder zu laden, die man sehen konnte (und natürlich auch die Unterornder, da ja sonst das schöne "+" zu expandieren des Ordners fehlen würde).
Naja genug geredet Im nachfolgenden lernen Sie eine Methode kennen, die extrem schneller und flexibler ist, ja fast schon so schnell wie der Microsoft Explorer!
Hier die einzelnen Funktionen mit kurzen Beschreibungen:
- als sDirectory übergibt man das Verzeichnis das geladen werden soll
- als sImage übergibt man den Key des Bildes (am besten ein Ordner) einer ImageList
- sExpandedImage verhält sich wie oben und legt den Key für das Bild eines geöffneten Ordners fest
Fügen Sie nachfolgenden Code in ein Modul ein:
Option Explicit ' Diese Funktion lädt die erste Ebene eines ' Verzeichnisses und gibt die Nodes als Collectionen ' zurück Function LoadWithFolders(oTreeView As TreeView, _ sDirectory As String, _ sImage As String, _ sExpandedImage As String) As Collection Dim vFolder As Variant Dim oNode As Node Dim coNodes As New Collection Dim coFolders As New Collection ' Unterordner holen Set coFolders = GetSubFolders(sDirectory) For Each vFolder In coFolders ' jeden Ordner mit Bild dem TreeView hinzufügen Set oNode = oTreeView.Nodes.Add(, tvwLast, , vFolder, sImage) ' Icon setzen, wenn es aufgeklappt wird oNode.ExpandedImage = sExpandedImage Call coNodes.Add(oNode) Next vFolder Set LoadWithFolders = coNodes End Function
' Diese Funktion fügt alle Unterordner eines Verzeichnisses ' dem TreeView hinzu und das gleiche nochmal für jeden ' Unterordner (damit das '+' zum expandieren auch da ' ist) Function AddFolders(oTreeView As TreeView, _ oParentNode As Node, _ sDirectory As String, _ sImage As String, _ sExpandedImage As String) As Collection Dim x As Long Dim oChildNode As Node Dim coChildNodes As New Collection Set coChildNodes = AddSubFolders(oTreeView, oParentNode, _ sDirectory, sImage, sExpandedImage) ' Alle Verzeichnisse des Ordners hinzufügen For Each oChildNode In coChildNodes Call AddSubFolders(oTreeView, oChildNode, _ sDirectory & "\" & oChildNode.Text, _ sImage, sExpandedImage) Next oChildNode Set AddFolders = coChildNodes End Function
' Diese Funktion fügt alle Unterordner eines ' Verzeichnisses hinzu. ' Hierbei werden alle Nodes erstmal gelöscht, damit ' auch immer alles aktuell bleibt Function AddSubFolders(oTreeView As TreeView, _ oParentNode As Node, _ sDirectory As String, _ sImage As String, _ sExpandedImage As String) As Collection Dim vSubFolder As Variant Dim oNode As Node Dim coSubFolders As Collection Dim coChildNodes As New Collection Set coSubFolders = GetSubFolders(sDirectory) ' Childnodes löschen Call DeleteChildNodes(oTreeView, oParentNode) ' Hinzufügen aller Childnodes For Each vSubFolder In coSubFolders Set oNode = oTreeView.Nodes.Add(oParentNode, _ tvwChild, , vSubFolder, sImage) oNode.ExpandedImage = sExpandedImage Call coChildNodes.Add(oNode) Next vSubFolder Set AddSubFolders = coChildNodes End Function
' Diese Funktion löscht alle Childnodes eines ' Node-Objekts Sub DeleteChildNodes(oTreeView As TreeView, _ oNode As Node) Dim x As Long Dim oChildNode As Node Dim oNextNode As Node ' 1. Childnode Set oChildNode = oNode.Child For x = 1 To oNode.Children ' Nächstes Childnode "merken" Set oNextNode = oChildNode.Next ' Childnode löschen Call oTreeView.Nodes.Remove(oChildNode.Index) ' Gehe zu nächstem Childnode Set oChildNode = oNextNode Next x End Sub
' Diese Funktion ermittelt die Unterordner eines ' Verzeichnisses und gibt deren Namen in einer ' Collection zurück Function GetSubFolders(sDirectory As String) As Collection Dim sFolder As String Dim coSubFolders As New Collection If ExistDir(sDirectory) Then sFolder = Dir(sDirectory & "\*", vbDirectory) Do While sFolder <> vbNullString ' aus den alten DOS Zeiten, gibt es noch die ' Ordner, die einfach nur "." und ".." heißen. ' Diese werden hier aussortiert. If Left$(sFolder, 1) <> "." And ExistDir(sDirectory & "\" & sFolder) Then Call coSubFolders.Add(sFolder) End If ' nächsten Ordner sFolder = Dir Loop Set GetSubFolders = coSubFolders End If End Function
' Diese Funktion überprüft, ob es sich bei dem ' übergebenen Verzeichnis um einen existierenden ' Ordner handelt Function ExistDir(sdir As String) As Boolean ' Falls Verzeichnis nicht vorhanden ist On Error Resume Next ExistDir = ((GetAttr(sdir) And vbDirectory)) And (Err = 0) On Error GoTo 0 End Function
Beispiel:
- Platzieren Sie auf dem Formular ein TreeView-Control
- Platzieren Sie eine ImageList auf die Form, fügen ein Bild mit einem geschlossenem Ordner hinzu und legen als Key "OrdnerZu" fest
- Fügen Sie der ImageList ein weiteres Bild mit einem offenem Ordner hinzu und legen als Key "OrdnerOffen" fest
Option Explicit Private sDirectory As String Private Sub Form_Load() ' ImageList zuordnen Set TreeView1.ImageList = ImageList1 ' Startordner sDirectory = "c:" ' Alle Ordner in C: anzeigen Call LoadWithFolders(TreeView1, sDirectory, _ "OrdnerZu", "OrdnerOffen") End Sub
Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node) Call AddFolders(TreeView1, Node, _ sDirectory & "\" & Node.FullPath, _ "OrdnerZu", "OrdnerOffen") End Sub
Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) Call AddSubFolders(TreeView1, Node, _ sDirectory & "\" & Node.FullPath, _ "OrdnerZu", "OrdnerOffen") End Sub