mo_shaojie 发表于 2010-12-6 10:39:23

我这个附件配置都是数字的,怎么会出现不一样的,这个打开会提示数组错误或超出界限的?不明白.望指点一下.

yhxhappy 发表于 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, $aSitem
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
                If StringIsDigit($var[$i]) Then
                        $f += 1
                        $sFtext = IniRead($Path, $var[$i], 'Name', '')
                        $aFitem[$f] = GUICtrlCreateTreeViewItem($sFtext, $TreeView1)
                        ;GUICtrlSetState(-1, $GUI_CHECKED)
                        $aFitem[$f] = $sFtext
                Else
                        $s += 1
                        $sStext = IniRead($Path, $var[$i], 'Name', '')
                        $aSitem[$s] = GUICtrlCreateTreeViewItem($sStext, $aFitem[$f])
                        ;GUICtrlSetState(-1, $GUI_CHECKED)
                        $aSitem[$s] = $sStext
                EndIf
        Next
EndIf
$aSitem = UBound($aSitem) - 1
AddItem()

GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $aFitem To $aFitem ;父项目
                        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 To $aSitem[$aSitem] ;子项目
                        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
                                If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i]) Then
                                        $sText &= '被选项目句柄:' & $aSitem[$i] & '   ' & '项目文本:' & $aSitem[$i] & @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
                        If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i]) Then
                                GUICtrlCreateListViewItem(StringFormat("[%02d]", _GUICtrlListView_GetItemCount($List1)+1) & "|" & $aSitem[$i], $List1) ;如果项目被勾选则写入List
                                $sItemText &= $aSitem[$i] & '|'
                        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, '')
                        _GUICtrlListView_SetItemSelected($List1, $i, False)
      Next
      MsgBox(0, '', '安装完成!')
EndFunc   ;==>begin

mo_shaojie 发表于 2010-12-6 14:24:52

#include
#include
#include
#include
#include

$Path = @ScriptDir & '\Driver.ini'
$aRegFi ...
yhxhappy 发表于 2010-12-6 13:42 http://www.autoitx.com/images/common/back.gif

你发的这个代码用我那个附件配置文件也是错误的啊.

yhxhappy 发表于 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, $aSitem
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
                If StringIsDigit($var[$i]) Then
                        $f += 1
                        $sFtext = IniRead($Path, $var[$i], 'Name', '')
                        $aFitem[$f] = GUICtrlCreateTreeViewItem($sFtext, $TreeView1)
                        GUICtrlSetState(-1, $GUI_CHECKED)
                        $aFitem[$f] = $sFtext
                Else
                        $s += 1
                        $sStext = IniRead($Path, $var[$i], 'Name', '')
                        $aSitem[$s] = GUICtrlCreateTreeViewItem($sStext, $aFitem[$f])
                        GUICtrlSetState(-1, $GUI_CHECKED)
                        $aSitem[$s] = $sStext
                EndIf
        Next
EndIf
$aSitem = UBound($aSitem) - 1
AddItem()

GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $aFitem To $aFitem ;父项目
                        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 To $aSitem[$aSitem] ;子项目
                        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
                                If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i]) Then
                                        $sText &= '被选项目句柄:' & $aSitem[$i] & '   ' & '项目文本:' & $aSitem[$i] & @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
                        If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i]) Then
                                GUICtrlCreateListViewItem(StringFormat("[%02d]", _GUICtrlListView_GetItemCount($List1)+1) & "|" & $aSitem[$i], $List1) ;如果项目被勾选则写入List
                                $sItemText &= $aSitem[$i] & '|'
                        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, '')
                        _GUICtrlListView_SetItemSelected($List1, $i, False)
      Next
      MsgBox(0, '', '安装完成!')
EndFunc   ;==>begin

水木子 发表于 2010-12-6 17:34:42

究竟是个啥问题嘛?我看了几遍也没明白,问题解决了吗?

mo_shaojie 发表于 2010-12-6 19:31:59

究竟是个啥问题嘛?我看了几遍也没明白,问题解决了吗?
水木子 发表于 2010-12-6 17:34 http://www.autoitx.com/images/common/back.gif
没有啊.问题就是用16楼的配置文件会出现错误.不知是怎么回事啊.弄不明白.
都是一样的数字配置文件的.怎么这个却会出现错误的?

afan 发表于 2010-12-6 19:38:49

16楼的配置文件 在19楼的脚本中正常运行

mo_shaojie 发表于 2010-12-6 19:51:04

本帖最后由 mo_shaojie 于 2010-12-6 19:54 编辑

16楼的配置文件 在19楼的脚本中正常运行
afan 发表于 2010-12-6 19:38 http://www.autoitx.com/images/common/back.gif

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

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

水木子 发表于 2010-12-6 20:54:07

是想做成这个样子的吧?
http://www.autoitx.com/forum.php?mod=viewthread&tid=19553&highlight=%C7%FD%B6%AF

yhxhappy 发表于 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, $aSitem
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
                If StringIsDigit($var[$i]) Then
                                                $sFtext = IniRead($Path, $var[$i], 'Name', '')                                               
                                                ReDim $aFitem
                        $aFitem = GUICtrlCreateTreeViewItem($sFtext, $TreeView1)
                        GUICtrlSetState(-1, $GUI_CHECKED)
                        $aFitem = $sFtext
                                                $aFitem = UBound($aFitem) - 1
                Else
                        $sStext = IniRead($Path, $var[$i], 'Name', '')
                                               
                                                ReDim $aSitem
                        $aSitem = GUICtrlCreateTreeViewItem($sStext, $aFitem[$aFitem])
                        GUICtrlSetState(-1, $GUI_CHECKED)
                        $aSitem = $sStext
                                                $aSitem = UBound($aSitem) - 1
                                        EndIf
      Next
EndIf


AddItem()

GUISetState()

While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
                Case - 3
                        Exit
                Case $aFitem To $aFitem[$aFitem] ;父项目
                        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 To $aSitem[$aSitem] ;子项目
                        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
                              If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i]) Then
                                        $sText &= '被选项目句柄:' & $aSitem[$i] & '   ' & '项目文本:' & $aSitem[$i] & @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
                        If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i]) Then
                              GUICtrlCreateListViewItem(StringFormat("[%02d]", _GUICtrlListView_GetItemCount($List1)+1) & "|" & $aSitem[$i], $List1) ;如果项目被勾选则写入List
                              $sItemText &= $aSitem[$i] & '|'
                        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, '')
                        _GUICtrlListView_SetItemSelected($List1, $i, False)
      Next
      MsgBox(0, '', '安装完成!')
EndFunc   ;==>begin

mo_shaojie 发表于 2010-12-6 23:02:56

是想做成这个样子的吧?
水木子 发表于 2010-12-6 20:54 http://www.autoitx.com/images/common/back.gif

哈,水木子真是太聪明了。看出我想做成那样的。不但想做成那样,还要做成软件安装的那样。配置文件都是数字读取方法。而且增加或减少不会出现错误数组之类的。我就是想解决这个问题。弄不明白怎么会出现错误数组的现象。配置文件结构都差不多一样的了。只是驱动包名字同软件名字不同。

yhxhappy 发表于 2010-12-6 23:42:21

25楼的代码已经解决你说的这个问题 了“:配置文件都是数字读取方法。而且增加或减少不会出现错误数组之类的。我就是想解决这个问题。弄不明白怎么会出现错误数组的现象。配置文件结构都差不多一样的了。只是驱动包名字同软件名字不同。”

这帖都两页了,什么时候才是头啊?

afan 发表于 2010-12-7 00:10:01

LZ 太不配合 yhxhappy 的热心了。

lxz 发表于 2010-12-7 06:19:03

代码收下了....

mo_shaojie 发表于 2010-12-7 08:46:23

LZ 太不配合 yhxhappy 的热心了。
afan 发表于 2010-12-7 00:10 http://www.autoitx.com/images/common/back.gif

误会,误会。真的,打从心里佩服yhxhappy为人。他真的很好,我这样的问题三番四次他都想着来帮忙。如果论坛全部都是这样热心的人,像AFAN,水木子等等论坛管理真的很不错。来论坛
学习的人会越来越多的。嗯。从心里很感激 yhxhappy。
页: 1 [2] 3
查看完整版本: 关于水木子GUICtrlCreateList排序功能