TreeView - Items verändern Ihr Handle in Abhängigkeit vom Expand-Zustand

  • 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
    [autoit]


    #include <Array.au3>
    #include <GuiEdit.au3>
    #include <GuiImageList.au3>
    #include <GuiTreeView.au3>
    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ; Variablen - Definition #################################################################################################################
    Global $Paused, $Pausedtext = "- - Pause - -"
    Global $Gui, $Treeview, $Progress1, $Button1, $Edit
    Global $Datacount = 1, $aData[$Datacount][6]

    [/autoit] [autoit][/autoit] [autoit]

    ; Haupt - Programm #######################################################################################################################

    [/autoit] [autoit][/autoit] [autoit]

    _Gui()
    _Laufwerke()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; 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)

    [/autoit] [autoit][/autoit] [autoit]

    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', 8) ; 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)

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    Func _SubLaufwerke($lw, $parent)
    Local $count = 0, $filesum = 0
    GUICtrlSetData($Progress1, $count)
    Local $search = FileFindFirstFile($lw & "\*.*")
    If $search = -1 Then Return

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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

    [/autoit] [autoit][/autoit] [autoit]

    Func _show()
    _ArrayDisplay($aData, "", "", "", "", "", "Index|leer|Verzeichnis|FileSum|Größe|Dateien|Ordner")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Ende()
    Exit
    EndFunc

    [/autoit]
  • Hallo Latemail,

    teste es einmal so:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GuiEdit.au3>
    #include <GuiImageList.au3>
    #include <GuiTreeView.au3>
    #include <GUIConstantsEx.au3>
    #include <TreeViewConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit] [autoit][/autoit] [autoit]

    ; Variablen - Definition #################################################################################################################
    Global $Paused, $Pausedtext = "- - Pause - -"
    Global $Gui, $Treeview, $Progress1, $Button1, $Edit
    Global $Datacount = 1, $aData[$Datacount][6]

    [/autoit] [autoit][/autoit] [autoit]

    ; Haupt - Programm #######################################################################################################################

    [/autoit] [autoit][/autoit] [autoit]

    _Gui()
    _Laufwerke()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    ; 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)

    [/autoit] [autoit][/autoit] [autoit]

    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', 8) ; 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)

    [/autoit] [autoit][/autoit] [autoit]

    $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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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/1024, 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)
    Local $Item = _GUICtrlTreeView_Add($Treeview, 0, $Drives[$i] & " " , $iLWindex, $iLWindex)
    GUICtrlSetData($Progress1, $i/$Drives[0]*100)
    Sleep(200)
    Next
    GUICtrlSetData($Progress1, "")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SubLaufwerke($lw, $parent)
    Local $count = 0, $filesum = 0
    _GUICtrlTreeView_DeleteChildren($treeview,$parent)
    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) ;<<=================== würde ich aus Performancegründen askommentieren
    $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

    [/autoit] [autoit][/autoit] [autoit]

    ; 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_GetTree($Treeview, $c)
    $d = StringReplace($d," ","\")
    $d = StringReplace($d,"|","\")
    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

    [/autoit] [autoit][/autoit] [autoit]

    Func _show()
    _ArrayDisplay($aData, "", "", "", "", "", "Index|leer|Verzeichnis|FileSum|Größe|Dateien|Ordner")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Ende()
    Exit
    EndFunc

    [/autoit]

    mfg (Auto)Bert

  • Danke für Deine Mühe, aber ......

    Sorry, aber das war nicht die Lösung :(

    mir geht es auch um den eigentlichen Hintergrund, wieso oder vielmehr was ändert sich, wenn ich
    einen Tree auf-/zuklappe, das wird bei anderen Funktionen dann auch Einfluß haben ....


    EDIT:

    ich weiß nicht warum, aber mit folgenden Änderungen klappt es:

    zeile 33 (bezogen auf mein Script)
    statt $Treeview = _GUICtrlTreeView_Create($Gui, 20, 20, 400, 400, $iStyle)
    jetzt $Treeview = GUICtrlCreateTreeView( 20, 20, 400, 400, $iStyle)

    und zeile 140
    statt Local $d = _GUICtrlTreeView_GetText($Treeview, $c)
    jetzt Local $d = GUICtrlRead($Treeview, 1)

    warum gibt es eigentlich vieles doppelt, so wie GUICtrlCreateTreeView und _GUICtrlTreeView_Create ???