VB 5/6-Tipp 0284: Mit Treeview in Laufwerken browsen
von ActiveVB
Beschreibung
Dies ist die das Explorer Gegenstück zu dem vorletzten Tip. Hier wird gezeigt wie zeitlich effizient durch die Verzeichnisstruktur eines Laufwerkes gebrowst werden. Die Ordner erhalten dabei das windowstypische Aussehen.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: FindClose, FindFirstFileA (FindFirstFile), FindNextFileA (FindNextFile) | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Poject1.vbp ------------- ' Die Komponente 'Microsoft Windows Common Controls 5.0 (SP2) (COMCTL32.OCX)' wird benötigt. '---------- Anfang Formular "Form1" alias Form.frm ---------- ' Steuerelement: Baumansichtsteuerelement "TreeView1" ' Steuerelement: Festplattenauswahlliste "Drive1" ' Steuerelement: Bilderliste "ImageList1" Option Explicit Option Compare Text Private Declare Function FindFirstFile Lib "kernel32" _ Alias "FindFirstFileA" (ByVal lpFileName As String, _ lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindNextFile Lib "kernel32" _ Alias "FindNextFileA" (ByVal hFindFile As Long, _ lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function FindClose Lib "kernel32" (ByVal _ hFindFile As Long) As Long Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Const MAX_PATH = 259 Private Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReserved0 As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type Const FILE_ATTRIBUTE_ARCHIVE = &H20 Const FILE_ATTRIBUTE_COMPRESSED = &H800 Const FILE_ATTRIBUTE_DIRECTORY = &H10 Const FILE_ATTRIBUTE_HIDDEN = &H2 Const FILE_ATTRIBUTE_NORMAL = &H80 Const FILE_ATTRIBUTE_READONLY = &H1 Const FILE_ATTRIBUTE_SYSTEM = &H4 Const FILE_ATTRIBUTE_TEMPORARY = &H100 Private Type FILETYPE Name As String Path As String End Type Dim Files() As FILETYPE Private Sub Form_Load() Set TreeView1.ImageList = ImageList1 If LCase(Left$(Drive1.Drive, 2)) <> "c:" Then Drive1.Drive = "c:" Else Call Drive1_Change End If End Sub Private Sub TreeView1_DblClick() Dim Folder$ Folder = TreeView1.SelectedItem.Key Folder = Left$(Folder, Len(Folder) - 1) If Len(Folder) > 2 Then Call MsgBox("Es wurde der Ordner " & Chr$(34) & Folder _ & Chr(34) & " ausgewählt.") End If End Sub Private Sub TreeView1_Expand(ByVal Node As ComctlLib.Node) Dim x& With TreeView1 For x = Node.Child.FirstSibling.Index To _ Node.Child.LastSibling.Index If .Nodes(x).Tag <> "*" Then Call GetFiles(.Nodes(x).Key) TreeView1.Nodes(x).Tag = "*" End If Next x End With End Sub Private Sub Drive1_Change() ChDir Left$(Drive1.Drive, 2) & "\" Call ReadDrive(Left$(Drive1.Drive, 2) & "\") End Sub Private Sub ReadDrive(ByVal Path$) Path = UCase(Path) TreeView1.Nodes.Clear TreeView1.Nodes.Add , , Path, Left$(Path, 2), 1, 1 Call GetFiles(Path) TreeView1.Nodes(1).Expanded = True End Sub Private Sub GetFiles(Root$) Dim File$, hFile&, FD As WIN32_FIND_DATA, x& ReDim Files(0) hFile = FindFirstFile(Root & "*.*", FD) If hFile = 0 Then Exit Sub Do File = Left(FD.cFileName, InStr(FD.cFileName, Chr(0)) - 1) If (FD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) _ = FILE_ATTRIBUTE_DIRECTORY Then If (File <> ".") And (File <> "..") Then Files(UBound(Files)).Name = File Files(UBound(Files)).Path = Root & File & "\" ReDim Preserve Files(0 To UBound(Files) + 1) End If End If Loop While FindNextFile(hFile, FD) Call FindClose(hFile) If UBound(Files) > 0 Then Call QuickSort(0, UBound(Files) - 1) For x = 0 To UBound(Files) - 1 TreeView1.Nodes.Add Root, tvwChild, Files(x).Path, _ Files(x).Name, 2, 3 Next x End If End Sub Private Sub QuickSort(ByVal LB&, ByVal UB&) Dim P1&, P2&, Ref$, TEMP As FILETYPE P1 = LB P2 = UB Ref = Files((P1 + P2) / 2).Name Do Do While (Files(P1).Name < Ref) P1 = P1 + 1 Loop Do While (Files(P2).Name > Ref) P2 = P2 - 1 Loop If P1 <= P2 Then TEMP = Files(P1) Files(P1) = Files(P2) Files(P2) = TEMP P1 = P1 + 1 P2 = P2 - 1 End If Loop Until (P1 > P2) If LB < P2 Then Call QuickSort(LB, P2) If P1 < UB Then Call QuickSort(P1, UB) End Sub '----------- Ende Formular "Form1" alias Form.frm ----------- '-------------- Ende Projektdatei Poject1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB5 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
VB6 | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 10 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von Basic N. am 14.09.2006 um 16:26
In der Funktion
GetFiles(Root$)
hFile = FindFirstFile(Root & "*.*", FD)
If hFile = 0 Then Exit Sub
Wenn im Laufwerk keine Dateien oder Ordner vorhanden sind, dann ist
hFile=-1 und die Zeile
If hFile = 0 Then Exit Sub
muss geändert werden in
If hFile <= 0 Then Exit Sub
sonst kann bei einigen Systemen (alte NT, WIN98) zu Programmabsturz führen.
LG
N Basic
Kommentar von Tobias Fischer am 17.04.2006 um 17:56
Als ich das Beispielprojekt zum ersten Mal gestartet habe, war ich eigentlich recht zufrieden, bis ich versehentlich auf mein DVD-Laufwerk scrollte, in das im Moment keine CD eingelegt war. Das Ergebnis war verheerend: ich hatte den schlimmsten Systemabsturz seit anderthalb Jahren und musste schließlich die Stromzufuhr zu meinem Athlon™ 64-PC unterbrechen.
Deshalb würde es mich interessieren, ob man bei der DriveListBox alle Nicht-Festplatten herausfiltern kann, um Systemabstürze infolge von nicht eingelegten Wechselmedien vermeiden zu können.
mfg.: Tobias Fischer
Kommentar von Stefan am 29.09.2004 um 22:20
Guten Tag
Ich würde das gerne in der Excel-VBA Umgebung haben. Wo finde ich z.B. Drive1?
Was müsste ich beachten
Vielen Dank für jeden Hinweis
Kommentar von Severin Brunold am 09.05.2003 um 19:17
Super Tipp, aber wo finder ich einen Tipp für einen Ordnerbaum, wie er im Windows Explorer zu finden ist?
Kommentar von alex mair am 20.01.2003 um 12:45
ich habe das projekt etwas modifiziert und in einen "excel 97 vorlagen browser" integriert.
hat super geklappt, vielen dank !
Kommentar von mir am 06.12.2002 um 21:43
Ich sag nur Poject1...
(Nein, da ist kein Schreibfehler)
Kommentar von Daniel am 06.08.2002 um 18:16
Wie kann ich machen, das auch dateien angezeigt werden?
Kommentar von Freunthaler am 12.07.2002 um 14:18
Ich möchte im Treeview das Scrollen einbauen ?
Wer kann mir Tipps dazu geben.
Kommentar von Elmar Köhler am 05.02.2002 um 10:49
Ich habe das Browsen schon auf einem anderen Weg hinbekommen. Aber ich Habe in meinem TreeView-Steuerelement nur große Symbole wie bekommee ich Sie klein.
Kommentar von Tobias Preclik am 26.11.2000 um 01:05
Eine extra VB 5.0 Version ist nicht nötig, es funktioniert bei mir perfekt mit der "normalen" Version dieses Tips.
mfg
Tobias Preclik