levinfish 发表于 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


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

绿色风 发表于 2014-3-4 07:09:42

看 eval 函数,就是想干你需要的活的

levinfish 发表于 2014-3-4 07:50:43

之前描述之前描述有问题,已改过,eval函数行不通

afan 发表于 2014-3-4 09:44:53

建议不要这样使用 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

netegg 发表于 2014-3-4 11:19:13

建立不定数组,然后redim

gapkiller 发表于 2014-3-4 17:03:18

建议楼主试试二维数组, 不就一下搞定了么.

gapkiller 发表于 2014-3-4 17:04:21

建议不要这样使用 Eval 函数,就算能用,将来如要迷惑之类的就完全无用了。
为何有简单明了的方式不用呢… ...
afan 发表于 2014-3-4 09:44 http://www.autoitx.com/images/common/back.gif


    afan
{:face (310):}

afan 发表于 2014-3-4 17:49:40

afan
gapkiller 发表于 2014-3-4 17:04 http://www.autoitx.com/images/common/back.gif


    换个爷们的头像吧,这样容易让人错觉…

levinfish 发表于 2014-3-4 18:55:47

用二位数组能够实现,因为我的函数里面有一维的也有二维的,我自定义一个一维的函数,通用性比较强,二维只需要添加一个for循环就行。
我试了一下afan的方法,貌似也行不通,仍然传递不过去。
貌似Dim $aBtAll = , $a2button, $a3button, $a4button]这个定义里回报告,维数出错。将定义修改为,Dim $aBtAll = ,程序不报错,但是仍无法传递。读取$a1button里面的值,全是0.
redim的方法在测试,但不知道该怎么应用。

levinfish 发表于 2014-3-4 19:12:12

本帖最后由 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 19:53:52

本帖最后由 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: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


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

afan 发表于 2014-3-4 22:58:45

不要乱用 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

levinfish 发表于 2014-3-4 23:36:38

都是懒惹的祸,不想传递函数,想着用global简单一点,记得当年学习C语言的时候,老师也讲过,要慎用global变量,以后还是老老实实用return
afan大神里面$msg的使用方法以及$abt = $buttonarray[$m]确实很好,以前都没有想过这么赋值也是可以的。
非常感谢afan,netegg,gapkiller,今晚终于可以早点睡觉了。
页: [1]
查看完整版本: 已解决:一个关于数组下标的问题