xyx115 发表于 2019-2-25 12:58:19

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

本帖最后由 xyx115 于 2019-2-26 10:26 编辑

为了快速编写相关的按钮动作,在写GUI时,绘制动态的软件界面按钮,采用了数组的方法,创建5行按钮,每行5个。(实际情况会更多)
当鼠标点击某按钮的时候,可以获取到这个控件的id和按钮的句柄,例如$But_pid,请问如何获取到这个被触发的$But_pid(按钮句柄)的下标,即其中的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
      Global $BH01
      Global $BH02
      Global $BH03
      Global $BH04
      Global $BH05
      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, $BH00, $BH00, $BH00, $BH00, $BH00, $BH00, $BH00, $BH00, $BH00, $BH00, $BH00
                              ;需要一个方法,知道$BH00变量的下标。方便后面直接根据函数下标进行操作。
                              ___Gui_Lie_001(GUIGetCursorInfo($Gui_Main))
                        Case $BH01, $BH01, $BH01, $BH01, $BH01, $BH01, $BH01, $BH01, $BH01, $BH01, $BH01, $BH01
                              ;需要一个方法,知道$BH01变量的下标。方便后面直接根据函数下标进行操作。
                              ___Gui_Lie_002(GUIGetCursorInfo($Gui_Main))
                        Case $BH02, $BH02, $BH02, $BH02, $BH02, $BH02, $BH02, $BH02, $BH02, $BH02, $BH02, $BH02
                              ;需要一个方法,知道$BH02变量的下标。方便后面直接根据函数下标进行操作。
                              ___Gui_Lie_003(GUIGetCursorInfo($Gui_Main))
                        Case $BH03, $BH03, $BH03, $BH03, $BH03, $BH03, $BH03, $BH03, $BH03, $BH03, $BH03, $BH03
                              ;需要一个方法,知道$BH03变量的下标。方便后面直接根据函数下标进行操作。
                              ___Gui_Lie_004(GUIGetCursorInfo($Gui_Main))
                        Case $BH04, $BH04, $BH04, $BH04, $BH04, $BH04, $BH04, $BH04, $BH04, $BH04, $BH04, $BH04
                              ;需要一个方法,知道$BH04变量的下标。方便后面直接根据函数下标进行操作。
                              ___Gui_Lie_005(GUIGetCursorInfo($Gui_Main))
                        Case $BH05, $BH05, $BH05, $BH05, $BH05, $BH05, $BH05, $BH05, $BH05, $BH05, $BH05, $BH05
                              ;需要一个方法,知道$BH05变量的下标。方便后面直接根据函数下标进行操作。
                              ___Gui_Lie_006(GUIGetCursorInfo($Gui_Main))
                EndSwitch
      WEnd

EndFunc   ;==>__Gui_While


Func ___Gui_Lie_001($s1)


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

EndFunc   ;==>___Gui_Lie_001


Func ___Gui_Lie_002($s1)

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

EndFunc   ;==>___Gui_Lie_002


Func ___Gui_Lie_003($s1)

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

EndFunc   ;==>___Gui_Lie_003


Func ___Gui_Lie_004($s1)

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

EndFunc   ;==>___Gui_Lie_004


Func ___Gui_Lie_005($s1)

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

EndFunc   ;==>___Gui_Lie_005

Func ___Gui_Lie_006($s1)

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

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为该变量的行下标
        ;                        $Array_vari_sub为该变量的列下标
        ;作者:迷路轮回
        ;注意事项:数组中的元素不能存在重复值,否则可能会出错。适合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 = [$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, $Get_Row_Column
$HD_TabIt1_SerBut = 8
$sd = __Get_the_array_var_subscript($HD_TabIt1_SerBut, $HD_TabIt1_SerBut)
MsgBox(0, 0, '数组变量$HD_TabIt1_SerBut' & @CRLF & '行下标是:' & $sd & @CRLF & '列下标是:' & $sd)
Exit

具体参见UDF帖:获取多维数组的下标

adlyx1999 发表于 2019-2-26 01:48:05

大概这个思路
        For $i = 0 To UBound($But_pid, $UBOUND_ROWS);遍历数组
            If $But_pid = $But_pid[$i] Then
                        MsgBox($MB_OK, "下标" ,"$i")      
            EndIf
      Next

gzh888666 发表于 2019-2-25 16:21:28

UBound

xyx115 发表于 2019-2-25 16:51:18

gzh888666 发表于 2019-2-25 16:21


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

我现在暂时使用的方法是这样的:


                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 1)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 2)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 3)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 4)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 5)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 6)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 7)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 8)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 9)
                        Case $HD_TabIt1_SerBut To $HD_TabIt1_SerBut
                              __HD_TabIt1_Virtual_menu_SerBut($nMsg, 10)

这样就把270个请求浓缩到了10个,然后再分成27个方法去响应不同的功能。($nMsg, 10)这里面的10用手动的方法标识了数组元素的下标。不知道有没有更好的方法。

xyx115 发表于 2019-2-26 08:53:02

adlyx1999 发表于 2019-2-26 01:48
大概这个思路
        For $i = 0 To UBound($But_pid, $UBOUND_ROWS);遍历数组
            If $But_pid

这个思路的确巧妙。感谢。

tubaba 发表于 2019-3-14 22:19:39

http://www.autoit3.cn/forum.php?mod=viewthread&tid=55890&fromuid=7638255 这是我的解决方式,用二次arrayserch即可,
页: [1]
查看完整版本: 如何获取数组中某变量的索引值,例如$But_pid[1][3]的下标1和3[已解决]