vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2015
 
zurück
Rubrik: Dateisystem · Ordner & Verzeichnisse   |   VB-Versionen: VB4, VB5, VB620.05.03
Ordner im TreeView à la Explorer 2

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 KlinkeBewertung:     [ Jetzt bewerten ]Views:  21.749 
ohne HomepageSystem:  Win9x, WinNT, Win2k, WinXP, Vista, Win7, Win8 Beispielprojekt auf CD 

Summer-Special bei Tools & Components!
Gute Laune Sommer bei Tools & Components
Top Summer-Special - Sparen Sie teilweise über 100,- EUR
Alle sev-Entwicklerkomponenten und Komplettpakete jetzt bis zu 25% reduziert!
zum Beispiel:
  • Developer CD nur 455,- EUR statt 569,- EUR
  • sevDTA 2.0 nur 224,30 EUR statt 299,- EUR
  •  
  • vb@rchiv   Vol.6 nur 18,70 EUR statt 24,95 EUR
  • sevCoolbar 3.0 nur 58,70 EUR statt 69,- EUR
  • - Werbung -Und viele weitere Angebote           Aktionspreise nur für kurze Zeit gültig

    Vor kurzem haben wir Ihnen einen Code vorgestellt, mit dem sich schnell alle Ordner eines Laufwerks in einem TreeView-Control anzeigen lassen. Dieser Tipp wurde nun nochmals überarbeitet und ist jetzt nocht effizienter und schneller.

    Ab sofort werden "Dummys" eingesetzt, die nur dafür da sind, damit das '+'-Zeichen erscheint. Dadurch wird das öffnen des Ordner beschleunigt, da man diesmal wirklich nur das laden muss, was man auch sehen kann. Zusätzlich gibt es im Beispiel eine Fehlerroutine, die einen Ordner aus dem TreeView löscht, der angezeigt wird, aber nicht mehr vorhanden ist. Durch diese Verbesserungen ähnelt die Methode noch stärker dem 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:

    ' 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 ein namenloses Dummynode-Objekt
    ' hinzu, das nur den Zweck hat, das '+'-Zeichen anzuzeigen.
    ' Die Funktion gibt zurück, ob ein Dummy erstellt worden ist
    Function AddChildDummy(oTreeView As TreeView, _
      oParentNode As Node, _
      sDirectory As String) As Boolean
     
      Dim oDummyNode As Node
     
      ' wenn nicht schon geladen wurde und 
      ' Unterordner vorhanden sind
      If (oParentNode.Children = 0) And (AreSubFolder(sDirectory)) Then
        ' wenn Dummynode nicht vorhanden ist
        On Error Resume Next 
        With oTreeView
          Set oDummyNode = .Nodes.Item(oParentNode.FullPath & "\Dummy")
          If Err = 35601 Then ' soll sie hinzugefügt werden
            .Nodes.Add oParentNode, tvwChild, oParentNode.FullPath & "\Dummy"
            AddChildDummy = True
          End If
          On Error GoTo 0
        End With
      End If
    End Function
    ' Diese Funktion überprüft, ob es Unterornder
    ' in dem angegebenen Verzeichnis gibt
    Function AreSubFolder(sDir As String) As Boolean
      Dim sItem As String
     
      ' ersten Ordner
      sItem = Dir$(sDir & "\*", vbDirectory)
      Do
        If Left$(sItem, 1) <> "." Then
          If ExistDir(sDir & "\" & sItem) Then
            AreSubFolder = True
            Exit Do
          End If
        End If
        sItem = Dir$
      Loop Until sItem = vbNullString
    End Function
    ' Diese Funktion entfernt das Dummynode-Objekt 
    ' und gibt als Ergebnis zurück, ob sie gelöscht wurde
    Function RemoveChildDummy(oTreeView As TreeView, _
      oParentNode As Node) As Boolean
     
      Dim oDummyNode As Node
     
      ' wenn das Objekt existiert wird es gelöscht
      On Error Resume Next
      With oTreeView.Nodes
        Set oDummyNode = .Item(oParentNode.FullPath & "\Dummy")
        If Err = 0 Then
          .Remove oParentNode.FullPath & "\Dummy"
          RemoveChildDummy = True
        End If
        On Error GoTo 0
      End With
    End Function
    ' Diese Funktion fügt alle Unterordner (inklusive 
    ' Dummynode-Objekte)eines Verzeichnisses hinzu und 
    ' gibt sie als Collection zurück
    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
     
      ' wenn Unterordner vorhanden sind
      If (AreSubFolder(sDirectory)) Then
        ' Dummynode entfernen
        RemoveChildDummy oTreeView, oParentNode
     
        ' Unterordner holen
        Set coSubFolders = GetSubFolders(sDirectory)
     
        ' Alle Unterordner inkl. Dummynodes hinzufügen
        For Each vSubFolder In coSubFolders
          With oTreeView
            Set oNode = .Nodes.Add(oParentNode, tvwChild, , vSubFolder, sImage)
            oNode.ExpandedImage = sExpandedImage
            AddChildDummy oTreeView, oNode, sDirectory & "\" & oNode.Text
     
            ' Childnode der Collection hinzufügen
            coChildNodes.Add oNode
          End With
        Next vSubFolder
     
        ' Collection zurückgeben
        Set AddSubFolders = coChildNodes
      End If
    End Function
    ' Diese Funktion löscht alle Childnodes 
    ' eines Node-Objekts
    Sub DeleteChildNodes(oTreeView As TreeView, _
      oNode As Node, _
      sDirectory As String)
     
      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
        oTreeView.Nodes.Remove oChildNode.Index
     
        ' Gehe zu nächstem Childnode
        Set oChildNode = oNextNode
      Next x
     
      ' Dummynode hinzufügen
      Call AddChildDummy(oTreeView, oNode, sDirectory)
    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
     
            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:
    Ziehen Sie auf das Formular ein TreeView- und ein ImageList-Control. Fügen Sie der ImageList 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
      LoadWithFolders TreeView1, sDirectory, _
        "OrdnerZu", "OrdnerOffen"
    End Sub
    Private Sub TreeView1_Collapse(ByVal Node As MSComctlLib.Node)
      ' Beim Schließen alle Unterordner löschen
      DeleteChildNodes TreeView1, Node, _
        sDirectory & "\" & Node.FullPath
    End Sub
    Private Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node)
      ' wenn Unterordner vorhanden sind:
      ' + Dummy löschen
      ' + Alle Unterordner hinzufügen
      AddSubFolders TreeView1, Node, _
        sDirectory & "\" & Node.FullPath, _
        "OrdnerZu", "OrdnerOffen"
    End Sub
    Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
      ' wenn Verzeichnis noch vorhanden ist
      If ExistDir(sDirectory & "\" & Node.FullPath) Then
        ' wenn Unterordner vorhanden sind:
        ' einen Dummy erstellen, damit das '+'-Zeichen sichbar ist
        AddChildDummy TreeView1, Node, sDirectory & "\" & Node.FullPath
      Else 
        ' wenn nicht, dann wird es aus TreeView gelöscht
        TreeView1.Nodes.Remove Node.Index
      End If
    End Sub

    Dieser Tipp wurde bereits 21.749 mal aufgerufen.

    Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

    Über diesen Tipp im Forum diskutieren
    Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

    Neue Diskussion eröffnen

    nach obenzurück


    Anzeige

    Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
    (einschl. Beispielprojekt!)

    Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
    - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
    - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
    Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
     
       

    Druckansicht Druckansicht Copyright ©2000-2015 vb@rchiv Dieter Otter
    Alle Rechte vorbehalten.

    Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

    Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel