找回密码
 加入
搜索
查看: 8774|回复: 18

[AU3基础] [已解决]:GUICtrlCreateTreeView 如何根据 TXT文件,创建类似资源管理器的GUI。

 火.. [复制链接]
发表于 2012-2-1 21:06:44 | 显示全部楼层 |阅读模式
本帖最后由 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[10000], $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[0]
                                $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
 楼主| 发表于 2012-2-1 22:10:05 | 显示全部楼层
我想做成的效果是:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2012-2-1 22:11:30 | 显示全部楼层
现在的效果是:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-2-2 00:09:09 | 显示全部楼层
本帖最后由 afan 于 2012-2-2 01:10 编辑
我想做成的效果是:
lfx99 发表于 2012-2-1 22:10



    错了不? Temp\Temp1\add\AU3\ 下面应该有两个文件夹及子文件夹~
Temp\Temp1\add\AU3\文件夹\文件夹2\
Temp\Temp1\add\AU3\文件夹2\文件夹3

是以下这样吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-2-2 09:54:24 | 显示全部楼层
回复 1# lfx99

理论上和实测结果均显示,无误。(点击子项就能显示出来)
估计楼主的意思是,让它自动显示出来,那就在第39行后、40行前增加
GUICtrlSetState(-1, $GUI_SHOW)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-2-2 10:11:57 | 显示全部楼层
回复  lfx99

理论上和实测结果均显示,无误。(点击子项就能显示出来)
估计楼主的意思是,让它自动显 ...
楼上风云 发表于 2012-2-2 09:54



    这就是重复的路径~
 楼主| 发表于 2012-2-2 12:29:21 | 显示全部楼层
本帖最后由 lfx99 于 2012-2-2 12:36 编辑

谢楼上几位前辈。可能我没表达清楚:由于在txt文件里第一行和第二行内容是一样的,所以在TreeView里面都会显示,TXT其他几句都含有重复的路径。我想要的是:如何去掉这些重复的路径,就像windows里面资源管理器那样直观的显示。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2012-2-2 12:30:31 | 显示全部楼层
错了不? Temp\Temp1\add\AU3\ 下面应该有两个文件夹及子文件夹~
Temp\Temp1\add\AU3\文件夹\文 ...
afan 发表于 2012-2-2 00:09



    是这样的。
发表于 2012-2-2 13:03:03 | 显示全部楼层
回复 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[0]
                $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
 楼主| 发表于 2012-2-2 13:52:21 | 显示全部楼层
回复 9# afan

谢前辈指点,不过为何在line 43  ContinueLoop 2 出错?注释掉改行也可以,但会把TXT文件的第二行作为第一行的子项添加了
发表于 2012-2-2 14:06:12 | 显示全部楼层
回复 10# lfx99


    你是完全没改动测试的吗?我这是正常的
 楼主| 发表于 2012-2-2 14:21:51 | 显示全部楼层
本帖最后由 lfx99 于 2012-2-2 14:23 编辑

回复 11# afan

代码我是复制下来的,直接运行的,奇怪。应该在第二层loop也是正常的,为何在我那儿就出错

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2012-2-2 14:31:51 | 显示全部楼层
本帖最后由 afan 于 2012-2-2 14:34 编辑

回复 12# lfx99


    改成 ExitLoop 试试,作用和 ContinueLoop 2 一样

我的是 xp + au3 3.3.6.1
 楼主| 发表于 2012-2-2 14:32:19 | 显示全部楼层
回复 11# afan

我在另外一台电脑上测试了(XP系统,autoit 版本 3.3.6.1),却是ok的。我在(win7 autoit 版本 3.3.7.15)却出错了
 楼主| 发表于 2012-2-2 14:34:50 | 显示全部楼层
回复 13# afan


   改成exitloop 后在两种系统两种版本中都可以。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-9-30 23:30 , Processed in 0.093822 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表