按钮数组创建和设置,等距离创建思路,请指导一下[已解决]
本帖最后由 heroxianf 于 2016-5-5 09:11 编辑下面是我读取INI配置里的东东,然后批量设置按钮名字,主要是想练习一下数组按钮,A大提过一次,求简单举例,我再论坛里搜索出来的是批量创建按钮,而不是创建好了,在去设置名称。我想知道如何计算一个界面上批量创建和设置的边距问题如何处理的,按钮是如何创建的。
$buttonArray = IniReadSection($bIni, "Data")
$oFrme = GUICreate("数组按钮练习", 1009, 609, 164, 66)
$bGroup = GUICtrlCreateGroup("", 6, 120, 130, 470)
$Button1 = GUICtrlCreateButton($buttonArray, 20, 139, 100, 25)
$Button2 = GUICtrlCreateButton($buttonArray, 20, 176, 100, 25)
$Button3 = GUICtrlCreateButton($buttonArray, 20, 213, 100, 25)
$Button4 = GUICtrlCreateButton($buttonArray, 20, 250, 100, 25)
$Button5 = GUICtrlCreateButton($buttonArray, 20, 287, 100, 25)
$Button6 = GUICtrlCreateButton($buttonArray, 20, 324, 100, 25)
$Button7 = GUICtrlCreateButton($buttonArray, 20, 362, 100, 25)
$Button8 = GUICtrlCreateButton($buttonArray, 20, 399, 100, 25)
$Button9 = GUICtrlCreateButton($buttonArray, 20, 436, 100, 25)
$Button10 = GUICtrlCreateButton($buttonArray, 20, 473, 100, 25)
$Button11 = GUICtrlCreateButton($buttonArray, 20, 510, 100, 25)
$Button12 = GUICtrlCreateButton($buttonArray, 20, 547, 100, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
搜索出来的结果A大的哦,没看多明白。
Local $BTXL, $XLlist = 1, $XLspaceX = 95, $XLspaceY = 80, $XLbjx = 170, $XLbjy = 35
$Form1 = GUICreate('Form1', 623, 442)
Local $aBtn = [['运行notepad'],['bbb'],['c'],['d'],['退出']]
For $i = 0 To UBound($BTXL) - 1
$aBtn[$i] = GUICtrlCreateButton($aBtn[$i], $XLspaceX * Mod($i, $XLlist) + $XLbjx, $XLspaceY * Floor($i / $XLlist) + $XLbjy, 160, 35)
Next
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3, $aBtn
Exit
Case $aBtn
Run('notepad.exe')
Case $aBtn To $aBtn
MsgBox(0, '按钮文本', GUICtrlRead($nMsg))
EndSwitch
WEnd 本帖最后由 afan 于 2016-4-26 11:13 编辑
我给你注释整理了,再看不懂就没办法了。至于创建前定义按钮文本,还是创建后再去 GUICtrlSetData() 设置,可依自己写码习惯。当然,我的代码即是我的建议。
Global $cBtn = 5, $iCol = 1, $iBtnW = 120, $iBtnH = 25 ;---- 控件数量;列数;控件宽度;控件高度
Global $iSpace_X = 95, $iSpace_Y = 40, $iLeft = 30, $iTop = 55 ;---- X向间距;Y向间距;距左;距上
Global $a2D_BtnInfo[$cBtn] = [ _ ;---- 定义二维数组,这里仅赋值一维(控件文本)即可
['运行notepad'], _
['bbb'], _
['c'], _
['d'], _
['退出']]
_Main() ;---- 调用主函数
Func _Main() ;======== 主函数
Local $i, $nMsg
GUICreate('批量创建控件')
For $i = 0 To $cBtn - 1 ;---- 以下批量创建,将控件ID存储于二维数组的另一维
$a2D_BtnInfo[$i] = GUICtrlCreateButton($a2D_BtnInfo[$i], $iSpace_X * Mod($i, $iCol) + $iLeft, $iSpace_Y * Floor($i / $iCol) + $iTop, $iBtnW, $iBtnH)
Next
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3, $a2D_BtnInfo
Exit
Case $a2D_BtnInfo
Run('notepad.exe')
Case $a2D_BtnInfo To $a2D_BtnInfo
MsgBox(0, '按钮文本', GUICtrlRead($nMsg))
EndSwitch
WEnd
EndFunc ;==>_Main 回复 2# afan
A大的建议应该好好学习,因为都是捷径,我下来好好看看代码。 回复afan
A大的建议应该好好学习,因为都是捷径,我下来好好看看代码。
heroxianf 发表于 2016-4-26 11:13 http://www.autoitx.com/images/common/back.gif
用数组(变量)存储数据可方便调用、Get、Set 等,也便于代码的维护。一楼你的代码,只需将IniReadSection($bIni, "Data") 之后整理到一个数组即可,其它的均可直接套用例子 回复 4# afan
好的,谢谢A大的指导,下来我研究一下。 回复 2# afan
{:face (468):}
强又学到一招 回复 4# afan
A大如果我创建的按钮一列排不完,如何自动跳到第二例继续创建呢?或者我规定一列只创建5个 多的就往第二列创建。 回复afan
A大如果我创建的按钮一列排不完,如何自动跳到第二例继续创建呢?或者我规定一列只创 ...
heroxianf 发表于 2016-4-28 17:10 http://www.autoitx.com/images/common/back.gif
不是给你注释了吗? $iCol 就是列数,你改为2试试? 自己要学会调试。 回复 8# afan
看到了,我再折腾一下。 A大的代码精炼,赞 回复 8# afan
A大我修改后大体符合自己的要求了,但是我在处理这个$iCol 列的数量问题遇到问题了。比如说,我设置每列创建的按钮是6个,读取INI里的数量是小于6,$iCol=1. 读取INI里的数量大6小于12,$iCol=2 。 读取INI里的数量大于12小于19,$iCol=3,以此类推。我不知道怎么弄了。
#include <Array.au3>
local $ini = @ScriptDir & "/Test.ini"
Local $aArray = IniReadSection($ini, "Data")
;~ _ArrayDisplay($aArray)
Global $cBtn = $aArray
Global $iCol = floor($cBtn / 6) + 1, $iBtnW = 120, $iBtnH = 25
Global $iSpace_X = 125, $iSpace_Y = 40, $iLeft = 10, $iTop = 20
Global $a2D_BtnInfo[$cBtn]
_Main()
Func _Main()
Local $i, $nMsg
GUICreate('批量创建控件示例')
For $i = 0 To $cBtn - 1
$a2D_BtnInfo[$i] = GUICtrlCreateButton($aArray[$i + 1], $iSpace_X * Mod($i, $iCol) + $iLeft, $iSpace_Y * Floor($i / $iCol) + $iTop, $iBtnW, $iBtnH)
Next
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $a2D_BtnInfo To $a2D_BtnInfo[$cBtn - 1]
;~ MsgBox(0, '按钮文本', GUICtrlRead($nMsg), 2)
Local $sRead = IniRead($ini, "Data", GUICtrlRead($nMsg), "默认值")
ShellExecute($sRead)
EndSwitch
WEnd
EndFunc ;==>_Main
INI文件内容
百度首页=http://www.baidu.com
百度地图=http://map.baidu.com
新浪=http://www.sina.com
163MAIL=http://mail.163.com
163首页=http://www.163.com
测试6=http://www.baidu.com
测试7=http://www.baidu.com
测试8=http://www.baidu.com
测试9=http://www.baidu.com
测试10=http://www.baidu.com
测试11=http://www.baidu.com
测试12=http://www.baidu.com
测试13=http://www.baidu.com 回复 11# heroxianf
这里阵列的方式是只指定列数,行数是随 总数/列数 来的,所以,你指定行数6当然无效。你从显示结果也可以看出,它是一行一行序列的 本帖最后由 heroxianf 于 2016-5-6 13:48 编辑
回复 12# afan
那只能事先按照界面大小指定列数,就这样解决。那如果我要写成事件模式,如何修改呢? 回复afan
那只能事先按照界面大小指定列数,就这样解决。那如果我要写成事件模式,如何修改呢?
heroxianf 发表于 2016-5-6 13:26 http://www.autoitx.com/images/common/back.gif
恶补基础知识!Local $ini = @ScriptDir & '/Test.ini'
Local $aArray = IniReadSection($ini, 'Data')
Global $cBtn = $aArray
Global $iCol = Ceiling($cBtn / 6), $iBtnW = 120, $iBtnH = 25
Global $iSpace_X = 125, $iSpace_Y = 40, $iLeft = 10, $iTop = 20
Opt('GUIOnEventMode', 1)
_Main()
While 1
Sleep(1000)
WEnd
Func _Main()
Local $i, $nMsg
GUICreate('批量创建控件示例')
GUISetOnEvent(-3, '_Exit')
For $i = 0 To $cBtn - 1
GUICtrlCreateButton($aArray[$i + 1], $iSpace_X * Mod($i, $iCol) + $iLeft, $iSpace_Y * Floor($i / $iCol) + $iTop, $iBtnW, $iBtnH)
GUICtrlSetOnEvent(-1, '_Guimsg')
Next
GUISetState()
EndFunc ;==>_Main
Func _Guimsg()
Local $sTxt = GUICtrlRead(@GUI_CtrlId)
Local $sRead = IniRead($ini, 'Data', $sTxt, '默认值')
MsgBox(0, $sTxt, $sRead)
;~ ShellExecute($sRead)
EndFunc ;==>_Guimsg
Func _Exit()
Exit
EndFunc ;==>_Exit 回复 14# afan
{:face (197):} 谢谢,下来认真看基础。
While 1
Sleep(1000)
WEnd
居然这个要移除来。
页:
[1]
2