user3000 发表于 2012-7-10 03:12:34

如何批量地规则地创建同一类GUI控件?

当开始接触到GUI编程后, 新手朋友们慢慢地就会碰到此类问题:是否能批量地创建某一种控件呢?
比如, 我要创建10 个按钮控件, 如果是一个一个创建, 敲代码不是问题, 排列及调整按钮位置才是最大的问题!

答案是肯定的.
有两种方法可达到目的: 1, 用数组. 优点是易于理解, 引用控件变量名方便. 缺点是: 如果控件数目未知, 数组下标则不能确定, 必须正确处理保证数组下标不越界!
                                 2, 用Assign函数. 优点是不用特意去计算控件数目. 缺点是引用控件变量名麻烦, 代码不易理解.

具体看下面示例吧.

Opt('guioneventmode', 1)
$form = GUICreate('两种批量创建按钮的方式', 300, 250)
GUISetOnEvent(-3, '_exit')
Local $button
For $j = 0 To 4
        $button[$j] = GUICtrlCreateButton('按钮' & $j+1, 45, 25+$j*45, 75, 28)
        GUICtrlSetOnEvent(-1, '_clicks')
Next

For $j = 1 To 5
        Assign('button' & $j, GUICtrlCreateButton('按钮' & $j+5, 175, 25+($j-1)*45, 75, 28))
        GUICtrlSetOnEvent(-1, '_clicks')
Next
GUISetState()
While 1
        Sleep(100)
WEnd

Func _exit()
        Exit
EndFunc

Func _clicks()
Local $t = GUICtrlRead(@GUI_CtrlId)
Local $var = ''
For $i = 0 To 4
        If $button[$i] = @GUI_CtrlId Then $var = '$button[' & $i & ']'
        If Eval('button' & $i+1) = @GUI_CtrlId Then $var = '$button' & $i+1
Next
MsgBox(0, '按钮点击测试', '按钮ID:' & @TAB & @GUI_CtrlId & @CR &'按钮变量名:' & @TAB & $var & @CR & '按钮名称:' &@TAB & $t, '', $form)               
EndFunc

有别的见解或问题请跟帖交流, 谢谢!

水木子 发表于 2012-7-10 09:11:57

Global $aButNum ;按钮总数
Global $iNumber = 5 ;每行按钮数量
Global $iSpacingX = 50, $iSpacingY = 50 ;垂直、水平,间距

Opt('GUIOnEventMode', 1)

GUICreate('循环创建按钮', 300, 300)
GUISetOnEvent(-3, '_ButtonEvents')
For $i = 0 To UBound($aButNum) - 1
        $aButNum[$i] = GUICtrlCreateButton($i + 1, $iSpacingX * Mod($i, $iNumber) + 25, $iSpacingY * Floor($i / $iNumber) + 25, 50, 50)
        GUICtrlSetOnEvent(-1, '_ButtonEvents')
Next
GUISetState()

While 1
        Sleep(250)
WEnd

Func _ButtonEvents()
        Switch @GUI_CtrlId
                Case -3
                        Exit
                Case $aButNum To $aButNum
                        MsgBox(0, '', '按钮 - ' & @GUI_CtrlId - 2)
        EndSwitch
EndFunc   ;==>_ButtonEvents

水木子 发表于 2012-7-10 10:06:20

回复 1# user3000

我认为这样理解更加妥当!

Global $aButNum ;按钮总数
Global $iNumber = 5 ;每行按钮数量
Global $iSpacingX = 50, $iSpacingY = 50 ;垂直、水平,间距

Opt('GUIOnEventMode', 1)

GUICreate('循环创建按钮', 300, 300)
GUISetOnEvent(-3, '_ButtonEvents')
For $i = 0 To UBound($aButNum) - 1
        $aButNum[$i] = GUICtrlCreateButton($i + 1, $iSpacingX * Mod($i, $iNumber) + 25, $iSpacingY * Floor($i / $iNumber) + 25, 50, 50)
        GUICtrlSetOnEvent(-1, '_ButtonEvents')
Next
GUISetState()

While 1
        Sleep(250)
WEnd

Func _ButtonEvents()
        Switch @GUI_CtrlId
                Case -3
                        Exit
                Case $aButNum To $aButNum
                        MsgBox(0, '', '按钮 - ' & @GUI_CtrlId - $aButNum + 1)
        EndSwitch
EndFunc   ;==>_ButtonEvents

ooxxgod 发表于 2012-7-10 10:43:00

看看 受教学习了

seniors 发表于 2012-7-10 20:33:21

没输出过GUI_CtrlId的值,估计第一个控件ID是3
关闭是-3,估计最大化是-2,最小化是-1,没试过
@GUI_CtrlId - $aButNum + 1比@GUI_CtrlId -2好

xiehuahere 发表于 2012-8-16 10:12:41

嗯,学习。。。
@GUI_CtrlId要在OnEvent模式下才有。

用msgbox看看,果然第一个控件ID就是3,然后依次递增。
@GUI_CtrlId - $aButNum + 1 很容易理解了。

单毛线 发表于 2012-12-30 23:15:26

多谢无私奉献,向高手学习

hollandmfq 发表于 2014-5-15 11:11:23

雷锋精神传天下!谢谢分享!

wwwmhk 发表于 2015-11-11 14:10:09

厉害啊,不服不行啊

raeast 发表于 2015-11-14 23:24:02

看看 受教学习了

漠北雪~狼 发表于 2016-2-10 20:34:22

http://www.autoitx.com/thread-5729-1-1.html

ssmusic 发表于 2017-6-13 14:56:36

谢谢楼主了。

ws1870 发表于 2019-5-15 12:23:55

看得我懵懵懂懂的

120268323 发表于 2019-5-18 19:54:44

初学者
现在只能收藏研究
谢谢给位老师
页: [1]
查看完整版本: 如何批量地规则地创建同一类GUI控件?