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

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

[复制链接]
发表于 2012-7-10 03:12:34 | 显示全部楼层 |阅读模式
当开始接触到GUI编程后, 新手朋友们慢慢地就会碰到此类问题:是否能批量地创建某一种控件呢?
比如, 我要创建10 个按钮控件, 如果是一个一个创建, 敲代码不是问题, 排列及调整按钮位置才是最大的问题!

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

具体看下面示例吧.

Opt('guioneventmode', 1)
$form = GUICreate('两种批量创建按钮的方式', 300, 250)
GUISetOnEvent(-3, '_exit')
Local $button[5]
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[25] ;按钮总数
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[0] To $aButNum[UBound($aButNum) - 1]
                        MsgBox(0, '', '按钮 - ' & @GUI_CtrlId - 2)
        EndSwitch
EndFunc   ;==>_ButtonEvents

评分

参与人数 2金钱 +10 贡献 +8 收起 理由
lpxx + 10 水版回来啦?
user3000 + 8 谢谢, 愚笨至今无法体会 -2 的精粹!

查看全部评分

发表于 2012-7-10 10:06:20 | 显示全部楼层
回复 1# user3000

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

Global $aButNum[25] ;按钮总数
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[0] To $aButNum[UBound($aButNum) - 1]
                        MsgBox(0, '', '按钮 - ' & @GUI_CtrlId - $aButNum[0] + 1)
        EndSwitch
EndFunc   ;==>_ButtonEvents

评分

参与人数 1贡献 +5 收起 理由
user3000 + 5 果然是, 再次致谢!

查看全部评分

发表于 2012-7-10 10:43:00 | 显示全部楼层
看看 受教学习了
发表于 2012-7-10 20:33:21 | 显示全部楼层
没输出过GUI_CtrlId的值,估计第一个控件ID是3
关闭是-3,估计最大化是-2,最小化是-1,没试过
@GUI_CtrlId - $aButNum[0] + 1比@GUI_CtrlId -2好
发表于 2012-8-16 10:12:41 | 显示全部楼层
嗯,学习。。。
@GUI_CtrlId要在OnEvent模式下才有。

用msgbox看看,果然第一个控件ID就是3,然后依次递增。
@GUI_CtrlId - $aButNum[0] + 1 很容易理解了。
发表于 2012-12-30 23:15:26 | 显示全部楼层
多谢无私奉献,向高手学习
发表于 2014-5-15 11:11:23 | 显示全部楼层
雷锋精神传天下!谢谢分享!
发表于 2015-11-11 14:10:09 | 显示全部楼层
厉害啊,不服不行啊
发表于 2015-11-14 23:24:02 | 显示全部楼层
看看 受教学习了
发表于 2016-2-10 20:34:22 | 显示全部楼层
发表于 2017-6-13 14:56:36 | 显示全部楼层
谢谢楼主了。
发表于 2019-5-15 12:23:55 | 显示全部楼层
看得我懵懵懂懂的
发表于 2019-5-18 19:54:44 | 显示全部楼层
初学者
现在只能收藏研究
谢谢给位老师
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-3-29 16:41 , Processed in 0.086837 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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