找回密码
 加入
搜索
查看: 2160|回复: 4

[系统综合] (已解决)数组 标识符 引起的 事件问题,新手求指导!

[复制链接]
发表于 2016-8-17 20:35:10 | 显示全部楼层 |阅读模式
本帖最后由 imutraveler 于 2016-8-27 21:41 编辑

因为要从数据库中读取分组列表,需要用循环,所以标识符$GroupItem用的数组,来记录读出来的所有数据!

然后点击每个分组,就把每个分组下的具体项输出到listview中







代码中,case那里,$GroupItem[0]和$GroupItem[1]这样分开写,就没问题,
只要case后面写$GroupItem[$i] 就会报错,应该是提示下标超了。
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $GroupItem[$i]
                        _GUICtrlListView_DeleteAllItems($ListView)
                        Call(ConnectDB)
                        $RS = ObjCreate("ADODB.Recordset")
                        $RS.ActiveConnection = $Conn
                        $RS.Open("Select * From " & $TableServer & " Where Groups='" & _GUICtrlTreeView_GetText($TreeView, $GroupItem[$i]) & "'")

                        While Not $RS.eof And Not $RS.bof
                                If @error = 1 Then ExitLoop
                                GUICtrlCreateListViewItem($RS.Fields(1).value & "|" & $RS.Fields(7).value & "|" & $RS.Fields(2).value & "|" & $RS.Fields(3).value & "|" & $RS.Fields(9).value, $ListView )
                                $RS.movenext
                        WEnd
                        $RS.close
                        $Conn.Close
        EndSwitch
WEnd
应该怎么解决?实际使用中,分组列表会非常多,肯定不可能一条一条写case匹配

这是能正常执行的!
#Region ;**** 由 AccAu3Wrapper_GUI 创建指令 ****
#AccAu3Wrapper_OutFile=Client.exe
#AccAu3Wrapper_UseUpx=Y
#AccAu3Wrapper_UseX64=n
#AccAu3Wrapper_Res_Comment=
#AccAu3Wrapper_Res_Description=
#AccAu3Wrapper_Res_Fileversion=1.0
#AccAu3Wrapper_Res_LegalCopyright=
#AccAu3Wrapper_Res_Language=2052
#AccAu3Wrapper_Res_requestedExecutionLevel=None
#EndRegion ;**** 由 AccAu3Wrapper_GUI 创建指令 ****

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <GuiImageList.au3>
#include <GuiButton.au3>
#include <String.au3>

; 定义变量
Global $DbPath, $DbPass, $TableGroup, $TableServer, $TableUsers, $Conn
Global $GroupItem[20]

$Form1 = GUICreate("控制台", 960, 615)

; 创建 TreeView
$TreeView = GUICtrlCreateTreeView(10, 50, 235, 508, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$Group = GUICtrlCreateTreeViewItem("已分组列表", $TreeView) ;创建TreeView项目
GUICtrlSetColor(-1, 0xff0000)
GUICtrlSetState(-1, BitOR($GUI_EXPAND, $GUI_DEFBUTTON))

; 创建 ListView
$ListView = GUICtrlCreateListView("", 250, 50, 700, 310)
_GUICtrlListView_AddColumn($ListView, "名称", 140) ;创建列
_GUICtrlListView_AddColumn($ListView, "隶属分组", 120) ;创建列
_GUICtrlListView_AddColumn($ListView, "IP", 110) ;创建列
_GUICtrlListView_AddColumn($ListView, "端口", 60) ;创建列
_GUICtrlListView_AddColumn($ListView, "备注", 240) ;创建列
_GUICtrlListView_SetExtendedListViewStyle($ListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES)) ;设置ListView样式

GUISetState(@SW_SHOW)

; 读取 分组列表
Call(ConnectDB)
$RS = ObjCreate("ADODB.Recordset")
$RS.ActiveConnection = $Conn
$RS.Open("Select * From " & $TableGroup & " Order By GroupName")

$i = 0
While Not $RS.eof And Not $RS.bof
        If @error = 1 Then ExitLoop
        $GroupItem[$i] = GUICtrlCreateTreeViewItem($RS.Fields(1).value, $Group)
;~         MsgBox(0, "", _GUICtrlTreeView_GetText($TreeView, $GroupItem[$i]))
        $i += 1
        $RS.movenext
WEnd

$RS.close
$Conn.Close

_GUICtrlTreeView_Expand($TreeView, $Group)
_GUICtrlTreeView_SelectItemByIndex($TreeView, $Group, 0)


While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $GroupItem[0]
                        _GUICtrlListView_DeleteAllItems($ListView)
                        Call(ConnectDB)
                        $RS = ObjCreate("ADODB.Recordset")
                        $RS.ActiveConnection = $Conn
                        $RS.Open("Select * From " & $TableServer & " Where Groups='" & _GUICtrlTreeView_GetText($TreeView, $GroupItem[0]) & "'")

                        While Not $RS.eof And Not $RS.bof
                                If @error = 1 Then ExitLoop
                                GUICtrlCreateListViewItem($RS.Fields(1).value & "|" & $RS.Fields(7).value & "|" & $RS.Fields(2).value & "|" & $RS.Fields(3).value & "|" & $RS.Fields(9).value, $ListView )
                                $RS.movenext
                        WEnd
                        $RS.close
                        $Conn.Close
                Case $GroupItem[1]
                        _GUICtrlListView_DeleteAllItems($ListView)
                        Call(ConnectDB)
                        $RS = ObjCreate("ADODB.Recordset")
                        $RS.ActiveConnection = $Conn
                        $RS.Open("Select * From " & $TableServer & " Where Groups='" & _GUICtrlTreeView_GetText($TreeView, $GroupItem[1]) & "'")

                        While Not $RS.eof And Not $RS.bof
                                If @error = 1 Then ExitLoop
                                GUICtrlCreateListViewItem($RS.Fields(1).value & "|" & $RS.Fields(7).value & "|" & $RS.Fields(2).value & "|" & $RS.Fields(3).value & "|" & $RS.Fields(9).value, $ListView )
                                $RS.movenext
                        WEnd

                        $RS.close
                        $Conn.Close
        EndSwitch
WEnd

;=============== 函数 - 定义 ===============
Func ConnectDB()   ;连接数据库
        $DbPath = @ScriptDir & "" & "Data.mdb"
        $DbPass = "123"
        $TableGroup = "TB_Group"
        $TableServer = "TB_Server"
        $TableUsers = "TB_Users"
        $Conn = ObjCreate("ADODB.Connection")
        $Conn.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $DbPath & "; Jet OLEDB:Database Password=" & $DbPass)
EndFunc   ;==>ConnectDB

本帖子中包含更多资源

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

×
发表于 2016-8-17 21:38:38 | 显示全部楼层
回复 1# imutraveler
改进的关键地方已添加注释, 注意看吧.
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#PRE_UseX64=n
#PRE_Res_requestedExecutionLevel=None
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#Region ;**** 由 AccAu3Wrapper_GUI 创建指令 ****
#AccAu3Wrapper_OutFile=Client.exe
#AccAu3Wrapper_UseUpx=Y
#AccAu3Wrapper_UseX64=n
#AccAu3Wrapper_Res_Comment=
#AccAu3Wrapper_Res_Description=
#AccAu3Wrapper_Res_Fileversion=1.0
#AccAu3Wrapper_Res_LegalCopyright=
#AccAu3Wrapper_Res_Language=2052
#AccAu3Wrapper_Res_requestedExecutionLevel=None
#EndRegion ;**** 由 AccAu3Wrapper_GUI 创建指令 ****
#include <array.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <GuiTreeView.au3>
#include <TreeViewConstants.au3>
#include <GuiImageList.au3>
#include <GuiButton.au3>
#include <String.au3>
;~ #include <Constants.au3>;响应托盘事件 UDF

; 定义变量
Global $DbPath, $DbPass, $TableGroup, $TableServer, $TableUsers, $Conn
Global $TrItem[1], $iS = 0 ; itemsquence 分组序数 

$Form1 = GUICreate("控制台", 960, 615)

; 创建 TreeView
$TreeView = GUICtrlCreateTreeView(10, 50, 235, 508, BitOR($TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS), $WS_EX_CLIENTEDGE)
$Group = GUICtrlCreateTreeViewItem("已分组服务器列表", $TreeView) ;创建TreeView项目
GUICtrlSetColor(-1, 0xff0000)
GUICtrlSetState(-1, BitOR($GUI_EXPAND, $GUI_DEFBUTTON))
; 读取 分组列表
ConnectDB()
$RS = ObjCreate("ADODB.Recordset")
$RS.ActiveConnection = $Conn
$RS.Open("Select * From " & $TableGroup & " Order By GroupName")

While Not $RS.eof And Not $RS.bof
        If @error Then ExitLoop
        ReDim $TrItem[$iS+1] ; 数组大小 +1
        $TrItem[$iS] = GUICtrlCreateTreeViewItem($RS.Fields(1).value, $Group)
;~         MsgBox(0, "", _GUICtrlTreeView_GetText($TreeView, $TrItem[$iS]))
        $iS += 1        
        $RS.movenext
WEnd

$RS.close
$Conn.Close

_GUICtrlTreeView_Expand($TreeView, $Group)
_GUICtrlTreeView_SelectItemByIndex($TreeView, $Group, 0)
; 创建 ListView
$ListView = GUICtrlCreateListView("", 250, 50, 700, 310)
_GUICtrlListView_AddColumn($ListView, "名称", 140) ;创建列
_GUICtrlListView_AddColumn($ListView, "隶属分组", 120) ;创建列
_GUICtrlListView_AddColumn($ListView, "IP", 110) ;创建列
_GUICtrlListView_AddColumn($ListView, "端口", 60) ;创建列
_GUICtrlListView_AddColumn($ListView, "备注", 240) ;创建列
_GUICtrlListView_SetExtendedListViewStyle($ListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES)) ;设置ListView样式

GUISetState(@SW_SHOW)


#cs
; $TrItem[$nMsg - 5] 为什么要减 5 ?
; 每个GUI创建的第一个控件ID都是 3 
, 这个GUI里就是 $TreeView = GUICtrlCreateTreeView ,也就是说 $TreeView = 3
; 下一控件就是 4 , $Group = GUICtrlCreateTreeViewItem   $Group = 4
; 接着的控件ID 5 .... 就是 $TrItem[$iS] = GUICtrlCreateTreeViewItem($RS.Fields(1).value, $Group) 这些
; 示例一共是10个, 也就是 5 to 14 ; $TrItem[0] = 5 , $TrItem[9] = 14
; 响应 $TrItem[0]的点击时, $nMsg = 5, 为了保证下句操作的正确性,(也就是取出数组对应值),所以必须要 $nMsg - 5
$RS.Open("Select * From " & $TableServer & " Where Groups='" & _GUICtrlTreeView_GetText($TreeView, $TrItem[$nMsg - 5]) & "'") ;
#ce
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $TrItem[0] To $TrItem[UBound($TrItem) - 1] ; 点击任意 treeviewitem 时 ,进行以下操作
                        _GUICtrlListView_DeleteAllItems($ListView)
                        ConnectDB()
                        $RS = ObjCreate("ADODB.Recordset")
                        $RS.ActiveConnection = $Conn
                        $RS.Open("Select * From " & $TableServer & " Where Groups='" & _GUICtrlTreeView_GetText($TreeView, $TrItem[$nMsg - 5]) & "'") ;
                        While Not $RS.eof And Not $RS.bof
                                If @error = 1 Then ExitLoop
                                GUICtrlCreateListViewItem($RS.Fields(1).value & "|" & $RS.Fields(7).value & "|" & $RS.Fields(2).value & "|" & $RS.Fields(3).value & "|" & $RS.Fields(9).value, $ListView )
                                $RS.movenext
                        WEnd
                        $RS.close
                        $Conn.Close

        EndSwitch
WEnd

;=============== 函数 - 定义 ===============
Func ConnectDB()   ;连接数据库
        $DbPath = @ScriptDir & "" & "Data.mdb"
        ;~ $mdbpass = "traveler@)!^"
        $DbPass = "123"
        $TableGroup = "TB_Group"
        $TableServer = "TB_Server"
        $TableUsers = "TB_Users"
        $Conn = ObjCreate("ADODB.Connection")
        $Conn.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $DbPath & "; Jet OLEDB:Database Password=" & $DbPass)
EndFunc   ;==>ConnectDB

评分

参与人数 2金钱 +20 收起 理由
chamlien + 10 代码很长,很有耐心
nmgwddj + 10

查看全部评分

 楼主| 发表于 2016-8-17 23:00:40 | 显示全部楼层
本帖最后由 imutraveler 于 2016-8-17 23:45 编辑

回复 2# Alam

谢谢兄弟,懂了,

意思就是在这个GUI内,根据第一个TreeViewItem前面控件的数量,相应的调整$nMsg该减去的数!

但是需要手动计算前面有多少个控件,并且在后续修改或添加控件,都需要重新计算这个数

研究了半天,发现只要把$nMsg - 5  修改为$nMsg - $TrItem[0],感觉就完美了
发表于 2016-8-19 17:46:52 | 显示全部楼层
回复 3# imutraveler

顶呱呱~!青出蓝胜于蓝啊!

论坛规矩:
       问题解决了,就编辑帖子标题,加上"(已解决)"的字样吧!
 楼主| 发表于 2016-8-27 21:42:50 | 显示全部楼层
回复 4# Alam


    兄弟,又遇到了点难题,不知道能否加你QQ,向你请教一下,能方便一些!
如果可以的话,留个QQ吧,,
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-25 21:01 , Processed in 0.077019 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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