已解决:一个关于数组下标的问题
本帖最后由 levinfish 于 2014-3-4 23:40 编辑编写了一个简单的代码,并且把三个有问题的地方都标出来了。其中第二个已经被afan大神解决。
拜托各位大神。#include <EditConstants.au3>
#Include <GuiStatusBar.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstantsEx.au3>
#include <file.au3>
#include <array.au3>
#include <WindowsConstants.au3>
#include <GuiTab.au3>
#include <date.au3>
#include <ButtonConstants.au3>
#include <GuiButton.au3>
#include <Misc.au3>
Mygui()
Func Mygui()
;====================================================================================================================
;================================================定义变量==========================================================
;====================================================================================================================
Dim $i,$text,$n,$m
Dim $button
Global $a1button,$a2button,$a3button,$a4button,$a5button,$a6button,$a7button,$a8button,$a9button
Global $buttonarray=
;====================================================================================================================
;================================================生成界面==========================================================
;====================================================================================================================
$guiparent=GUICreate("测试", 1200, 600)
For $i=1 To 5
$button[$i]=GUICtrlCreateButton('读取第'&$i&'行',50,50+($i-1)*60,150,35)
Next
;生成按钮组
For $i=1 To 5
Mycreatebutton($buttonarray[$i],220,50+($i-1)*60) ;问题1,该处的循环,无法将按钮的id赋值给 从$a1button 到$a5button这五个数组
Next
;测试行
$text=GUICtrlRead($a1button);如果上一句赋值成功,则$text不等于空,应该等于3
MsgBox(0,'测试','如果赋值成功,应该是3,但现在是空,即:'&$text)
GUISetState()
;====================================================================================================================
;================================================执行部分==========================================================
;====================================================================================================================
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $button To $button
;问题2所在地方。例如按下了$button,如果能够的到4(也就是 $button[$i]中的$i), 即则很容易知道要删除的是$a4button. 但现在通过$msg 无法得到这个而信息
;此处问题已经解决。http://www.autoitx.com/thread-43724-1-1.html
Mydeletearray($msg)
EndSwitch
WEnd
EndFunc
;====================================================================================================================
;================================================自定义函数==========================================================
;====================================================================================================================
;==============生成按钮===========================
Func Mycreatebutton(ByRef $Bt,$x,$y)
For $i=1 To 5
$Bt[$i]=GUICtrlCreateButton($i,$x+($i-1)*180,$y,150,30)
Next
EndFunc
;==============读取按钮===========================
Func Mydeletearray(ByRef $m)
;通过变换得到$button[$i]中的$i
$text=GUICtrlRead($m) ;因为按钮标签的格式是‘删除第$i行’,第四个字符即是button[$i]中的$i
$n=StringMid($text,4,1)
;问题3所在, 仍然以$button为例,即是知道了要删除的是$a4button,如何根据4 合成$a4button,使用$a='a'&$i&'button'$id=Eval($a),好像行不通。
For $i=1 To 5
;~ GUICtrlDelete($a'$n'button[$i]);此行程序有误,无法有效的合成'a'&$i&'button
Next
EndFunc 看 eval 函数,就是想干你需要的活的 之前描述之前描述有问题,已改过,eval函数行不通 建议不要这样使用 Eval 函数,就算能用,将来如要迷惑之类的就完全无用了。
为何有简单明了的方式不用呢…
Dim $a1button, $a2button, $a3button, $a4button
;想实现通过一个循环将这四个数组作为参数传递进自定义函数,进行特定操作,四个数组名字只有数字不同,切数字从1递增到4.,
Dim $aBtAll = , $a2button, $a3button, $a4button]
For $i = 1 To $aBtAll
myfunc($aBtAll[$i], 参数2,参数3,...)
Next
Func myfunc(ByRef $button, 参数2,参数3,...)
;...
EndFunc 建立不定数组,然后redim 建议楼主试试二维数组, 不就一下搞定了么. 建议不要这样使用 Eval 函数,就算能用,将来如要迷惑之类的就完全无用了。
为何有简单明了的方式不用呢… ...
afan 发表于 2014-3-4 09:44 http://www.autoitx.com/images/common/back.gif
afan
{:face (310):} afan
gapkiller 发表于 2014-3-4 17:04 http://www.autoitx.com/images/common/back.gif
换个爷们的头像吧,这样容易让人错觉… 用二位数组能够实现,因为我的函数里面有一维的也有二维的,我自定义一个一维的函数,通用性比较强,二维只需要添加一个for循环就行。
我试了一下afan的方法,貌似也行不通,仍然传递不过去。
貌似Dim $aBtAll = , $a2button, $a3button, $a4button]这个定义里回报告,维数出错。将定义修改为,Dim $aBtAll = ,程序不报错,但是仍无法传递。读取$a1button里面的值,全是0.
redim的方法在测试,但不知道该怎么应用。 本帖最后由 levinfish 于 2014-3-4 19:14 编辑
另外,还有一个问题:我定义了5个按钮,$button_x。我在定义里面给出特定的信息a,可以方便我后续的操作,例如x可以代表地址的编号,只要知道这个编号,我就能直接知道地址。此外,button_X这个数组的编号,也就是,,,,也蕴含了一定量的信息,可以方便后续的判断。
如果我点击某个按钮,通过guigetmsg,我可以知道这个按钮的ID,但是ID一般使用数字表示。如何获得这个按钮的的定义名字,例如,我点击$button_X对应的按钮,我如何的到‘button_X'这几个字符。
我现在通过$msg要通过比较复杂的变换,才能得到button_X这几个字符信息,有没有一种简单的方法得到这些信息,有劳各位大神了。 本帖最后由 afan 于 2014-3-4 20:02 编辑
用二位数组能够实现,因为我的函数里面有一维的也有二维的,我自定义一个一维的函数,通用性比较强,二维只 ...
levinfish 发表于 2014-3-4 18:55 http://www.autoitx.com/images/common/back.gif
你的是伪代码,我也只能给你伪代码。至于你为何用不了,仍因无代码不得而知。Dim $a1button = ['a1', 11, 12, 13, 14]
Dim $a2button = ['a2', 21, 22, 23, 24]
Dim $a3button = ['a3', 31, 32, 33, 34]
Dim $a4button = ['a4', 41, 42, 43, 44]
Dim $a5button = ['a5', 51, 52, 53, 54]
Dim $aBtAll =
For $i = 1 To $aBtAll
myfunc($aBtAll[$i])
Next
Func myfunc(ByRef $button)
MsgBox(0, $button, $button & ", " & $button & ", " & $button & ", " & $button)
EndFunc 本帖最后由 levinfish 于 2014-3-4 21:56 编辑
回复 11# afan
我把三个有问题的地方都标出来了,都快被这三个问题折磨疯了,这几天都是晚上一两点睡觉。(已经被afan师父解决一个。)#include <EditConstants.au3>
#Include <GuiStatusBar.au3>
#include <GUIConstantsEx.au3>
#include <GUIConstantsEx.au3>
#include <file.au3>
#include <array.au3>
#include <WindowsConstants.au3>
#include <GuiTab.au3>
#include <date.au3>
#include <ButtonConstants.au3>
#include <GuiButton.au3>
#include <Misc.au3>
Mygui()
Func Mygui()
;====================================================================================================================
;================================================定义变量==========================================================
;====================================================================================================================
Dim $i,$text,$n,$m
Dim $button
Global $a1button,$a2button,$a3button,$a4button,$a5button,$a6button,$a7button,$a8button,$a9button
Global $buttonarray=
;====================================================================================================================
;================================================生成界面==========================================================
;====================================================================================================================
$guiparent=GUICreate("测试", 1200, 600)
For $i=1 To 5
$button[$i]=GUICtrlCreateButton('读取第'&$i&'行',50,50+($i-1)*60,150,35)
Next
;生成按钮组
For $i=1 To 5
Mycreatebutton($buttonarray[$i],220,50+($i-1)*60) ;问题1,该处的循环,无法将按钮的id赋值给 从$a1button 到$a5button这五个数组
Next
;测试行
$text=GUICtrlRead($a1button);如果上一句赋值成功,则$text不等于空,应该等于3
MsgBox(0,'测试','如果赋值成功,应该是3,但现在是空,即:'&$text)
GUISetState()
;====================================================================================================================
;================================================执行部分==========================================================
;====================================================================================================================
While 1
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
Exit
Case $button To $button
;问题2所在地方。例如按下了$button,如果能够的到4(也就是 $button[$i]中的$i), 即则很容易知道要删除的是$a4button. 但现在通过$msg 无法得到这个而信息
;此处问题已经解决。http://www.autoitx.com/thread-43724-1-1.html
Mydeletearray($msg)
EndSwitch
WEnd
EndFunc
;====================================================================================================================
;================================================自定义函数==========================================================
;====================================================================================================================
;==============生成按钮===========================
Func Mycreatebutton(ByRef $Bt,$x,$y)
For $i=1 To 5
$Bt[$i]=GUICtrlCreateButton($i,$x+($i-1)*180,$y,150,30)
Next
EndFunc
;==============读取按钮===========================
Func Mydeletearray(ByRef $m)
;通过变换得到$button[$i]中的$i
$text=GUICtrlRead($m) ;因为按钮标签的格式是‘删除第$i行’,第四个字符即是button[$i]中的$i
$n=StringMid($text,4,1)
;问题3所在, 仍然以$button为例,即是知道了要删除的是$a4button,如何根据4 合成$a4button,使用$a='a'&$i&'button'$id=Eval($a),好像行不通。
For $i=1 To 5
;~ GUICtrlDelete($a1button[$i])
Next
EndFunc 不要乱用 ByRefDim $i, $msg
Dim $button, $buttonarray
$guiparent = GUICreate("测试", 1200, 600)
For $i = 1 To 5
$button[$i] = GUICtrlCreateButton('删除第' & $i & '行', 50, 50 + ($i - 1) * 60, 150, 35)
Next
For $i = 1 To 5
$buttonarray[$i] = Mycreatebutton(220, 50 + ($i - 1) * 60)
Next
GUISetState()
While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
Case $button To $button
Mydeletearray($msg - 2)
EndSwitch
WEnd
Func Mycreatebutton($x, $y)
Local $Bttmp
For $i = 1 To 5
$Bttmp[$i] = GUICtrlCreateButton($i, $x + ($i - 1) * 180, $y, 150, 30)
Next
Return $Bttmp
EndFunc ;==>Mycreatebutton
Func Mydeletearray($m)
Local $abt = $buttonarray[$m]
For $i = 1 To 5
GUICtrlDelete($abt[$i])
Next
EndFunc ;==>Mydeletearray
都是懒惹的祸,不想传递函数,想着用global简单一点,记得当年学习C语言的时候,老师也讲过,要慎用global变量,以后还是老老实实用return
afan大神里面$msg的使用方法以及$abt = $buttonarray[$m]确实很好,以前都没有想过这么赋值也是可以的。
非常感谢afan,netegg,gapkiller,今晚终于可以早点睡觉了。
页:
[1]