Problem mit _GUICtrlTreeView_FindItem _GUICtrlTreeView_SelectItem

  • Hallo com,

    ich versuche gerade einen FTP-Client zu schreiben. Dazu habe ich ein Treeview und ein Listviewcontrol. Das befüllen der Listview wenn ein neuer TV-Knoten ausgewählt ist klappt. Umgedreht soll aber auch wenn im LV ein Ordnereintrag doppelgeklickt wird der entsprechende TV-Knoten ausgewählt werden. Die Routine die ich dafür geschrieben habe gibt mit auch das Handle des (richtigen ?)TV-Knotens aus wählt in aber nicht aus:

    Spoiler anzeigen
    [autoit]

    Func _DblClick($idLV)
    Local $sCC=ControlGetFocus($hGUI)
    if Not StringInStr($sCC,'SysListView32') Then Return
    Local $aLVItem = _GUICtrlListView_GetItemTextArray($idLV)
    Local $sActItem=StringReplace(StringReplace(_GUICtrlTreeView_GetTree($idTVLocal),$Delim1,$Delim),'\\','\')
    Local $hTVItem=_GUICtrlTreeView_FindItem ($idTVLocal,$aLVItem[1])
    ;ControlTreeView($hGUI,'',$idTVLocal,'select',$sTVItem)
    ConsoleWrite($sActItem&' TVItem: '&$hTVItem&' ['&$aLVItem[1]&']'& @CRLF)
    _GUICtrlTreeView_SelectItem ($idLVLocal,$hTVItem)
    ;_GUICtrlTreeView_ClickItem($idLVLocal, $sTVItem, "left", False, 1)
    ;_GUICtrlTreeView_SetFocused ($idLVLocal,$sTVItem)
    ;_GUICtrlTreeView_SetSelected ($idLVLocal,$sTVItem)
    EndFunc ;==>_DblClick

    [/autoit]

    Edit: Da das Beispielskript zu _GUICtrlTreeView_SelectItem das von mit erwartete Ergebnis bewirkt liegt der Fehler wohl bei _GUICtrlTreeView_FindItem.
    Edit2: auch ein Testskript mit beiden funktioniert einwandfrei. Daraufhin habe ich mir (in meinem eigentlichen Skript)bei der Erstellung der TV-Knoten das Handle für einen bestimmten Knoten in die Konsole ausgeben lassen. Er stimmt bei Doppelklick auf den entsprechenden LV-Eintrag überein also doch der Fehler bei _GUICtrlTreeView_SelectItem ?(
    _GUICtrlTreeView_ClickItem funktioniert aber auch nicht mit dem gefundenen Handle.

    und hier das mittlerweile lauffähige noch unvollendete Skript:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_UseUpx=n
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <Array.au3>
    #include <Crypt.au3>
    #include <GuiButton.au3>
    #include <GuiImageList.au3>
    #include <GuiComboBoxEx.au3>
    #include <GuiTreeView.au3>
    #include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <EditConstants.au3>
    #include "FTP_FileList_Recursiv3.au3"
    #include "GUICtrlPic.au3"
    #include <Misc.au3>
    #include <File.au3>
    #include <ProgressConstants.au3>
    #include <SendMessage.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $sIni = @AppDataDir & '\AutoZilla\aZ.ini'
    If Not FileExists(@AppDataDir & '\AutoZilla') Then
    DirCreate(@AppDataDir & '\AutoZilla')
    IniWrite($sIni, 'MainForm', 'width', 640)
    IniWrite($sIni, 'MainForm', 'Heigth', 480)
    EndIf

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

    Global $hImgDrives = _GUIImageList_Create(16, 16, 5, 1)
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 3) ; Verzeichnis-Icon
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 110) ; Verzeichnis-Icon mit Haken
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 1) ; Datei-Icon
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 5) ; Diskette
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 7) ; Wechseldatenträger
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 8) ; Festplatte
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 11) ; CDROM
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 12) ; Netzwerklaufwerk
    _GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 53) ; Unbekannt

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

    Global Const $Delim = '\', $Delim1 = '|'
    Global $hGUI
    Global $hWndTVLocal, $idTVLocal
    Global $sPathLocalTV, $sOldPathLocalTV
    Global $hWndLVLocal, $idLVLocal
    Global $hWndTVFTP, $idTVFTP
    Global $sPathFTPTV, $sOldPathFTPTV
    Global $hWndLVFTP, $idLVFTP
    Global $sSelect = 'Anmeldeprofil auswählen'
    Global $dll = DllOpen("user32.dll")
    Global Const $tagSHFILEINFO = 'ptr hIcon; int iIcon; DWORD dwAttributes; CHAR szDisplayName[255]; CHAR szTypeName[80];'
    Global Const $SHGFI_USEFILEATTRIBUTES = 0x10
    Global Const $SHGFI_SYSICONINDEX = 0x4000
    Global Const $SHGFI_SMALLICON = 0x1
    Global Const $SHGFI_LARGEICON = 0x0
    Global $FOLDER_ICON_INDEX = _GUIImageList_GetFileIconIndex(@SystemDir, False, 1)
    Global $iActiveLV = -99
    Global $iActiveTV = -99

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

    Global $iHidden = RegRead('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', 'Hidden') - 1
    Global $iSuperHidden = Not RegRead('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', 'ShowSuperHidden')
    _CreateGui()

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

    Func _CreateGui()
    Local $iLW
    Local $iWidth = IniRead($sIni, 'MainForm', 'width', 640)
    Local $iHeight = IniRead($sIni, 'MainForm', 'Heigth', 480)
    Local $iSH_Top = IniRead($sIni, 'MainForm', 'SH_Top', Int($iHeight / 2))
    Local $iSV_Left = IniRead($sIni, 'MainForm', 'SV_Left', Int($iWidth / 3))
    Local $l_InternetSession = -99, $l_FTPSession
    Local $errOpen, $errFTP, $iState
    Local $nMsg, $aPos
    Local $iMaxDepth = 1;max 1 Untervereichnisebene <1=unendliche Rekrusionstiefe
    $hGUI = GUICreate("AutoItZilla v. 0.2.0.8", $iWidth, $iHeight);,Default,Default,$WS_POPUP)
    GUISetBkColor(0xAAAA44)
    Local $idCboSrv = GUICtrlCreateCombo('', 5, 2, 145, 22)
    Local $sKey, $sSelSrv, $aLoginData[6][2]
    GUICtrlCreateLabel('Ben&utzer:', 155, 5, 60, 20)
    GUICtrlCreateLabel('&Passwort:', 220, 5, 90, 20)
    GUICtrlCreateLabel('&Server:', 320, 5, 120, 20)
    GUICtrlCreateLabel('Port:', 450, 5, 30, 20)
    GUICtrlCreateLabel('&Art:', 490, 5, 65, 20)
    Local $idInpUser = GUICtrlCreateInput('', 155, 25, 60, 20)
    Local $idInpPass = GUICtrlCreateInput('', 220, 25, 90, 20, $ES_PASSWORD)
    Local $idInpServer = GUICtrlCreateInput('', 320, 25, 120, 20)
    Local $idInpPort = GUICtrlCreateInput('', 450, 25, 30, 20, $ES_NUMBER)
    Local $idCboState = GUICtrlCreateCombo('', 490, 25, 65, 20)
    GUICtrlSetData(-1, 'Aktiv|Passiv')
    GUICtrlSetData(-1, 'Aktiv')
    Local $idBtnCon = GUICtrlCreateButton('&verbinden', 560, 5, 75, 20)
    Local $hImgCon = _GUIImageList_Create(16, 16, 5, 3, 6)
    _GUIImageList_AddIcon($hImgCon, @SystemDir & "\docprop.dll", 0, True)
    _GUICtrlButton_SetImageList($idBtnCon, $hImgCon)
    Local $idBtnDiscon = GUICtrlCreateButton('&trennen', 560, 25, 75, 20)
    Local $hImgDiscon = _GUIImageList_Create(16, 16, 5, 3, 6)
    _GUIImageList_AddIcon($hImgDiscon, @SystemDir & "\docprop.dll", 2, True)
    _GUICtrlButton_SetImageList($idBtnDiscon, $hImgDiscon)
    GUICtrlSetState(-1, $GUI_DISABLE)
    Local $idBtnIns = GUICtrlCreateButton('e&intragen', 5, 25, 75, 20)
    Local $hImgIns = _GUIImageList_Create(16, 16, 5, 3, 6)
    _GUIImageList_AddIcon($hImgIns, @SystemDir & "\wmploc.dll", 15, True)
    _GUICtrlButton_SetImageList($idBtnIns, $hImgIns)
    Local $idBtnDel = GUICtrlCreateButton('&löschen', 82, 25, 68, 20)
    GUICtrlSetState(-1, $GUI_DISABLE)
    Local $hImgDel = _GUIImageList_Create(16, 16, 5, 3, 6)
    _GUIImageList_AddIcon($hImgDel, @SystemDir & "\compstui.dll", 5, True)
    _GUICtrlButton_SetImageList($idBtnDel, $hImgDel)
    $idTVFTP = GUICtrlCreateTreeView(5, 50, $iSV_Left - 7, $iSH_Top - 53)
    $hWndTVFTP = GUICtrlGetHandle($idTVFTP)
    _GUICtrlTreeView_SetNormalImageList($idTVFTP, $hImgDrives)
    $idLVFTP = GUICtrlCreateListView('Name|Grösse|Datum|Attribute', $iSV_Left + 9, 50, $iWidth - $iSV_Left - 13, $iSH_Top - 52)
    $hWndTVFTP = GUICtrlGetHandle($idTVFTP)
    _GUICtrlTreeView_SetNormalImageList($idTVFTP, $hImgDrives)
    $idTVLocal = GUICtrlCreateTreeView(5, $iSH_Top + 25, $iSV_Left - 7, $iHeight - $iSH_Top - 30)
    $hWndTVLocal = GUICtrlGetHandle($idTVLocal)
    _GUICtrlTreeView_SetNormalImageList($idTVLocal, $hImgDrives)
    $idLVLocal = GUICtrlCreateListView('Name|Grösse|Datum|Attribute', $iSV_Left + 9, $iSH_Top + 27, $iWidth - $iSV_Left - 13, $iHeight - $iSH_Top - 31)
    $hWndLVLocal = GUICtrlGetHandle($idLVLocal)
    _GUICtrlListView_SetImageList($idLVLocal, _GUIImageList_GetSystemImageList(False), 1)
    _GUICtrlListView_SetColumnWidth($idLVLocal, 0, 150)
    _GUICtrlListView_SetColumnWidth($idLVLocal, 1, 100)
    _GUICtrlListView_SetColumnWidth($idLVLocal, 2, 70)
    _GUICtrlListView_SetColumnWidth($idLVLocal, 3, $LVSCW_AUTOSIZE_USEHEADER)
    _GUICtrlListView_JustifyColumn($idLVLocal, 1, 1)
    Local $idSplitterV = GUICtrlCreateLabel('', $iSV_Left, 48, 8, $iHeight - 50, Default, $SS_BLACKFRAME)
    GUICtrlSetBkColor(-1, 0x444444)
    Local $idSplitterH = GUICtrlCreateLabel('', 0, $iSH_Top, $iWidth, 26, Default, $SS_BLACKFRAME)
    GUICtrlSetBkColor(-1, 0xAAAA44)
    GUICtrlSetColor(-1, 0x444444)
    Local $idBtnUp = GUICtrlCreateButton('&Upload', 15, $iSH_Top + 3, 75, 20)
    GUICtrlSetState(-1, $GUI_DISABLE)
    Local $hImgUp = _GUIImageList_Create(16, 16, 5, 3, 6)
    _GUIImageList_AddIcon($hImgUp, @SystemDir & "\netshell.dll", 149, True)
    _GUICtrlButton_SetImageList($idBtnUp, $hImgUp)
    Local $idBtnDown = GUICtrlCreateButton('&Download', $iWidth - 95, $iSH_Top + 3, 75, 20)
    GUICtrlSetState(-1, $GUI_DISABLE)
    Local $hImgDown = _GUIImageList_Create(16, 16, 5, 3, 6)
    _GUIImageList_AddIcon($hImgDown, @SystemDir & "\netshell.dll", 150, True)
    _GUICtrlButton_SetImageList($idBtnDown, $hImgDown)
    Local $idStatus = GUICtrlCreateLabel('nicht verbunden', 195, $iSH_Top + 6, $iWidth - 375, 16, $SS_CENTER)
    GUICtrlSetBkColor($idStatus, 0xFF0000)
    Local $idDmyLVLocal = GUICtrlCreateDummy()
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUISetState(@SW_SHOW, $hGUI)
    GUIRegisterMsg($WM_NOTIFY, '_WM_NOTIFY')
    GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
    AdlibRegister('_GetLocalTVPath')
    Local $aDrives = DriveGetDrive('ALL')
    For $i = 1 To $aDrives[0]
    _PopulateTV_Local($idTVLocal, StringUpper($aDrives[$i]) & '\', $iLW)
    $iLW += 1
    Next
    Global $aAccelKeys[1][2] = [['{Enter}', $idDmyLVLocal]]
    GUISetAccelerators($aAccelKeys, $hGUI)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE ;, $idBtnExit
    If $l_InternetSession <> -99 Then _FTP_Close($l_InternetSession)
    DllClose($dll)
    Exit
    Case $idDmyLVLocal
    _DblClick($idLVLocal)
    EndSwitch
    WEnd
    EndFunc ;==>_CreateGui

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

    Func _PopulateTV_Local($idTV, $sPath, $iIndex)
    Local $iLWindex = 0
    If StringLen($sPath) <= 3 Then
    Switch DriveGetType($sPath)
    Case 'Fixed'
    $iLWindex = 5
    Case 'CDROM'
    $iLWindex = 6
    Case 'RAMDisk'
    $iLWindex = 7
    Case 'Removable'
    $iLWindex = 4
    If $sPath = 'a:' Or $sPath = 'b:' Then $iLWindex = 3
    Case Else
    $iLWindex = 8
    EndSwitch
    EndIf
    Local $hLocalTVNode = _GUICtrlTreeView_Add($idTV, $idTV, $sPath, $iLWindex, $iLWindex)
    If DriveStatus($sPath) <> 'READY' Then Return
    If _GUICtrlTreeView_BeginUpdate($idTV) And _GUICtrlTreeView_FileExplorer($idTV, $hLocalTVNode, $sPath) Then _GUICtrlTreeView_EndUpdate($idTV)
    EndFunc ;==>_PopulateTV_Local

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

    Func _PopulateLV_Local($sPath)
    _GUICtrlListView_DeleteAllItems($hWndLVLocal)
    Local $aFiles = _FileListToArray($sPath), $sAttr, $sDate, $sSize
    Local $iDirs = 0
    Local $iIndex
    If IsArray($aFiles) Then
    _GUICtrlListView_BeginUpdate($hWndLVLocal)
    For $i = 1 To $aFiles[0]
    $sAttr = FileGetAttrib($sPath & $Delim & $aFiles[$i])
    If $iHidden And StringInStr($sAttr, 'H') Then ContinueLoop
    If $iSuperHidden And StringInStr($sAttr, 'S') Then ContinueLoop
    $sSize = _StringAddThousandsSep(FileGetSize($sPath & $Delim & $aFiles[$i]))
    $sDate = _FormatDate(FileGetTime($sPath & $Delim & $aFiles[$i]))
    If StringInStr($sAttr, 'D') Then
    $iIndex = _GUICtrlListView_InsertItem($hWndLVLocal, $aFiles[$i], $iDirs, $FOLDER_ICON_INDEX, 4)
    $iDirs += 1
    Else
    $iIndex = _GUICtrlListView_InsertItem($hWndLVLocal, $aFiles[$i], -1, _GUIImageList_GetFileIconIndex($sPath & $aFiles[$i], False))
    EndIf
    If $iIndex <> -1 Then
    _GUICtrlListView_SetItemText($hWndLVLocal, $iIndex, $sSize, 1)
    _GUICtrlListView_SetItemText($hWndLVLocal, $iIndex, $sDate, 2)
    _GUICtrlListView_SetItemText($hWndLVLocal, $iIndex, $sAttr, 3)
    EndIf
    Next
    _GUICtrlListView_EndUpdate($hWndLVLocal)
    EndIf
    EndFunc ;==>_PopulateLV_Local

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

    Func _GetLocalTVPath()
    AdlibUnRegister('_GetLocalTVPath')
    $sOldPathLocalTV = $sPathLocalTV
    Local $iItemIndex = _GUICtrlTreeView_GetSelection($idTVLocal)
    If $iItemIndex = 0 Then _GUICtrlTreeView_SelectItemByIndex($idTVLocal, $idTVLocal, 1)
    $sPathLocalTV = StringReplace(_GUICtrlTreeView_GetTree($idTVLocal, $iItemIndex), $Delim1, $Delim) & $Delim
    If $sPathLocalTV <> $sOldPathLocalTV Then
    ;Klickgeräusch einfügen
    _PopulateLV_Local($sPathLocalTV)
    $sOldPathLocalTV = $sPathLocalTV
    EndIf
    AdlibRegister('_GetLocalTVPath')
    EndFunc ;==>_GetLocalTVPath

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

    Func _FormatDate($aDate)
    Return $aDate[2] & '.' & $aDate[1] & '.' & $aDate[0] & ' ' & $aDate[3] & ':' & $aDate[4]
    EndFunc ;==>_FormatDate

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

    Func _GUICtrlTreeView_FileExplorer($hTreeview, $hITEM, $sPath)
    ;Original aus Oscar
    Local $hLocalTVNode
    Local $sFileList, $sFolderList, $aDirList, $hSearch, $sFile
    ;Local $iHidden = RegRead('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', 'Hidden') - 1
    ;Local $iSuperHidden = Not RegRead('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced', 'ShowSuperHidden')
    ;jetzt global da auch für TV verwendet
    $hSearch = FileFindFirstFile($sPath & $Delim & '*')
    If $hSearch = -1 Then Return True
    Do
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop
    Switch @extended
    Case False
    If $iHidden And StringInStr(FileGetAttrib($sPath & $Delim & $sFile), 'H') Then ContinueLoop
    If $iSuperHidden And StringInStr(FileGetAttrib($sPath & $Delim & $sFile), 'S') Then ContinueLoop
    $sFileList &= $sFile & $Delim1
    Case True
    If _IsReparsePoint($sPath & $Delim & $sFile) Then ContinueLoop
    $sFolderList &= $sFile & $Delim1
    EndSwitch
    Until False
    FileClose($hSearch)
    If $sFolderList & $sFileList = '' Then Return True
    $aDirList = StringSplit(StringTrimRight($sFolderList & $sFileList, 1), $Delim1, 2)
    For $i = 0 To UBound($aDirList) - 1
    If StringInStr(FileGetAttrib($sPath & $Delim & $aDirList[$i]), 'D') Then
    $hLocalTVNode = _GUICtrlTreeView_AddChild($hTreeview, $hITEM, $aDirList[$i], 0, 1)
    If $aDirList[$i] = 'Musikdownload' Then
    ConsoleWrite('Musikdownload:' & $hLocalTVNode & @CRLF)
    EndIf
    Else
    ; _GUICtrlTreeView_AddChild($hTreeview, $hITEM, $sFile, 2, 2)
    ;werden bei mir nicht im LV angezeigt da im TV
    EndIf
    Next
    Return True
    EndFunc ;==>_GUICtrlTreeView_FileExplorer

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg
    Local $hWndFrom = $ilParam
    Local $iCode = _WinAPI_HiWord($iwParam)
    Local $hWndTVLocal = GUICtrlGetHandle($idLVLocal)
    Local $hWndLVLocal = GUICtrlGetHandle($idLVLocal)
    Local $hWndTVFTP = GUICtrlGetHandle($idLVFTP)
    Local $hWndLVFTP = GUICtrlGetHandle($idLVFTP)
    Switch $iCode
    Case $EN_SETFOCUS
    Switch $hWndFrom
    Case $hWndLVFTP
    $iActiveLV = $idLVFTP
    Case $hWndLVLocal
    $iActiveLV = $idLVLocal
    Case $hWndTVFTP
    $iActiveTV = $idTVFTP
    Case $hWndTVLocal
    $iActiveTV = $idTVLocal
    Case Else
    $iActiveLV = -99
    $iActiveTV = -99
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_COMMAND

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

    Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    ;Original Oscar
    Local $iAction, $hChild, $hITEM, $tNMTREEVIEW = DllStructCreate($tagNMTREEVIEW, $ilParam)
    Local $tagNMHDR = DllStructCreate("int;int;int", $ilParam)
    Local $aItem
    If @error Then Return 0
    Local $code = DllStructGetData($tagNMHDR, 3)
    Switch $iwParam
    Case $idTVLocal
    $iActiveTV = $idTVLocal
    Switch $code ;DllStructGetData($tNMTREEVIEW, 'Code')
    Case $TVN_ITEMEXPANDINGA, $TVN_ITEMEXPANDINGW
    $iAction = DllStructGetData($tNMTREEVIEW, 'Action')
    Switch $iAction
    Case $TVE_EXPAND
    If ToolTip('Please wait...', Default, Default, 'Read Directory', 1) Then $hITEM = DllStructGetData($tNMTREEVIEW, 'NewhItem')
    If _GUICtrlTreeView_GetExpanded($idTVLocal, $hITEM) Then Return $GUI_RUNDEFMSG
    $hChild = _GUICtrlTreeView_GetFirstChild($idTVLocal, $hITEM)
    If Not $hChild Then Return $GUI_RUNDEFMSG
    If _GUICtrlTreeView_BeginUpdate($idTVLocal) Then _GUICtrlTreeView_DeleteChildren($idTVLocal, $hChild)
    _GUICtrlTreeView_FileExplorer($idTVLocal, $hChild, StringReplace(_GUICtrlTreeView_GetTree($idTVLocal, $hChild), $Delim1, $Delim))
    Do
    $hChild = _GUICtrlTreeView_GetNextChild($idTVLocal, $hChild)
    If Not $hChild Then ExitLoop
    _GUICtrlTreeView_DeleteChildren($idTVLocal, $hChild)
    _GUICtrlTreeView_FileExplorer($idTVLocal, $hChild, StringReplace(_GUICtrlTreeView_GetTree($idTVLocal, $hChild), $Delim1, $Delim))
    Until False
    If _GUICtrlTreeView_EndUpdate($idTVLocal) Then ToolTip('')
    EndSwitch
    Case Else
    ;ConsoleWrite('TV akt. Itemhandle: '&_GUICtrlTreeView_GetItemHandle($idTVLocal)&@CRLF)
    EndSwitch
    Case $idLVLocal
    $iActiveLV = $idLVLocal
    Switch $code
    ;case $NM_RCLICK ,$NM_DBLCLK, ;Rechtsklick, DoppelKlick
    Case $NM_DBLCLK ;DoppelKlick
    _DblClick($idLVLocal)
    EndSwitch
    Case $idTVFTP
    $iActiveTV = $idTVFTP
    Case $idLVFTP
    $iActiveLV = $idLVFTP
    Switch $code
    ;case $NM_RCLICK ,$NM_DBLCLK, ;Rechtsklick, DoppelKlick
    Case $NM_DBLCLK ;DoppelKlick
    _DblClick($idLVFTP)
    EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_NOTIFY

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

    Func _DblClick($idLV)
    Local $sCC = ControlGetFocus($hGUI)
    If Not StringInStr($sCC, 'SysListView32') Then Return
    Local $aLVItem = _GUICtrlListView_GetItemTextArray($idLV)
    Local $sActItem = StringReplace(StringReplace(_GUICtrlTreeView_GetTree($idTVLocal), $Delim1, $Delim), '\\', '\')
    Local $hTVItem = _GUICtrlTreeView_FindItem($idTVLocal, $aLVItem[1])
    ConsoleWrite($sActItem & ' TVItem: ' & $hTVItem & ' [' & $aLVItem[1] & ']' & @CRLF)
    _GUICtrlTreeView_SelectItem($hWndTVLocal, $hTVItem)
    EndFunc ;==>_DblClick
    #cs
    Func _WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    ;Oscar's Original
    Local $iAction, $hChild, $hITEM, $tNMTREEVIEW = DllStructCreate($tagNMTREEVIEW, $ilParam)
    If DllStructGetData($tNMTREEVIEW, 'hWndFrom') = $hWndTVLocal Then
    Switch DllStructGetData($tNMTREEVIEW, 'Code')
    Case $TVN_ITEMEXPANDINGA, $TVN_ITEMEXPANDINGW
    $iAction = DllStructGetData($tNMTREEVIEW, 'Action')
    Switch $iAction
    Case $TVE_EXPAND
    If ToolTip('Please wait...', Default, Default, 'Read Directory', 1) Then $hITEM = DllStructGetData($tNMTREEVIEW, 'NewhItem')
    If _GUICtrlTreeView_GetExpanded($idTVLocal, $hITEM) Then Return $GUI_RUNDEFMSG
    $hChild = _GUICtrlTreeView_GetFirstChild($idTVLocal, $hITEM)
    If Not $hChild Then Return $GUI_RUNDEFMSG
    If _GUICtrlTreeView_BeginUpdate($idTVLocal) Then _GUICtrlTreeView_DeleteChildren($idTVLocal, $hChild)
    _GUICtrlTreeView_FileExplorer($idTVLocal, $hChild, StringReplace(_GUICtrlTreeView_GetTree($idTVLocal, $hChild), $Delim1, $Delim))
    Do
    $hChild = _GUICtrlTreeView_GetNextChild($idTVLocal, $hChild)
    If Not $hChild Then ExitLoop
    _GUICtrlTreeView_DeleteChildren($idTVLocal, $hChild)
    _GUICtrlTreeView_FileExplorer($idTVLocal, $hChild, StringReplace(_GUICtrlTreeView_GetTree($idTVLocal, $hChild), $Delim1, $Delim))
    Until False
    If _GUICtrlTreeView_EndUpdate($idTVLocal) Then ToolTip('')
    Case Else
    ;;ConsoleWrite('Action:' & $iAction & @CRLF)
    EndSwitch
    EndSwitch
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>_WM_NOTIFY
    #ce
    Func _IsReparsePoint($FLS)
    ; Author: progandy (http://www.autoit.de)
    Dim Static $K32 = DllOpen('kernel32.dll')
    Dim $DA = DllCall($K32, 'dword', 'GetFileAttributesW', 'wstr', $FLS)
    If @error Then Return SetError(1, @error, False)
    Return BitAND($DA[0], 1024) = 1024
    EndFunc ;==>_IsReparsePoint

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

    ; Author: progandy (http://www.autoit.de)
    Func _GUIImageList_GetSystemImageList($bLargeIcons = False)
    Local $dwFlags, $hIml, $FileInfo = DllStructCreate($tagSHFILEINFO)
    $dwFlags = BitOR($SHGFI_USEFILEATTRIBUTES, $SHGFI_SYSICONINDEX)
    If Not ($bLargeIcons) Then
    $dwFlags = BitOR($dwFlags, $SHGFI_SMALLICON)
    EndIf
    ;~ '// Load the image list - use an arbitrary file extension for the
    ;~ '// call to SHGetFileInfo (we don't want to touch the disk, so use
    ;~ '// FILE_ATTRIBUTE_NORMAL && SHGFI_USEFILEATTRIBUTES).
    $hIml = _WinAPI_SHGetFileInfo(".txt", $FILE_ATTRIBUTE_NORMAL, _
    DllStructGetPtr($FileInfo), DllStructGetSize($FileInfo), $dwFlags)
    Return $hIml
    EndFunc ;==>_GUIImageList_GetSystemImageList

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

    ; Author: progandy (http://www.autoit.de)
    Func _WinAPI_SHGetFileInfo($pszPath, $dwFileAttributes, $psfi, $cbFileInfo, $uFlags)
    Local $return = DllCall("shell32.dll", "dword_ptr", "SHGetFileInfo", "str", $pszPath, "DWORD", $dwFileAttributes, "ptr", $psfi, "UINT", $cbFileInfo, "UINT", $uFlags)
    If @error Then Return SetError(@error, 0, 0)
    Return $return[0]
    EndFunc ;==>_WinAPI_SHGetFileInfo

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

    ; Author: progandy (http://www.autoit.de)
    Func _GUIImageList_GetFileIconIndex($sFileSpec, $bLargeIcons = False, $bForceLoadFromDisk = False)
    Local $dwFlags, $FileInfo = DllStructCreate($tagSHFILEINFO)
    $dwFlags = $SHGFI_SYSICONINDEX
    If $bLargeIcons Then
    $dwFlags = BitOR($dwFlags, $SHGFI_LARGEICON)
    Else
    $dwFlags = BitOR($dwFlags, $SHGFI_SMALLICON)
    EndIf
    ;~ ' We choose whether to access the disk or not. If you don't
    ;~ ' hit the disk, you may get the wrong icon if the icon is
    ;~ ' not cached. But the speed is very good!
    If Not $bForceLoadFromDisk Then $dwFlags = BitOR($dwFlags, $SHGFI_USEFILEATTRIBUTES)
    ;~ ' sFileSpec can be any file. You can specify a
    ;~ ' file that does not exist and still get the
    ;~ ' icon, for example sFileSpec = "C:\PANTS.DOC"
    Local $lR = _WinAPI_SHGetFileInfo( _
    $sFileSpec, $FILE_ATTRIBUTE_NORMAL, DllStructGetPtr($FileInfo), DllStructGetSize($FileInfo), _
    $dwFlags _
    )
    If ($lR = 0) Then
    Return SetError(1, 0, -1)
    Else
    Return DllStructGetData($FileInfo, "iIcon")
    EndIf
    EndFunc ;==>_GUIImageList_GetFileIconIndex

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

    Func _StringAddThousandsSep($sString, $sThousands = -1, $sDecimal = -1)
    If $sString = '-' Then Return $sString ; This Line is only for FileCommander
    Local $sResult = "" ; Force string
    Local $rKey = "HKCU\Control Panel\International"
    If $sDecimal = -1 Then $sDecimal = RegRead($rKey, "sDecimal")
    If $sThousands = -1 Then $sThousands = RegRead($rKey, "sThousand")
    Local $aNumber = StringRegExp($sString, "(\D?\d+)\D?(\d*)", 1) ;
    ;This one works for negatives.
    If UBound($aNumber) = 2 Then
    Local $sLeft = $aNumber[0]
    While StringLen($sLeft)
    $sResult = $sThousands & StringRight($sLeft, 3) & $sResult
    $sLeft = StringTrimRight($sLeft, 3)
    WEnd
    $sResult = StringTrimLeft($sResult, StringLen($sThousands)) ; Strip leading thousands separator
    If $aNumber[1] <> "" Then $sResult &= $sDecimal & $aNumber[1]
    EndIf
    Return $sResult
    EndFunc ;==>_StringAddThousandsSep

    [/autoit]

    mfg autoBert

    3 Mal editiert, zuletzt von autoBert (6. April 2013 um 01:29)

    • Offizieller Beitrag

    Kann dein Skript nicht testen, aber was ich sehe:
    - Du nutzt die Funktion _GUICtrlTreeView_SelectItem mit einem String? ($sTVItem), es wird aber das Handle des zu selektierenden Item erwartet.
    - Du verwendest die Ctrl-ID, nach meiner Erfahrung ist auch beim Treeview das Handle angebrachter.
    - Und nur als Tipp: probiere als 3.ten Parameter $TVGN_CARET, mir gefällt es besser ;)

  • - Du nutzt die Funktion _GUICtrlTreeView_SelectItem mit einem String? ($sTVItem), es wird aber das Handle des zu selektierenden Item erwartet.


    War ein Handle (Rückgabe von _GUICtrlTreeView_FindItem) nur unkorrekt benannt.

    - Du verwendest die Ctrl-ID, nach meiner Erfahrung ist auch beim Treeview das Handle angebrachter.


    Bingo das wars, seltsamerweise läuft aber das Beispiel zu _GUICtrlTreeView_SelectItem mit einer ControlID.

    Derzeit ist noch ein anderer Bug bei der Darstellung der Systemicons (bereits in obigem Skript)enthalten. Ich nutze dazu Routinen von Progandy, welche auch Oscar in seinem Filecommander erfolgreich benutzt. Setze trotzdem auf gelöst und mache notfalls zu einem späteren Zeitpunkt ein Thema dazu auf.

    mfg autoBert