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
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
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
#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>
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
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', ; Festplatte
_GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 11) ; CDROM
_GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 12) ; Netzwerklaufwerk
_GUIImageList_AddIcon($hImgDrives, 'shell32.dll', 53) ; Unbekannt
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
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()
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)
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
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
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
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
Func _FormatDate($aDate)
Return $aDate[2] & '.' & $aDate[1] & '.' & $aDate[0] & ' ' & $aDate[3] & ':' & $aDate[4]
EndFunc ;==>_FormatDate
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
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
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
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
; 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
; 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
; 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
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
mfg autoBert