Ich frage mit folgendem Script mein TreeView ab, welches Laufwerk/Ordner ich mit der Mouse gewählt habe, um dann damit weiter
zu arbeiten.
Zu Beginn lese ich die vorhandenen Laufwerke ein und stelle diese im TreeView dar. Wenn ich eins anklicke, werden die Unterordner
ermittelt und als Childs angelegt. Das klappt auch ---- beim ersten Mal!
Wenn ich nun das Laufwerk "aufklappe", also die Unterordner zu sehen sind, erhalte ich auch beim zweiten Klick auf das gleiche
Laufwerk in der Console die richtige Laufwerksbezeichnung angezeigt. Ist das Laufwerk aber "zugeklappt", erhalte ich über
_GUICtrlTreeView_GetText die Bezeichnung eines bestimmten Unterordners.
Hat da jemand eine Idee woran das liegen kann? Die Kennung beim HitTest ist korrekt, ein Ordner wird erkannt, nur die Zuordnung
stimmt nicht. Wie oder wieso verändert der Expand-Zustand das Handle eines Controls?
Spoiler anzeigen
#include <Array.au3>
#include <GuiEdit.au3>
#include <GuiImageList.au3>
#include <GuiTreeView.au3>
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
Opt("TrayIconDebug", 1) ; 0=keine Info, 1=Debug Zeileninfo
Opt("GUIOnEventMode", 1) ; 0=ausgeschaltet, 1=OnEvent Modus aktiviert
Opt("MustDeclareVars", 1) ; 0=nein, 1=erfordert Deklaration
Opt("GUICloseOnESC", 1) ; 1=ESC beendet, 0=ESC schließt nicht
; Variablen - Definition #################################################################################################################
Global $Paused, $Pausedtext = "- - Pause - -"
Global $Gui, $Treeview, $Progress1, $Button1, $Edit
Global $Datacount = 1, $aData[$Datacount][6]
; Haupt - Programm #######################################################################################################################
[/autoit] [autoit][/autoit] [autoit]_Gui()
_Laufwerke()
While 1
Sleep(100)
WEnd
; GUI - Definition #######################################################################################################################
Func _Gui()
Local $iStyle = BitOR($TVS_HASBUTTONS, $TVS_LINESATROOT, $TVS_HASLINES, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_SINGLEEXPAND ) ; $TVS_NOHSCROLL $TVS_NOHSCROLL
$Gui = GUICreate("Gui", 700, 500, 300, 300)
GUISetOnEvent($GUI_EVENT_CLOSE, "_Ende")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_Click")
$Treeview = _GUICtrlTreeView_Create($Gui, 20, 20, 400, 400, $iStyle)
Local $hImage = _GUIImageList_Create(16, 16, 5, 1)
_GUIImageList_AddIcon($hImage, 'shell32.dll', 4) ; Verzeichnis-Icon
_GUIImageList_AddIcon($hImage, 'shell32.dll', 110) ; Verzeichnis-Icon mit Haken
_GUIImageList_AddIcon($hImage, 'shell32.dll', 1) ; Datei-Icon
_GUIImageList_AddIcon($hImage, 'shell32.dll', 6) ; Diskette
_GUIImageList_AddIcon($hImage, 'shell32.dll', 7) ; Wechseldatenträger
_GUIImageList_AddIcon($hImage, 'shell32.dll', ; Festplatte
_GUIImageList_AddIcon($hImage, 'shell32.dll', 11) ; CDROM
_GUIImageList_AddIcon($hImage, 'shell32.dll', 9) ; Netzwerklaufwerk
_GUIImageList_AddIcon($hImage, 'shell32.dll', 53) ; Unbekannt
_GUICtrlTreeView_SetNormalImageList($Treeview, $hImage)
$Edit = GUICtrlCreateEdit("",460, 20, 200, 400)
$Progress1 = GUICtrlCreateProgress(20, 450, 400, 25)
$Button1 = GUICtrlCreateButton("- Test -", 500, 450, 100, 30)
GUICtrlSetOnEvent(-1, "_show")
GUISetState(@SW_SHOW)
EndFunc
; Laufwerk Funktionen ##################################################################################################################
Func _Laufwerke()
Local $Drives = DriveGetDrive( "all" ), $y, $iLWindex = 0
For $i = 1 To $Drives[0]
Local $belegt = Round((DriveSpaceTotal($Drives[$i])-DriveSpaceFree($Drives[$i])), 0)
If $belegt < 1000 Then
_GUICtrlEdit_AppendText($Edit, $Drives[$i] & " " & $belegt & " (MB)" & @CRLF)
Else
_GUICtrlEdit_AppendText($Edit, $Drives[$i] & " " & round($belegt/1000, 1) & " (GB)" & @CRLF)
EndIf
Switch DriveGetType($Drives[$i])
Case 'Fixed'
$iLWindex = 5
Case 'CDROM'
$iLWindex = 6
Case 'RAMDisk'
$iLWindex = 7
Case 'Network'
$iLWindex = 7
Case 'Removable'
$iLWindex = 4
If StringLeft($Drives[$i], 2) = 'a:' Or StringLeft($Drives[$i], 2) = 'b:' Then $iLWindex = 3
Case Else
$iLWindex = 8
EndSwitch
Local $Item = _GUICtrlTreeView_Add($Treeview, 0, $Drives[$i] & " " & DriveGetLabel($Drives[$i]), $iLWindex, $iLWindex)
GUICtrlSetData($Progress1, $i/$Drives[0]*100)
Sleep(200)
Next
GUICtrlSetData($Progress1, "")
EndFunc
Func _SubLaufwerke($lw, $parent)
Local $count = 0, $filesum = 0
GUICtrlSetData($Progress1, $count)
Local $search = FileFindFirstFile($lw & "\*.*")
If $search = -1 Then Return
Local $file, $Item2, $parentold
FileChangeDir($lw)
While 1
$file = FileFindNextFile($search)
Local $ex = @extended
If @error Then
$parent = $parentold
ExitLoop
EndIf
If $count < 100 Then
$count += 1
GUICtrlSetData($Progress1, $count)
Else
$count = 0
GUICtrlSetData($Progress1, $count)
EndIf
If StringInStr(FileGetAttrib($file), "D") Or $ex = 1 Then
$Item2 = _GUICtrlTreeView_AddChild($Treeview, $parent, $file)
_GUICtrlTreeView_SelectItem ($Treeview, $Item2)
$parentold = $parent
$parent = $lw & "\" & $file
$Datacount += 1
ReDim $aData[$Datacount][6]
$aData[$Datacount-1][1] = $parent
Local $info = DirGetSize ( $parent, 1 + 2 ) ; erweiterter Modus aber ohne Unterverzeichnisse
$aData[$Datacount-1][3] = $info[0] ; $array[0] = Größe
$aData[$Datacount-1][4] = $info[1] ; $array[1] = Anzahl der Dateien
$aData[$Datacount-1][5] = $info[2] ; $array[2] = Anzahl der Verzeichnisse
_SubLaufwerke($parent, $Item2)
$aData[$Datacount-1][2] = $filesum ; Größer der Dateien im Verzeichnis
$parent = $parentold
Else
$filesum = $filesum + FileGetSize($file)
EndIf
WEnd
FileClose($search)
GUICtrlSetData($Progress1, "")
Return
EndFunc
; Allgemeine Funktionen ##################################################################################################################
Func _Click()
;~ _GUICtrlTreeView_BeginUpdate($treeview)
Local $a = GUIGetCursorInfo($Gui) ; Pos Cursor
Local $b = ControlGetPos($Gui, "", $Treeview) ; Pos des Tree-Controls
Local $e = _GUICtrlTreeView_HitTest($Treeview, $a[0]-$b[0] , $a[1]-$b[1])
If $e = 4 Or $e = 2 Then
Local $c = _GUICtrlTreeView_HitTestItem($Treeview, $a[0]-$b[0] , $a[1]-$b[1])
Local $d = _GUICtrlTreeView_GetText($Treeview, $c)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $d = ' & $d & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
$d = StringLeft($d, StringInStr($d, ":"))
_SubLaufwerke($d, $c)
_GUICtrlEdit_AppendText($Edit, "####### eingelesen ######" & @CRLF)
If $d <> "" Then _GUICtrlTreeView_Expand($Treeview, $d, False)
EndIf
$aData[0][1] = $Datacount
;~ _GUICtrlTreeView_EndUpdate($treeview)
EndFunc
Func _show()
_ArrayDisplay($aData, "", "", "", "", "", "Index|leer|Verzeichnis|FileSum|Größe|Dateien|Ordner")
EndFunc
Func _Ende()
Exit
EndFunc