找回密码
 加入
搜索
楼主: mo_shaojie

[AU3基础] 关于水木子GUICtrlCreateList排序功能

 火.. [复制链接]
 楼主| 发表于 2010-12-6 10:39:23 | 显示全部楼层
我这个附件配置都是[0-9]数字的,怎么会出现不一样的,这个打开会提示数组错误或超出界限的?不明白.望指点一下.

本帖子中包含更多资源

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

×
发表于 2010-12-6 13:42:57 | 显示全部楼层
#include <GUIListBox.au3>
#include <GuiTreeView.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

$Path = @ScriptDir & '\Driver.ini'
$aRegFitem = StringRegExp(FileRead($Path), '\[\d+\]', 3)
$aRegSitem = StringRegExp(FileRead($Path), '\[\d+-\d+\]', 3)

Local $aFitem[UBound($aRegFitem)][2], $aSitem[UBound($aRegSitem)][2]
Local $sItemText
Local $z = 1, $f = -1, $s = 0

$iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)
GUICreate("TreeView项目勾选操作", 600, 450)
$TreeView1 = GUICtrlCreateTreeView(5, 5, 290, 380, $iStyle, $WS_EX_CLIENTEDGE)
$List1 = GUICtrlCreateListView("", 300, 5, 295, 380)
_GUICtrlListView_AddColumn($List1, "序号", 50)
_GUICtrlListView_AddColumn($List1, "信息", 230)

$But1 = GUICtrlCreateButton("读取被选项目", 100, 400, 100, 30, $WS_GROUP)
$But2 = GUICtrlCreateButton("开始模拟安装", 400, 400, 100, 30, $WS_GROUP)

$var = IniReadSectionNames($Path)
;_ArrayDisplay($var)
If Not @error Then
        For $i = 1 To $var[0]
                If StringIsDigit($var[$i]) Then
                        $f += 1
                        $sFtext = IniRead($Path, $var[$i], 'Name', '')
                        $aFitem[$f][0] = GUICtrlCreateTreeViewItem($sFtext, $TreeView1)
                        ;GUICtrlSetState(-1, $GUI_CHECKED)
                        $aFitem[$f][1] = $sFtext
                Else
                        $s += 1
                        $sStext = IniRead($Path, $var[$i], 'Name', '')
                        $aSitem[$s][0] = GUICtrlCreateTreeViewItem($sStext, $aFitem[$f][0])
                        ;GUICtrlSetState(-1, $GUI_CHECKED)
                        $aSitem[$s][1] = $sStext
                EndIf
        Next
EndIf
$aSitem[0][0] = UBound($aSitem) - 1
AddItem()

GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $aFitem[0][0] To $aFitem[UBound($aFitem) - 1][0] ;父项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果父项目勾选,其下所有子项目全选。
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $nMsg))
                                For $i = $nMsg To $nMsg + $iSitemNumber
                                        GUICtrlSetState($i, $GUI_CHECKED)
                                Next
                        Else
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $nMsg))
                                For $i = $nMsg To $nMsg + $iSitemNumber
                                        GUICtrlSetState($i, $GUI_UNCHECKED)
                                Next
                        EndIf
                        ContinueCase
                Case $aSitem[1][0] To $aSitem[$aSitem[0][0]][0] ;子项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果子项目勾选,其父项目也跟着勾选。
                                $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
                                GUICtrlSetState($hFitemHandle, $GUI_CHECKED)
                        Else ;父项目下的所有子项目全部取消勾选,父项目也跟着取消勾选。
                                $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $hFitemHandle))
                                For $i = $hFitemHandle To $hFitemHandle + $iSitemNumber
                                        If GUICtrlRead($i) = $GUI_CHECKED Then ExitLoop
                                        If $i = $hFitemHandle + $iSitemNumber Then GUICtrlSetState($hFitemHandle, $GUI_UNCHECKED)
                                Next
                        EndIf
                        AddItem()
                Case $But1
                        $sText = ''
                        For $i = 1 To $aSitem[0][0]
                                If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
                                        $sText &= '被选项目句柄:' & $aSitem[$i][0] & '   ' & '项目文本:' & $aSitem[$i][1] & @CRLF
                                EndIf
                        Next
                        If $sText <> '' Then MsgBox(0, '获取被选项目句柄+项目文本', $sText)
                Case $But2
                        begin()
        EndSwitch
WEnd

Func AddItem()
        $sItemText = ''
        _GUICtrlListView_DeleteAllItems($List1) ;清空List内所有数据
        For $i = 1 To $aSitem[0][0]
                        If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
                                GUICtrlCreateListViewItem(StringFormat("[%02d]", _GUICtrlListView_GetItemCount($List1)+1) & "|" & $aSitem[$i][1], $List1) ;如果项目被勾选则写入List
                                $sItemText &= $aSitem[$i][1] & '|'
                        EndIf
        Next
EndFunc

Func begin()
        $aLines = StringSplit($sItemText, '|', 2)
                GUICtrlSetState ($List1, $GUI_FOCUS)                ;此处要将焦点设置在 $List1 ,否则被选项的背景是灰的,不是蓝色
        For $i = 0 To UBound($aLines) - 1
                        _GUICtrlListView_SetItemText($List1, $i, '[→]')
                        _GUICtrlListView_SetItemSelected($List1, $i)
                        Sleep(800)
                        _GUICtrlListView_SetItemText($List1, $i, '[OK]')
                        _GUICtrlListView_SetItemSelected($List1, $i, False)
        Next
        MsgBox(0, '', '安装完成!')
EndFunc   ;==>begin
 楼主| 发表于 2010-12-6 14:24:52 | 显示全部楼层
#include
#include
#include
#include
#include

$Path = @ScriptDir & '\Driver.ini'
$aRegFi ...
yhxhappy 发表于 2010-12-6 13:42


你发的这个代码用我那个附件配置文件也是错误的啊.
发表于 2010-12-6 17:21:25 | 显示全部楼层
回复 18# mo_shaojie


    不可能,我都运行得好好的,配置文件和脚本是不是放在同一个目录?
#include <GUIListBox.au3>
#include <GuiTreeView.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

$Path = @ScriptDir & '\Driver.ini'
If FileExists($Path) = 0 Then
        MsgBox(0,"","配置文件不存在")
        Exit
EndIf
$aRegFitem = StringRegExp(FileRead($Path), '\[\d+\]', 3)
$aRegSitem = StringRegExp(FileRead($Path), '\[\d+-\d+\]', 3)

Local $aFitem[UBound($aRegFitem)][2], $aSitem[UBound($aRegSitem)][2]
Local $sItemText
Local $z = 1, $f = -1, $s = 0

$iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)
GUICreate("TreeView项目勾选操作", 600, 450)
$TreeView1 = GUICtrlCreateTreeView(5, 5, 290, 380, $iStyle, $WS_EX_CLIENTEDGE)
$List1 = GUICtrlCreateListView("", 300, 5, 295, 380)
_GUICtrlListView_AddColumn($List1, "序号", 50)
_GUICtrlListView_AddColumn($List1, "信息", 230)

$But1 = GUICtrlCreateButton("读取被选项目", 100, 400, 100, 30, $WS_GROUP)
$But2 = GUICtrlCreateButton("开始模拟安装", 400, 400, 100, 30, $WS_GROUP)

$var = IniReadSectionNames($Path)
If Not @error Then
        For $i = 1 To $var[0]
                If StringIsDigit($var[$i]) Then
                        $f += 1
                        $sFtext = IniRead($Path, $var[$i], 'Name', '')
                        $aFitem[$f][0] = GUICtrlCreateTreeViewItem($sFtext, $TreeView1)
                        GUICtrlSetState(-1, $GUI_CHECKED)
                        $aFitem[$f][1] = $sFtext
                Else
                        $s += 1
                        $sStext = IniRead($Path, $var[$i], 'Name', '')
                        $aSitem[$s][0] = GUICtrlCreateTreeViewItem($sStext, $aFitem[$f][0])
                        GUICtrlSetState(-1, $GUI_CHECKED)
                        $aSitem[$s][1] = $sStext
                EndIf
        Next
EndIf
$aSitem[0][0] = UBound($aSitem) - 1
AddItem()

GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $aFitem[0][0] To $aFitem[UBound($aFitem) - 1][0] ;父项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果父项目勾选,其下所有子项目全选。
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $nMsg))
                                For $i = $nMsg To $nMsg + $iSitemNumber
                                        GUICtrlSetState($i, $GUI_CHECKED)
                                Next
                        Else
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $nMsg))
                                For $i = $nMsg To $nMsg + $iSitemNumber
                                        GUICtrlSetState($i, $GUI_UNCHECKED)
                                Next
                        EndIf
                        ContinueCase
                Case $aSitem[1][0] To $aSitem[$aSitem[0][0]][0] ;子项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果子项目勾选,其父项目也跟着勾选。
                                $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
                                GUICtrlSetState($hFitemHandle, $GUI_CHECKED)
                        Else ;父项目下的所有子项目全部取消勾选,父项目也跟着取消勾选。
                                $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $hFitemHandle))
                                For $i = $hFitemHandle To $hFitemHandle + $iSitemNumber
                                        If GUICtrlRead($i) = $GUI_CHECKED Then ExitLoop
                                        If $i = $hFitemHandle + $iSitemNumber Then GUICtrlSetState($hFitemHandle, $GUI_UNCHECKED)
                                Next
                        EndIf
                        AddItem()
                Case $But1
                        $sText = ''
                        For $i = 1 To $aSitem[0][0]
                                If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
                                        $sText &= '被选项目句柄:' & $aSitem[$i][0] & '   ' & '项目文本:' & $aSitem[$i][1] & @CRLF
                                EndIf
                        Next
                        If $sText <> '' Then MsgBox(0, '获取被选项目句柄+项目文本', $sText)
                Case $But2
                        begin()
        EndSwitch
WEnd

Func AddItem()
        $sItemText = ''
        _GUICtrlListView_DeleteAllItems($List1) ;清空List内所有数据
        For $i = 1 To $aSitem[0][0]
                        If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
                                GUICtrlCreateListViewItem(StringFormat("[%02d]", _GUICtrlListView_GetItemCount($List1)+1) & "|" & $aSitem[$i][1], $List1) ;如果项目被勾选则写入List
                                $sItemText &= $aSitem[$i][1] & '|'
                        EndIf
        Next
EndFunc

Func begin()
        $aLines = StringSplit($sItemText, '|', 2)
                GUICtrlSetState ($List1, $GUI_FOCUS)                ;此处要将焦点设置在 $List1 ,否则被选项的背景是灰的,不是蓝色
        For $i = 0 To UBound($aLines) - 1
                        _GUICtrlListView_SetItemText($List1, $i, '[→]')
                        _GUICtrlListView_SetItemSelected($List1, $i)
                        Sleep(800)
                        _GUICtrlListView_SetItemText($List1, $i, '[OK]')
                        _GUICtrlListView_SetItemSelected($List1, $i, False)
        Next
        MsgBox(0, '', '安装完成!')
EndFunc   ;==>begin

评分

参与人数 1金钱 +25 收起 理由
afan + 25

查看全部评分

发表于 2010-12-6 17:34:42 | 显示全部楼层
究竟是个啥问题嘛?我看了几遍也没明白,问题解决了吗?
 楼主| 发表于 2010-12-6 19:31:59 | 显示全部楼层
究竟是个啥问题嘛?我看了几遍也没明白,问题解决了吗?
水木子 发表于 2010-12-6 17:34

没有啊.问题就是用16楼的配置文件会出现错误.不知是怎么回事啊.弄不明白.
都是一样的[1-9]数字配置文件的.怎么这个却会出现错误的?
发表于 2010-12-6 19:38:49 | 显示全部楼层
16楼的配置文件 在19楼的脚本中正常运行
 楼主| 发表于 2010-12-6 19:51:04 | 显示全部楼层
本帖最后由 mo_shaojie 于 2010-12-6 19:54 编辑
16楼的配置文件 在19楼的脚本中正常运行
afan 发表于 2010-12-6 19:38


晕了,按照AFAN说的.又确实是运行正常.但是用添加了多几条,例[1-1],[1-4]的文件,却不行了?

要知道配置文件有时候是要修改的.改多或改少不行的话.那这个就不算是一个程序了.

本帖子中包含更多资源

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

×
发表于 2010-12-6 20:54:07 | 显示全部楼层
发表于 2010-12-6 21:50:16 | 显示全部楼层
#include <GUIListBox.au3>
#include <GuiTreeView.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

$Path = @ScriptDir & '\Driver.ini'
If FileExists($Path) = 0 Then
        MsgBox(0,"","配置文件不存在")
        Exit
EndIf
$aRegFitem = StringRegExp(FileRead($Path), '\[\d+\]', 3)
$aRegSitem = StringRegExp(FileRead($Path), '\[\d+-\d+\]', 3)

Local $aFitem[1][2], $aSitem[1][2]
Local $sItemText

$iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)
GUICreate("TreeView项目勾选操作", 600, 450)
$TreeView1 = GUICtrlCreateTreeView(5, 5, 290, 380, $iStyle, $WS_EX_CLIENTEDGE)
$List1 = GUICtrlCreateListView("", 300, 5, 295, 380)
_GUICtrlListView_AddColumn($List1, "序号", 50)
_GUICtrlListView_AddColumn($List1, "信息", 230)

$But1 = GUICtrlCreateButton("读取被选项目", 100, 400, 100, 30, $WS_GROUP)
$But2 = GUICtrlCreateButton("开始模拟安装", 400, 400, 100, 30, $WS_GROUP)

$var = IniReadSectionNames($Path)
If Not @error Then
        For $i = 1 To $var[0]
                If StringIsDigit($var[$i]) Then
                                                $sFtext = IniRead($Path, $var[$i], 'Name', '')                                                
                                                ReDim $aFitem[UBound($aFitem)+1][2]
                        $aFitem[UBound($aFitem)-1][0] = GUICtrlCreateTreeViewItem($sFtext, $TreeView1)
                        GUICtrlSetState(-1, $GUI_CHECKED)
                        $aFitem[UBound($aFitem)-1][1] = $sFtext
                                                $aFitem[0][0] = UBound($aFitem) - 1
                Else
                        $sStext = IniRead($Path, $var[$i], 'Name', '')
                                                
                                                ReDim $aSitem[UBound($aSitem)+1][2]
                        $aSitem[UBound($aSitem)-1][0] = GUICtrlCreateTreeViewItem($sStext, $aFitem[$aFitem[0][0]][0])
                        GUICtrlSetState(-1, $GUI_CHECKED)
                        $aSitem[UBound($aSitem)-1][1] = $sStext
                                                $aSitem[0][0] = UBound($aSitem) - 1
                                        EndIf
        Next
EndIf


AddItem()

GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $aFitem[1][0] To $aFitem[$aFitem[0][0]][0] ;父项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果父项目勾选,其下所有子项目全选。
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $nMsg))
                                For $i = $nMsg To $nMsg + $iSitemNumber
                                        GUICtrlSetState($i, $GUI_CHECKED)
                                Next
                        Else
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $nMsg))
                                For $i = $nMsg To $nMsg + $iSitemNumber
                                        GUICtrlSetState($i, $GUI_UNCHECKED)
                                Next
                        EndIf
                        ContinueCase
                Case $aSitem[1][0] To $aSitem[$aSitem[0][0]][0] ;子项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果子项目勾选,其父项目也跟着勾选。
                                $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
                                GUICtrlSetState($hFitemHandle, $GUI_CHECKED)
                        Else ;父项目下的所有子项目全部取消勾选,父项目也跟着取消勾选。
                                $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $hFitemHandle))
                                For $i = $hFitemHandle To $hFitemHandle + $iSitemNumber
                                        If GUICtrlRead($i) = $GUI_CHECKED Then ExitLoop
                                        If $i = $hFitemHandle + $iSitemNumber Then GUICtrlSetState($hFitemHandle, $GUI_UNCHECKED)
                                Next
                        EndIf
                        AddItem()
                Case $But1
                        $sText = ''
                        For $i = 1 To $aSitem[0][0]
                                If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
                                        $sText &= '被选项目句柄:' & $aSitem[$i][0] & '   ' & '项目文本:' & $aSitem[$i][1] & @CRLF
                                EndIf
                        Next
                        If $sText <> '' Then MsgBox(0, '获取被选项目句柄+项目文本', $sText)
                Case $But2
                        begin()
        EndSwitch
WEnd

Func AddItem()
        $sItemText = ''
        _GUICtrlListView_DeleteAllItems($List1) ;清空List内所有数据
        For $i = 1 To $aSitem[0][0]
                        If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
                                GUICtrlCreateListViewItem(StringFormat("[%02d]", _GUICtrlListView_GetItemCount($List1)+1) & "|" & $aSitem[$i][1], $List1) ;如果项目被勾选则写入List
                                $sItemText &= $aSitem[$i][1] & '|'
                        EndIf
        Next
EndFunc

Func begin()
        $aLines = StringSplit($sItemText, '|', 2)
                GUICtrlSetState ($List1, $GUI_FOCUS)                ;此处要将焦点设置在 $List1 ,否则被选项的背景是灰的,不是蓝色
        For $i = 0 To UBound($aLines) - 1
                        _GUICtrlListView_SetItemText($List1, $i, '[→]')
                        _GUICtrlListView_SetItemSelected($List1, $i)
                        Sleep(800)
                        _GUICtrlListView_SetItemText($List1, $i, '[OK]')
                        _GUICtrlListView_SetItemSelected($List1, $i, False)
        Next
        MsgBox(0, '', '安装完成!')
EndFunc   ;==>begin

评分

参与人数 1金钱 +20 收起 理由
afan + 20

查看全部评分

 楼主| 发表于 2010-12-6 23:02:56 | 显示全部楼层
是想做成这个样子的吧?
水木子 发表于 2010-12-6 20:54


哈,水木子真是太聪明了。看出我想做成那样的。不但想做成那样,还要做成软件安装的那样。配置文件都是数字[0-9]读取方法。而且增加或减少不会出现错误数组之类的。我就是想解决这个问题。弄不明白怎么会出现错误数组的现象。配置文件结构都差不多一样的了。只是驱动包名字同软件名字不同。
发表于 2010-12-6 23:42:21 | 显示全部楼层
25楼的代码已经解决你说的这个问题 了“:配置文件都是数字[0-9]读取方法。而且增加或减少不会出现错误数组之类的。我就是想解决这个问题。弄不明白怎么会出现错误数组的现象。配置文件结构都差不多一样的了。只是驱动包名字同软件名字不同。”

这帖都两页了,什么时候才是头啊?
发表于 2010-12-7 00:10:01 | 显示全部楼层
LZ 太不配合 yhxhappy 的热心了。
发表于 2010-12-7 06:19:03 | 显示全部楼层
代码收下了....
 楼主| 发表于 2010-12-7 08:46:23 | 显示全部楼层
LZ 太不配合 yhxhappy 的热心了。
afan 发表于 2010-12-7 00:10


误会,误会。真的,打从心里佩服yhxhappy为人。他真的很好,我这样的问题三番四次他都想着来帮忙。如果论坛全部都是这样热心的人,像AFAN,水木子等等论坛管理真的很不错。来论坛
学习的人会越来越多的。嗯。从心里很感激 yhxhappy。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-19 13:00 , Processed in 0.080876 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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