找回密码
 加入
搜索
查看: 5496|回复: 13

[效率算法] 如何读取固定格式的txt并有效率的写到Treeview[已解决]

 火.. [复制链接]
发表于 2015-7-14 08:10:26 | 显示全部楼层 |阅读模式
本帖最后由 haijie1223 于 2015-7-15 18:42 编辑

如何将下列格式的标题的txt内容快速读取并写入到treeview,如图格式的treeview:

逐条读取写入完全可以,但是效率实在太慢,如果有上千条实在不可取。有没有更加效率的读取方法。在txt内容格式不变的情况下。
一、第一个大标题
1、第一个小标题1
1.1、test第一个小标题1
1.2、test第一个小标题1
1.3、test第一个小标题1
2、第二个小标题1
2.1、test第一个小标题2
2.2、test第一个小标题2
2.3、test第一个小标题2

二、第二个大标题
1、第一个小标题1
1.1、test第一个小标题1
1.2、test第一个小标题1
1.3、test第一个小标题1
1.4、test第一个小标题1
2、第二个小标题1
2.1、test第一个小标题2
2.2、test第一个小标题2
2.3、test第一个小标题2
2.4、test第一个小标题2

三、第三个大标题
1、第一个小标题1
1.1、test第一个小标题1
1.2、test第一个小标题1
1.3、test第一个小标题1
2、第二个小标题1
2.1、test第一个小标题2
2.2、test第一个小标题2
2.3、test第一个小标题2
2.4、test第一个小标题2
2.5、test第一个小标题2

本帖子中包含更多资源

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

×
发表于 2015-7-14 12:32:37 | 显示全部楼层
一般是点击加号图标时再加载下一级吧,整体载入全部子项似乎有些不太合理
 楼主| 发表于 2015-7-14 17:03:08 | 显示全部楼层
回复 2# afan


    Afan,麻烦给个示例。
发表于 2015-7-14 18:05:46 | 显示全部楼层
回复 3# haijie1223


    试试先解析txt档到数组,在再单击项目时读取相应数组再载入子项目
 楼主| 发表于 2015-7-14 21:53:54 | 显示全部楼层
回复 4# afan


    先解析到数组,再载入。我的理解是:还是固定数组,比如点击1,那么载入1.1,1.2,1.3,1.4。。。因为这个是不固定的,总不能$array[n] to $array[n+x] 吧。能自己循环就好了。
发表于 2015-7-15 12:50:34 | 显示全部楼层
解析一次到数组  这个数组肯定是固定的  你指的不固定  估计是示例所指的条目数量不固定吧  那依旧是解析到数组的问题了  如何构建这个数组比较重要  比如 数组的元素也可以是数组 这就相当于下级项目了
 楼主| 发表于 2015-7-15 15:11:25 | 显示全部楼层
回复 6# afan


    多谢指点,我再琢磨一下。
发表于 2015-7-15 18:19:18 | 显示全部楼层
试下
Local $Str = _
                '一、第一个大标题' & @CRLF & _
                '1、一大第一个小标题1' & @CRLF & _
                '1.1、一大一小test第一个小标题1' & @CRLF & _
                '1.2、一大一小test第一个小标题1' & @CRLF & _
                '1.3、一大一小test第一个小标题1' & @CRLF & _
                '2、一大第二个小标题1' & @CRLF & _
                '2.1、一大二小test第一个小标题2' & @CRLF & _
                '2.2、一大二小test第一个小标题2' & @CRLF & _
                '2.3、一大二小test第一个小标题2' & @CRLF & @CRLF & _
                '二、第二个大标题' & @CRLF & _
                '1、二大第一个小标题1' & @CRLF & _
                '1.1、二大一小test第一个小标题1' & @CRLF & _
                '1.2、二大一小test第一个小标题1' & @CRLF & _
                '1.3、二大一小test第一个小标题1' & @CRLF & _
                '1.4、二大一小test第一个小标题1' & @CRLF & _
                '2、二大第二个小标题1' & @CRLF & _
                '2.1、二大二小test第一个小标题2' & @CRLF & _
                '2.2、二大二小test第一个小标题2' & @CRLF & _
                '2.3、二大二小test第一个小标题2' & @CRLF & _
                '2.4、二大二小test第一个小标题2' & @CRLF & @CRLF & _
                '三、第三个大标题' & @CRLF & _
                '1、三大第一个小标题1' & @CRLF & _
                '1.1、三大一小test第一个小标题1' & @CRLF & _
                '1.2、三大一小test第一个小标题1' & @CRLF & _
                '1.3、三大一小test第一个小标题1' & @CRLF & _
                '2、三大第二个小标题1' & @CRLF & _
                '2.1、三大二小test第一个小标题2' & @CRLF & _
                '2.2、三大二小test第一个小标题2' & @CRLF & _
                '2.3、三大二小test第一个小标题2' & @CRLF & _
                '2.4、三大二小test第一个小标题2' & @CRLF & _
                '2.5、三大二小test第一个小标题2'
;~MsgBox(0, '原字符串', $Str)

#include <GuiTreeView.au3>

Local $hGui = GUICreate('TreeView 逐级载入')
Local $iTreeView = GUICtrlCreateTreeView(10, 10, 350, 300)
Local $aTree = _2DArrayCreat($Str)
_TreeLoad($aTree)
GUISetState()
GUIRegisterMsg(0x4E, '_WM_NOTIFY')
While GUIGetMsg() <> -3
WEnd

Func _TreeLoad($aTree)
        If Not IsArray($aTree) Or UBound($aTree, 0) <> 2 Then Return
        Local $i, $iItem
        For $i = 0 To UBound($aTree) - 1
                $iItem = GUICtrlCreateTreeViewItem($aTree[$i][0], $iTreeView)
                If IsArray($aTree[$i][1]) Then _GUICtrlTreeView_SetChildren($iTreeView, $iItem, 1)
        Next
EndFunc   ;==>_TreeLoad

Func _WM_NOTIFY($hWnd, $msg, $wParam, $lParam)
        Local $tNMHdr = DllStructCreate($tagNMHDR, $lParam), $tNM_TREEVIEW
        Local $hWndFrom = DllStructGetData($tNMHdr, 'hWndFrom')
        Local $iIDFrom = DllStructGetData($tNMHdr, 'IDFrom')
        Local $iCode = DllStructGetData($tNMHdr, 'Code')
        If $iIDFrom = $iTreeView Then
                Switch $iCode
                        Case $TVN_ITEMEXPANDINGA, $TVN_ITEMEXPANDINGW
                                _TreeLoadAdd()
                EndSwitch
        EndIf
        Return 'GUI_RUNDEFMSG'
EndFunc   ;==>_WM_NOTIFY

Func _TreeLoadAdd()
        Local $iT = _GetHitTestItem()
        If _GUICtrlTreeView_ExpandedOnce($iTreeView, $iT) Then Return
        Local $hParent = _GUICtrlTreeView_GetParentHandle($iTreeView, $iT)
        Local $hItem
        If Not $hParent Then        ;---- 没有上级,即为第0级
                Local $Index = _GUICtrlTreeView_Index($iTreeView, $iT)
                If IsArray($aTree[$Index][1]) Then
                        Local $aTmp = $aTree[$Index][1]
                        For $i = 0 To UBound($aTmp) - 1
                                $hItem = _GUICtrlTreeView_AddChild($iTreeView, $iT, $aTmp[$i][0])
                                If IsArray($aTmp[$i][1]) Then _GUICtrlTreeView_SetChildren($iTreeView, $hItem, 1)
                        Next
                EndIf
        Else
                Local $hParent1 = _GUICtrlTreeView_GetParentHandle($iTreeView, $hParent)
                If Not $hParent1 Then        ;---- 第1级
                        Local $Index0 = _GUICtrlTreeView_Index($iTreeView, $hParent)        ;---- 0级索引
                        Local $Index1 = _GUICtrlTreeView_Index($iTreeView, $iT)                ;---- 1级索引
                        Local $aTreeXm = $aTree[$Index0][1]
                        If IsArray($aTreeXm) And IsArray($aTreeXm[$Index1][1]) Then
                                Local $aTmp1 = $aTreeXm[$Index1][1]
                                For $ii = 0 To UBound($aTmp1) - 1
                                        $hItem = _GUICtrlTreeView_AddChild($iTreeView, $iT, $aTmp1[$ii])
                                Next
                        EndIf
                EndIf
        EndIf
EndFunc   ;==>_TreeLoadAdd

Func _GetHitTestItem()
        Local $aW = _ControlGetPos($hGui, '', $iTreeView)
        Local $iX = MouseGetPos(0) - $aW[0]
        Local $iY = MouseGetPos(1) - $aW[1]
        Local $iT = _GUICtrlTreeView_HitTestItem($iTreeView, $iX, $iY)
        Return $iT
EndFunc   ;==>_GetHitTestItem

Func _ControlGetPos($hWnd, $text, $Ctrlid)
        Local $ControlPos = ControlGetPos($hWnd, $text, $Ctrlid)
        If @error Then Return SetError(1)
        If Not IsHWnd($hWnd) Then $hWnd = WinGetHandle($hWnd, $text)
        Local $tPoint = DllStructCreate('int X;int Y')
        DllStructSetData($tPoint, 'X', $ControlPos[0])
        DllStructSetData($tPoint, 'Y', $ControlPos[1])
        DllCall('user32.dll', 'bool', 'ClientToScreen', 'hwnd', $hWnd, 'ptr', DllStructGetPtr($tPoint))
        If @error Then Return SetError(2)
        Local $xy[6] = [DllStructGetData($tPoint, 'X'), DllStructGetData($tPoint, 'Y'), $ControlPos[2], $ControlPos[3], $ControlPos[0], $ControlPos[1]]
        Return $xy
EndFunc   ;==>_ControlGetPos

Func _2DArrayCreat($Str)
        Local $aSR1 = StringRegExp($Str, '(?m)^([^\x00-\xff]+\V+)([\S\s]*?)(?=\r\n[^\x00-\xff]|\Z)', 3) ;---- 一、大标题
        If @error Then Return SetError(1)
        Local $a2D1[UBound($aSR1) / 2][2], $x = 0, $i
        ;$a2D1[n] = 大标题; $a2D1[n + 1] = 为数组则有下级

        For $i = 0 To UBound($aSR1) - 1 Step 2
                $a2D1[$x][0] = $aSR1[$i]
                $a2D1[$x][1] = $aSR1[$i + 1]
                Local $aSR2 = StringRegExp($a2D1[$x][1], '(?m)^(\d+、\V+)((?:\v+\d+\.\d+、\V+)*)', 3) ;---- 1、第x个小标题
                If Not @error Then
                        Local $a2D2[UBound($aSR2) / 2][2], $xx = 0, $ii
                        For $ii = 0 To UBound($aSR2) - 1 Step 2
                                $a2D2[$xx][0] = $aSR2[$ii]
                                $a2D2[$xx][1] = $aSR2[$ii + 1]
                                $a2D2[$xx][1] = StringRegExp($a2D2[$xx][1], '(?m)^\d+\.\d+、\V+', 3) ;---- 1.1、test第x个小标题
                                $xx += 1
                        Next
                        $a2D1[$x][1] = $a2D2 ;---- 赋值为数组
                EndIf
                $x += 1
        Next
        Return $a2D1
EndFunc   ;==>_2DArrayCreat

评分

参与人数 2金钱 +90 贡献 +21 收起 理由
lpxx + 60 + 11 厉害、佩服
haijie1223 + 30 + 10 代码吊爆天!

查看全部评分

 楼主| 发表于 2015-7-15 18:42:22 | 显示全部楼层
回复 8# afan


    经过Afan的提示,已经想到是这种方法,忙了一下午还没来得及自己写一下试试,Afan已经给出了这么高精尖的代码,感觉有点太高大上!
发表于 2015-7-15 19:25:38 | 显示全部楼层
回复 9# haijie1223


    好吧 代码好像是有点长 但都是简单的堆积… _ _||
发表于 2015-7-16 14:42:34 | 显示全部楼层
谢谢分享!学习学习了
发表于 2015-7-17 09:08:37 | 显示全部楼层
学习,学习,感谢,感谢
发表于 2015-7-17 21:58:18 | 显示全部楼层
谢谢前辈共享~
发表于 2015-7-19 17:29:35 | 显示全部楼层
谢谢分享 学习了 前辈辛苦了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 20:41 , Processed in 0.102315 second(s), 34 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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