如何获取数组中某变量的索引值,例如$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帖:获取多维数组的下标 大概这个思路
For $i = 0 To UBound($But_pid, $UBOUND_ROWS);遍历数组
If $But_pid = $But_pid[$i] Then
MsgBox($MB_OK, "下标" ,"$i")
EndIf
Next UBound 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用手动的方法标识了数组元素的下标。不知道有没有更好的方法。 adlyx1999 发表于 2019-2-26 01:48
大概这个思路
For $i = 0 To UBound($But_pid, $UBOUND_ROWS);遍历数组
If $But_pid
这个思路的确巧妙。感谢。 http://www.autoit3.cn/forum.php?mod=viewthread&tid=55890&fromuid=7638255 这是我的解决方式,用二次arrayserch即可,
页:
[1]