找回密码
 加入
搜索
查看: 2022|回复: 5

[网络通信] 如何获取数组中某变量的索引值,例如$But_pid[1][3]的下标1和3[已解决]

[复制链接]
发表于 2019-2-25 12:58:19 | 显示全部楼层 |阅读模式
本帖最后由 xyx115 于 2019-2-26 10:26 编辑

为了快速编写相关的按钮动作,在写GUI时,绘制动态的软件界面按钮,采用了数组的方法,创建5行按钮,每行5个。(实际情况会更多)
当鼠标点击某按钮的时候,可以获取到这个控件的id和按钮的句柄,例如$But_pid[1][3],请问如何获取到这个被触发的$But_pid[1][3](按钮句柄)的下标,即其中的1和3.

如果可以获取到这个1和3,那么我只需要简单的一个方法,即可写出所有按钮对应的自定义函数动作。
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>


__Gui_0_Create_GUICreate()


__Gui_While()



Func __Gui_0_Create_GUICreate()

        Global $List_Size = 5
        Global $BH00[12]
        Global $BH01[12]
        Global $BH02[12]
        Global $BH03[12]
        Global $BH04[12]
        Global $BH05[12]
        Global $Gui_Main = GUICreate('TEST', 800, 480, -1, -1)
        __Gui_1_Create_Label()
        GUISetState(@SW_SHOW)

EndFunc   ;==>__Gui_0_Create_GUICreate

Func __Gui_1_Create_Label()
        ;绘画软件界面的表格
        For $i = 0 To $List_Size;左边大表格框中的行数。服务器个数。
                Switch $i
                        Case 0
                        Case 1
                        Case Else;如果文件夹字符串不为空,则拆分字符串,对每个定义的共享文件夹进行处理
                                For $j = 0 To 5
                                        Switch $j
                                                Case 1
                                                        $BH01[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 120, 80 + $i * 30, 80, 20, $SS_CENTER)
                                                Case 2
                                                        $BH02[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 220, 80 + $i * 30, 80, 20, $SS_CENTER)
                                                Case 3
                                                        $BH03[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 320, 80 + $i * 30, 80, 20, $SS_CENTER)
                                                Case 4
                                                        $BH04[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 420, 80 + $i * 30, 80, 20, $SS_CENTER)
                                                Case 5
                                                        $BH05[$i] = GUICtrlCreateLabel("菜单" & $i & '-' & $j, 520, 80 + $i * 30, 80, 20, $SS_CENTER)
                                        EndSwitch
                                Next
                EndSwitch
        Next

EndFunc   ;==>__Gui_1_Create_Label

Func __Gui_While()
        Local $otherother
        While 1
                $nMsg = GUIGetMsg(0)
                Switch $nMsg
                        Case $GUI_EVENT_CLOSE
                                Exit
                        Case $otherother
                        Case $BH00[0], $BH00[1], $BH00[2], $BH00[3], $BH00[4], $BH00[5], $BH00[6], $BH00[7], $BH00[8], $BH00[9], $BH00[10], $BH00[11]
                                ;需要一个方法,知道$BH00变量的下标。方便后面直接根据函数下标进行操作。
                                ___Gui_Lie_001(GUIGetCursorInfo($Gui_Main))
                        Case $BH01[0], $BH01[1], $BH01[2], $BH01[3], $BH01[4], $BH01[5], $BH01[6], $BH01[7], $BH01[8], $BH01[9], $BH01[10], $BH01[11]
                                ;需要一个方法,知道$BH01变量的下标。方便后面直接根据函数下标进行操作。
                                ___Gui_Lie_002(GUIGetCursorInfo($Gui_Main))
                        Case $BH02[0], $BH02[1], $BH02[2], $BH02[3], $BH02[4], $BH02[5], $BH02[6], $BH02[7], $BH02[8], $BH02[9], $BH02[10], $BH02[11]
                                ;需要一个方法,知道$BH02变量的下标。方便后面直接根据函数下标进行操作。
                                ___Gui_Lie_003(GUIGetCursorInfo($Gui_Main))
                        Case $BH03[0], $BH03[1], $BH03[2], $BH03[3], $BH03[4], $BH03[5], $BH03[6], $BH03[7], $BH03[8], $BH03[9], $BH03[10], $BH03[11]
                                ;需要一个方法,知道$BH03变量的下标。方便后面直接根据函数下标进行操作。
                                ___Gui_Lie_004(GUIGetCursorInfo($Gui_Main))
                        Case $BH04[0], $BH04[1], $BH04[2], $BH04[3], $BH04[4], $BH04[5], $BH04[6], $BH04[7], $BH04[8], $BH04[9], $BH04[10], $BH04[11]
                                ;需要一个方法,知道$BH04变量的下标。方便后面直接根据函数下标进行操作。
                                ___Gui_Lie_005(GUIGetCursorInfo($Gui_Main))
                        Case $BH05[0], $BH05[1], $BH05[2], $BH05[3], $BH05[4], $BH05[5], $BH05[6], $BH05[7], $BH05[8], $BH05[9], $BH05[10], $BH05[11]
                                ;需要一个方法,知道$BH05变量的下标。方便后面直接根据函数下标进行操作。
                                ___Gui_Lie_006(GUIGetCursorInfo($Gui_Main))
                EndSwitch
        WEnd

EndFunc   ;==>__Gui_While


Func ___Gui_Lie_001($s1)


        MsgBox(0, '服务器描述', @CRLF & _
                        @CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])

EndFunc   ;==>___Gui_Lie_001


Func ___Gui_Lie_002($s1)

        MsgBox(0, '服务器描述', @CRLF & _
                        @CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])

EndFunc   ;==>___Gui_Lie_002


Func ___Gui_Lie_003($s1)

        MsgBox(0, '服务器描述', @CRLF & _
                        @CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])

EndFunc   ;==>___Gui_Lie_003


Func ___Gui_Lie_004($s1)

        MsgBox(0, '服务器描述', @CRLF & _
                        @CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])

EndFunc   ;==>___Gui_Lie_004


Func ___Gui_Lie_005($s1)

        MsgBox(0, '服务器描述', @CRLF & _
                        @CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])

EndFunc   ;==>___Gui_Lie_005

Func ___Gui_Lie_006($s1)

        MsgBox(0, '服务器描述', @CRLF & _
                        @CRLF & '鼠标悬停位置的控件 ID:' & $s1[4])

EndFunc   ;==>___Gui_Lie_006
根据2楼和4楼的帖子思路,自制完成以下自定义函数,可获取数组变量的下标。
Func __Get_the_array_var_subscript($Array_Var, $Array_Var_Name)

        ;函数功能:        获取给定的数组变量的下标。
        ;输入参数1:$Array_Var                        要获取下标的数组变量
        ;输入参数2:$Array_Var_Name                要获取下标的数组变量名称
        ;输出结果:        $Array_vari_sub                获取到的数组变量的下标。
        ;                        $Array_vari_sub[0]为该变量的行下标
        ;                        $Array_vari_sub[1]为该变量的列下标
        ;作者:迷路轮回
        ;注意事项:数组中的元素不能存在重复值,否则可能会出错。适合GUI绘制的窗口句柄(不会重复)调用。
        For $i = 0 To UBound($Array_Var_Name, $UBOUND_ROWS) - 1;遍历数组
                For $j = 0 To UBound($Array_Var_Name, $UBOUND_COLUMNS) - 1;遍历数组
                        If $Array_Var = $Array_Var_Name[$i][$j] Then
                                Local $Array_var_sub[2] = [$i, $j]
                                Return $Array_var_sub
                        EndIf
                Next
        Next

EndFunc   ;==>__Get_the_array_var_subscript

调用方法如下:
#include <AutoItConstants.au3>
#include <Array.au3> ; 为 _ArrayDisplay 函数需要.

Global $HD_TabIt1_SerBut[3][8], $Get_Row_Column
$HD_TabIt1_SerBut[2][6] = 8
$sd = __Get_the_array_var_subscript($HD_TabIt1_SerBut[2][6], $HD_TabIt1_SerBut)
MsgBox(0, 0, '数组变量$HD_TabIt1_SerBut[2][6]' & @CRLF & '行下标是:' & $sd[0] & @CRLF & '列下标是:' & $sd[1])
Exit
具体参见UDF帖:获取多维数组的下标
发表于 2019-2-26 01:48:05 | 显示全部楼层
大概这个思路
        For $i = 0 To UBound($But_pid, $UBOUND_ROWS);遍历数组
              If $But_pid[1][3] = $But_pid[$i][3] Then
                        MsgBox($MB_OK, "下标" ,"$i")      
              EndIf
        Next
发表于 2019-2-25 16:21:28 | 显示全部楼层
UBound
 楼主| 发表于 2019-2-25 16:51:18 | 显示全部楼层

感谢,但是我不是获取一个数组的最大值,是想知道一个数组列表中的某个变量,下标是多少。

我现在暂时使用的方法是这样的:
                        Case $HD_TabIt1_SerBut[1][0] To $HD_TabIt1_SerBut[1][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 1)
                        Case $HD_TabIt1_SerBut[2][0] To $HD_TabIt1_SerBut[2][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 2)
                        Case $HD_TabIt1_SerBut[3][0] To $HD_TabIt1_SerBut[3][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 3)
                        Case $HD_TabIt1_SerBut[4][0] To $HD_TabIt1_SerBut[4][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 4)
                        Case $HD_TabIt1_SerBut[5][0] To $HD_TabIt1_SerBut[5][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 5)
                        Case $HD_TabIt1_SerBut[6][0] To $HD_TabIt1_SerBut[6][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 6)
                        Case $HD_TabIt1_SerBut[7][0] To $HD_TabIt1_SerBut[7][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 7)
                        Case $HD_TabIt1_SerBut[8][0] To $HD_TabIt1_SerBut[8][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 8)
                        Case $HD_TabIt1_SerBut[9][0] To $HD_TabIt1_SerBut[9][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 9)
                        Case $HD_TabIt1_SerBut[10][0] To $HD_TabIt1_SerBut[10][27]
                                __HD_TabIt1_Virtual_menu_SerBut($nMsg, 10)
这样就把270个请求浓缩到了10个,然后再分成27个方法去响应不同的功能。($nMsg, 10)这里面的10用手动的方法标识了数组元素的下标。不知道有没有更好的方法。
 楼主| 发表于 2019-2-26 08:53:02 | 显示全部楼层
adlyx1999 发表于 2019-2-26 01:48
大概这个思路
        For $i = 0 To UBound($But_pid, $UBOUND_ROWS);遍历数组
              If $But_pid[1][3 ...

这个思路的确巧妙。感谢。
发表于 2019-3-14 22:19:39 | 显示全部楼层
http://www.autoit3.cn/forum.php? ... amp;fromuid=7638255 这是我的解决方式,用二次arrayserch即可,
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

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

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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