[已解决]:GUICtrlCreateTreeView 如何根据 TXT文件,创建类似资源管理器的GUI。
本帖最后由 lfx99 于 2012-2-2 14:38 编辑用一个包含具体路径的txt文件,在TreeView上显示,但路径多为重复,想了用 _GUICtrlTreeView_FindItemEx搜索以避免重复,但我只能做到第一层。苦思了好几天,无果,求助高手指点。。
附上代码 和 txt文件。#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <file.au3>
#include <array.au3>
#include <GuiTreeView.au3>
Global $File = @ScriptDir & "\pach.txt"
$GUI = GUICreate("test", 350, 500, -1, -1)
$TreeGui = _GUICtrlTreeView_Create($GUI, 15, 15, 280, 430, BitOR($GUI_SS_DEFAULT_TREEVIEW, $WS_BORDER), BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
GUISetState(@SW_SHOW)
_AddToList($TreeGui, $File)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd
Func _AddToList($TreeView, $LiseFile)
Local $item, $StrAd, $StrAd1
_GUICtrlTreeView_BeginUpdate($TreeView)
$line = _FileCountLines($LiseFile)
For $i = 1 To $line
$str = FileReadLine($LiseFile, $i)
If StringRight($str, 1) = '\' Then $str = StringTrimRight($str, 1)
$strArray = StringSplit($str, '\')
If Not @error Then
For $o = 1 To $strArray
$StrAd &= "\" & $strArray[$o]
$StrAdNew = StringTrimLeft($StrAd, 1)
$hdle = _GUICtrlTreeView_FindItemEx($TreeView, $StrAdNew)
If $hdle Then
Else;如没有则逐渐建立。(如第一项)
$item[$o] = _GUICtrlTreeView_AddChild($TreeView, $item[$o - 1], $strArray[$o])
EndIf
Next
$StrAd = ''
EndIf
Next
_GUICtrlTreeView_EndUpdate($TreeView)
EndFunc ;==>_AddToList
txt文件:Temp\Temp1\add\AU3\文件夹\文件夹2
Temp\Temp1\add\AU3\文件夹\文件夹2
Temp\Temp1\add\AU3\文件夹2\文件夹3
Temp0\add\AU3
Temp0\add\AU3\myfile.inf
Temp0\add\AU3\AU3\myfile 我想做成的效果是: 现在的效果是: 本帖最后由 afan 于 2012-2-2 01:10 编辑
我想做成的效果是:
lfx99 发表于 2012-2-1 22:10 http://www.autoitx.com/images/common/back.gif
错了不? Temp\Temp1\add\AU3\ 下面应该有两个文件夹及子文件夹~
Temp\Temp1\add\AU3\文件夹\文件夹2\
Temp\Temp1\add\AU3\文件夹2\文件夹3
是以下这样吗? 回复 1# lfx99
理论上和实测结果均显示,无误。(点击子项就能显示出来)
估计楼主的意思是,让它自动显示出来,那就在第39行后、40行前增加
GUICtrlSetState(-1, $GUI_SHOW) 回复lfx99
理论上和实测结果均显示,无误。(点击子项就能显示出来)
估计楼主的意思是,让它自动显 ...
楼上风云 发表于 2012-2-2 09:54 http://www.autoitx.com/images/common/back.gif
这就是重复的路径~ 本帖最后由 lfx99 于 2012-2-2 12:36 编辑
谢楼上几位前辈。可能我没表达清楚:由于在txt文件里第一行和第二行内容是一样的,所以在TreeView里面都会显示,TXT其他几句都含有重复的路径。我想要的是:如何去掉这些重复的路径,就像windows里面资源管理器那样直观的显示。 错了不? Temp\Temp1\add\AU3\ 下面应该有两个文件夹及子文件夹~
Temp\Temp1\add\AU3\文件夹\文 ...
afan 发表于 2012-2-2 00:09 http://www.autoitx.com/images/common/back.gif
是这样的。 回复 8# lfx99 #include <WindowsConstants.au3>
#include <Array.au3>
#include <GuiTreeView.au3>
$File = @TempDir & '\pach_tmp.txt'
If Not FileExists($File) Then _CreateFile($File) ;== 创建“较苛刻的”测试文件
$hGui = GUICreate('test', 350, 500)
$hTreeView = _GUICtrlTreeView_Create($hGui, 15, 15, 280, 430, BitOR($GUI_SS_DEFAULT_TREEVIEW, $WS_BORDER), BitOR($WS_EX_CLIENTEDGE, $WS_EX_STATICEDGE))
GUISetState(@SW_SHOW)
_AddToTree($hTreeView, $File)
_GUICtrlTreeView_Expand($hTreeView)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
;FileDelete($File)
Exit
EndSwitch
WEnd
Func _AddToTree($hTreeView, $LiseFile)
Local $aLine = StringRegExp(FileRead($LiseFile), '(?m)\h*(.*?\S.*?)\\*\h*(?:\v|$)', 3)
If @error Then Return
$aLine = _ArrayUnique($aLine)
_GUICtrlTreeView_BeginUpdate($hTreeView)
Local $i, $ii, $iii, $aFD
For $i = 1 To $aLine
$aFD = StringRegExp($aLine[$i], '[^\\]+', 3)
Local $sPTmp = '', $sPTmpSC = ''
For $ii = 0 To UBound($aFD) - 1
$sPTmpSC = $sPTmp
$sPTmp &= $aFD[$ii] & '\'
If IsDeclared($sPTmp) Then ContinueLoop
Assign($sPTmp, _GUICtrlTreeView_AddChild($hTreeView, Eval($sPTmpSC), $aFD[$ii]))
For $iii = $ii + 1 To UBound($aFD) - 1
$sPTmpSC = $sPTmp
$sPTmp &= $aFD[$iii] & '\'
Assign($sPTmp, _GUICtrlTreeView_AddChild($hTreeView, Eval($sPTmpSC), $aFD[$iii]))
Next
ContinueLoop 2
Next
Next
_GUICtrlTreeView_EndUpdate($hTreeView)
EndFunc ;==>_AddToTree
Func _CreateFile($sFile) ;======== 创建“较苛刻的”测试文件
;合法路径可包含空格、双斜杠、尾部有斜杠;
;行格式可以是CR、LF、CRLF;行首尾多余的空格;
Local $Str = _
'Temp\Temp 1\add\AU3\文件夹\文件夹2' & @LF & _
'Temp\Temp 1\add\AU3\文件夹\文件夹2\' & @CRLF & @CRLF & _
'Temp\Temp 1\add\AU3\文件夹2\文件夹3' & @CR & _
' Temp0\\add\\AU3\' & @CRLF & @CRLF & _
' ' & @CRLF & _
'Temp0\\add\AU3\\myfile.inf ' & @CRLF & @CRLF & _
'Temp0\add\AU3\AU3\my file\\' & @CRLF & _
' Temp0\\add\AU3\\myfile.inf' & @CRLF & _
'C:\Temp\Test'
FileDelete($sFile)
FileWrite($sFile, $Str)
ShellExecute($sFile) ;打开文本比对显示
EndFunc ;==>_CreateFile
回复 9# afan
谢前辈指点,不过为何在line 43ContinueLoop 2 出错?注释掉改行也可以,但会把TXT文件的第二行作为第一行的子项添加了 回复 10# lfx99
你是完全没改动测试的吗?我这是正常的 本帖最后由 lfx99 于 2012-2-2 14:23 编辑
回复 11# afan
代码我是复制下来的,直接运行的,奇怪。应该在第二层loop也是正常的,为何在我那儿就出错 本帖最后由 afan 于 2012-2-2 14:34 编辑
回复 12# lfx99
改成 ExitLoop 试试,作用和 ContinueLoop 2 一样
我的是 xp + au3 3.3.6.1 回复 11# afan
我在另外一台电脑上测试了(XP系统,autoit 版本 3.3.6.1),却是ok的。我在(win7 autoit 版本 3.3.7.15)却出错了 回复 13# afan
改成exitloop 后在两种系统两种版本中都可以。
页:
[1]
2