_GUICtrlTreeView_GetTree Problem

  • Hi, kann es sein, dass die UDF _GUICtrlTreeView_GetTree fehlerhaft implementiert ist? Ich möchte mir den KOMPLETTEN Pfad einer Selektion zurückgeben lassen, die Funktion gibt aber immer nur zwei Elemente zurück! Wie lässt sich das denn lösen?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>

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

    $h_gui = GUICreate("", 640, 480)
    ;~ $h_tview = GUICtrlCreateTreeView(5, 5, 600, 400)
    $h_tview = _GUICtrlTreeView_Create($h_gui, 5, 5, 600, 400)

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

    _GUICtrlTreeView_BeginUpdate($h_tview)
    $h_item = _GUICtrlTreeView_Add($h_tview, 0, "C:")
    _GUICtrlTreeView_AddChild($h_tview, $h_item, "install")
    $h_item = _GUICtrlTreeView_AddChild($h_tview, $h_item, "WINDOWS")
    _GUICtrlTreeView_AddChild($h_tview, $h_item, "system32")
    _GUICtrlTreeView_AddChild($h_tview, $h_item, "drivers")

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

    ;~ $h_item = GUICtrlCreateTreeViewItem("C:", $h_tview)
    ;~ GUICtrlCreateTreeViewItem("install", $h_item)
    ;~ $h_item = GUICtrlCreateTreeViewItem("WINDOWS", $h_subitem)
    ;~ GUICtrlCreateTreeViewItem("system32", $h_item)

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

    _GUICtrlTreeView_EndUpdate($h_tview)

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

    $h_bt = GUICtrlCreateButton("Get", 5, 420)

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $h_bt
    MsgBox(64, "_GUICtrlTreeView_GetTree", _GUICtrlTreeView_GetTree($h_tview))
    EndSwitch
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von teh_hahn (5. August 2008 um 15:47)

  • Morgen, ich hatte nicht mit der GetTree das Problem aber mit GetText, nach benutzung der AutoIT Beta Libary hat es funktioniert, da wurde einiges geändert. Benutz du diese oder nutzt du die Stable?

  • Ja, ich benutze die Stable und dabei soll es auch eigentlich bleiben. Gibt es denn die Möglichkeit, dies auch mit GetText zu erreichen? Wäre über ein Beispiel ansonsten sehr froh!

  • Ich habe mir das einmal angeschaut die Funktion wurde nicht verändert.
    Ich habe gesehen das beim Aufruf der GetTree, du nur das Handle des TreeViews übergibt du must noch das selektierte Item übergeben.

    Um ein Beispiel dir anzuschauen im Anhang

  • Nope:

    Zitat

    If $hItem is 0 then an attempt to use current selected is used

    Hier der Beweis:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>

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

    Opt("GUIDataSeparatorChar", "\")

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

    $h_gui = GUICreate("", 640, 480)
    ;~ $h_tview = GUICtrlCreateTreeView(5, 5, 600, 400)
    $h_tview = _GUICtrlTreeView_Create($h_gui, 5, 5, 600, 400)

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

    _GUICtrlTreeView_BeginUpdate($h_tview)
    $h_item = _GUICtrlTreeView_Add($h_tview, 0, "C:")
    _GUICtrlTreeView_AddChild($h_tview, $h_item, "install")
    $h_subitem = _GUICtrlTreeView_AddChild($h_tview, $h_item, "WINDOWS")
    _GUICtrlTreeView_AddChild($h_tview, $h_subitem, "system32")
    _GUICtrlTreeView_AddChild($h_tview, $h_subitem, "drivers")

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

    ;~ $h_item = GUICtrlCreateTreeViewItem("C:", $h_tview)
    ;~ GUICtrlCreateTreeViewItem("install", $h_item)
    ;~ $h_item = GUICtrlCreateTreeViewItem("WINDOWS", $h_subitem)
    ;~ GUICtrlCreateTreeViewItem("system32", $h_item)

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

    _GUICtrlTreeView_EndUpdate($h_tview)

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

    $h_bt = GUICtrlCreateButton("Get", 5, 420)

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $h_bt
    MsgBox(64, "_GUICtrlTreeView_GetTree", _
    "current selected: " & _GUICtrlTreeView_GetTree($h_tview) & @CRLF & _
    "item: " & _GUICtrlTreeView_GetTree($h_tview, _GUICtrlTreeView_GetSelection($h_tview)))
    EndSwitch
    WEnd

    [/autoit]


    Die Beta bringt da mal auch nichts... Mach ich da etwa irgend etwas verkehrt. Ach so, um den Fehler zu sehen, selektiere einmal drivers und drücke den Button!

  • DU machst nichts flasch :) Die haben einen Bug in der Funktion :D
    Until $hItem <> 0x00000000
    steht da ... also führe aus, bis hItem ein gültiges handle enthält... es sollte aber
    Until $hItem = 0x00000000 sein, also, bis es ungültig ist

  • progandy einwendfrei du hast den Fehler gefunden :)) Dieser Bug sollte mal in die Beta nachgepflegt werden. der nächste mit dem Problem, kommt da nicht so schnell drauf.

    Hab mal die Funktion rein kopiert die nicht wissen wo man was ändern muss

    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GUICtrlTreeView_GetTree
    ; Description ...: Retrieve all items text
    ; Syntax.........: _GUICtrlTreeView_GetTree($hWnd, $hItem)
    ; Parameters ....: $hWnd - Handle to the control
    ; $hItem - item ID/handle
    ; Return values .: Success - Tree Path of Item
    ; Failure - Empty string
    ; Author ........: Gary Frost (gafrost), Holger Kotsch
    ; Modified.......: Gary Frost (gafrost)
    ; Remarks .......: Use Opt("GUIDataSeparatorChar", param) to change the separator char used
    ; If $hItem is 0 then an attempt to use current selected is used
    ; Related .......:
    ; Link ..........;
    ; Example .......; Yes
    ; ===============================================================================================================================
    Func _GUICtrlTreeView_GetTree($hWnd, $hItem = 0)
    If $Debug_TV Then _GUICtrlTreeView_ValidateClassName($hWnd)
    If $hItem = 0 Then
    $hItem = 0x00000000
    Else
    If Not IsHWnd($hItem) Then $hItem = _GUICtrlTreeView_GetItemHandle($hWnd, $hItem)
    EndIf
    If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)

    Local $szPath = "", $hParent, $sSeparator = Opt("GUIDataSeparatorChar")

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

    If $hItem = 0x00000000 Then $hItem = _SendMessage($hWnd, $TVM_GETNEXTITEM, $TVGN_CARET, 0, 0, "wparam", "hwnd", "hwnd")
    If $hItem <> 0x00000000 Then
    $szPath = _GUICtrlTreeView_GetText($hWnd, $hItem)

    Do; Get now the parent item handle if there is one
    $hParent = _SendMessage($hWnd, $TVM_GETNEXTITEM, $TVGN_PARENT, $hItem, 0, "wparam", "hwnd", "hwnd")
    If $hParent <> 0x00000000 Then $szPath = _GUICtrlTreeView_GetText($hWnd, $hParent) & $sSeparator & $szPath
    $hItem = $hParent
    Until $hItem = 0x00000000
    EndIf

    Return $szPath
    EndFunc ;==>_GUICtrlTreeView_GetTree

    [/autoit]

    Hier dein Beipsiel teh_hahn mit ein paar mehr Childs

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GuiTreeView.au3>

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

    Opt("GUIDataSeparatorChar", "\")

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

    $h_gui = GUICreate("", 640, 480)
    ;~ $h_tview = GUICtrlCreateTreeView(5, 5, 600, 400)
    $h_tview = _GUICtrlTreeView_Create($h_gui, 5, 5, 600, 400)

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

    _GUICtrlTreeView_BeginUpdate($h_tview)
    $h_item = _GUICtrlTreeView_Add($h_tview, 0, "C:")
    _GUICtrlTreeView_AddChild($h_tview, $h_item, "install")
    $h_subitem = _GUICtrlTreeView_AddChild($h_tview, $h_item, "WINDOWS")
    _GUICtrlTreeView_AddChild($h_tview, $h_subitem, "system32")
    _GUICtrlTreeView_AddChild($h_tview, $h_subitem, "drivers")
    $h_subitem2 = _GUICtrlTreeView_AddChild($h_tview, $h_item, "driverexpand")
    $h_subitem3 = _GUICtrlTreeView_AddChild($h_tview, $h_subitem2, "driverexpand2")
    _GUICtrlTreeView_AddChild($h_tview, $h_subitem3, "drivers23")

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

    ;~ $h_item = GUICtrlCreateTreeViewItem("C:", $h_tview)
    ;~ GUICtrlCreateTreeViewItem("install", $h_item)
    ;~ $h_item = GUICtrlCreateTreeViewItem("WINDOWS", $h_subitem)
    ;~ GUICtrlCreateTreeViewItem("system32", $h_item)

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

    _GUICtrlTreeView_EndUpdate($h_tview)

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

    $h_bt = GUICtrlCreateButton("Get", 5, 420)

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

    GUISetState()

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

    While 1
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    Case $h_bt
    MsgBox(64, "_GUICtrlTreeView_GetTree", _
    "current selected: " & _GUICtrlTreeView_GetTree($h_tview) & @CRLF & _
    "item: " & _GUICtrlTreeView_GetTree($h_tview) & @LF & _
    "SelectionItem: " & _GUICtrlTreeView_GetSelection($h_tview))
    EndSwitch
    WEnd

    [/autoit]