找回密码
 加入
搜索
查看: 6909|回复: 13

[系统综合] 已解决:一个关于数组下标的问题

  [复制链接]
发表于 2014-3-4 02:09:36 | 显示全部楼层 |阅读模式
本帖最后由 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[6]


Global   $a1button[25],$a2button[25],$a3button[25],$a4button[25],$a5button[25],$a6button[25],$a7button[25],$a8button[25],$a9button[25]

Global   $buttonarray[10]=[9,$a1button,$a2button,$a3button,$a4button,$a5button,$a6button,$a7button,$a8button,$a9button]


;====================================================================================================================
;================================================生成界面==========================================================
;====================================================================================================================

$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[3]);如果上一句赋值成功,则$text不等于空,应该等于3
MsgBox(0,'测试','如果赋值成功,应该是3,但现在是空,即:'&$text)

GUISetState()
 
;====================================================================================================================
;================================================执行部分==========================================================
;====================================================================================================================
 
        While 1
             $msg = GUIGetMsg()
                
                                Switch $msg
                                        
                                Case $GUI_EVENT_CLOSE
                                        Exit
                                Case $button[1] To $button[5]
                                        ;问题2所在地方。例如按下了$button[4],如果能够的到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[4]为例,即是知道了要删除的是$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
发表于 2014-3-4 07:09:42 | 显示全部楼层
看 eval 函数,就是想干你需要的活的
 楼主| 发表于 2014-3-4 07:50:43 | 显示全部楼层
之前描述之前描述有问题,已改过,eval函数行不通
发表于 2014-3-4 09:44:53 | 显示全部楼层
建议不要这样使用 Eval 函数,就算能用,将来如要迷惑之类的就完全无用了。
为何有简单明了的方式不用呢…
Dim $a1button[5], $a2button[5], $a3button[5], $a4button[5]
;想实现通过一个循环将这四个数组作为参数传递进自定义函数,进行特定操作,四个数组名字只有数字不同,切数字从1递增到4.,
Dim $aBtAll[5] = [4, $a1button[5], $a2button[5], $a3button[5], $a4button[5]]
For $i = 1 To $aBtAll[0]
        myfunc($aBtAll[$i], 参数2,参数3,...)
Next
Func myfunc(ByRef $button, 参数2,参数3,...)
        ;...
EndFunc
发表于 2014-3-4 11:19:13 | 显示全部楼层
建立不定数组,然后redim
发表于 2014-3-4 17:03:18 | 显示全部楼层
建议楼主试试二维数组, 不就一下搞定了么.
发表于 2014-3-4 17:04:21 | 显示全部楼层
建议不要这样使用 Eval 函数,就算能用,将来如要迷惑之类的就完全无用了。
为何有简单明了的方式不用呢… ...
afan 发表于 2014-3-4 09:44



    afan
发表于 2014-3-4 17:49:40 | 显示全部楼层
afan
gapkiller 发表于 2014-3-4 17:04



    换个爷们的头像吧,这样容易让人错觉…
 楼主| 发表于 2014-3-4 18:55:47 | 显示全部楼层
用二位数组能够实现,因为我的函数里面有一维的也有二维的,我自定义一个一维的函数,通用性比较强,二维只需要添加一个for循环就行。
我试了一下afan的方法,貌似也行不通,仍然传递不过去。
貌似Dim $aBtAll[5] = [4, $a1button[5], $a2button[5], $a3button[5], $a4button[5]]这个定义里回报告,维数出错。将定义修改为,Dim $aBtAll[5] = [4, $a1button, $a2button, $a3button, $a4button],程序不报错,但是仍无法传递。读取$a1button里面的值,全是0.  
redim的方法在测试,但不知道该怎么应用。
 楼主| 发表于 2014-3-4 19:12:12 | 显示全部楼层
本帖最后由 levinfish 于 2014-3-4 19:14 编辑

另外,还有一个问题:我定义了5个按钮,$button_x[5]。我在定义里面给出特定的信息a,可以方便我后续的操作,例如x可以代表地址的编号,只要知道这个编号,我就能直接知道地址。此外,button_X[1]这个数组的编号,也就是[1],[2],[3],[4],[5]也蕴含了一定量的信息,可以方便后续的判断。
如果我点击某个按钮,通过guigetmsg,我可以知道这个按钮的ID,但是ID一般使用数字表示。如何获得这个按钮的的定义名字,例如,我点击$button_X[1]对应的按钮,我如何的到‘button_X[1]'这几个字符。

我现在通过$msg要通过比较复杂的变换,才能得到button_X[1]这几个字符信息,有没有一种简单的方法得到这些信息,有劳各位大神了。
发表于 2014-3-4 19:53:52 | 显示全部楼层
本帖最后由 afan 于 2014-3-4 20:02 编辑
用二位数组能够实现,因为我的函数里面有一维的也有二维的,我自定义一个一维的函数,通用性比较强,二维只 ...
levinfish 发表于 2014-3-4 18:55



    你的是伪代码,我也只能给你伪代码。至于你为何用不了,仍因无代码不得而知。
Dim $a1button[5] = ['a1', 11, 12, 13, 14]
Dim $a2button[5] = ['a2', 21, 22, 23, 24]
Dim $a3button[5] = ['a3', 31, 32, 33, 34]
Dim $a4button[5] = ['a4', 41, 42, 43, 44]
Dim $a5button[5] = ['a5', 51, 52, 53, 54]

Dim $aBtAll[6] = [5, $a1button, $a2button, $a3button, $a4button, $a5button]
For $i = 1 To $aBtAll[0]
        myfunc($aBtAll[$i])
Next
Func myfunc(ByRef $button)
        MsgBox(0, $button[0], $button[1] & ", " & $button[2] & ", " & $button[3] & ", " & $button[4])
EndFunc
 楼主| 发表于 2014-3-4 21:40:52 | 显示全部楼层
本帖最后由 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[6]


Global   $a1button[25],$a2button[25],$a3button[25],$a4button[25],$a5button[25],$a6button[25],$a7button[25],$a8button[25],$a9button[25]

Global   $buttonarray[10]=[9,$a1button,$a2button,$a3button,$a4button,$a5button,$a6button,$a7button,$a8button,$a9button]


;====================================================================================================================
;================================================生成界面==========================================================
;====================================================================================================================

$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[3]);如果上一句赋值成功,则$text不等于空,应该等于3
MsgBox(0,'测试','如果赋值成功,应该是3,但现在是空,即:'&$text)

GUISetState()
 
;====================================================================================================================
;================================================执行部分==========================================================
;====================================================================================================================
 
        While 1
             $msg = GUIGetMsg()
                
                                Switch $msg
                                        
                                Case $GUI_EVENT_CLOSE
                                        Exit
                                Case $button[1] To $button[5]
                                        ;问题2所在地方。例如按下了$button[4],如果能够的到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[4]为例,即是知道了要删除的是$a4button,如何根据4 合成$a4button,使用  $a='a'&$i&'button'  $id=Eval($a),好像行不通。
        For $i=1 To 5
;~                 GUICtrlDelete($a1button[$i])
        Next

EndFunc
发表于 2014-3-4 22:58:45 | 显示全部楼层
不要乱用 ByRef
Dim $i, $msg
Dim $button[6], $buttonarray[6]

$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[1] To $button[5]
                        Mydeletearray($msg - 2)
        EndSwitch

WEnd

Func Mycreatebutton($x, $y)
        Local $Bttmp[6]
        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
 楼主| 发表于 2014-3-4 23:36:38 | 显示全部楼层
都是懒惹的祸,不想传递函数,想着用global简单一点,记得当年学习C语言的时候,老师也讲过,要慎用global变量,以后还是老老实实用return
afan大神里面$msg的使用方法以及$abt = $buttonarray[$m]确实很好,以前都没有想过这么赋值也是可以的。
非常感谢afan,netegg,gapkiller,今晚终于可以早点睡觉了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-28 13:28 , Processed in 0.078080 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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