找回密码
 加入
搜索
查看: 4674|回复: 15

[效率算法] 按钮数组创建和设置,等距离创建思路,请指导一下[已解决]

  [复制链接]
发表于 2016-4-26 10:29:55 | 显示全部楼层 |阅读模式
本帖最后由 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[1][0], 20, 139, 100, 25)
$Button2 = GUICtrlCreateButton($buttonArray[2][0], 20, 176, 100, 25)
$Button3 = GUICtrlCreateButton($buttonArray[3][0], 20, 213, 100, 25)
$Button4 = GUICtrlCreateButton($buttonArray[4][0], 20, 250, 100, 25)
$Button5 = GUICtrlCreateButton($buttonArray[5][0], 20, 287, 100, 25)
$Button6 = GUICtrlCreateButton($buttonArray[6][0], 20, 324, 100, 25)
$Button7 = GUICtrlCreateButton($buttonArray[7][0], 20, 362, 100, 25)
$Button8 = GUICtrlCreateButton($buttonArray[8][0], 20, 399, 100, 25)
$Button9 = GUICtrlCreateButton($buttonArray[9][0], 20, 436, 100, 25)
$Button10 = GUICtrlCreateButton($buttonArray[10][0], 20, 473, 100, 25)
$Button11 = GUICtrlCreateButton($buttonArray[11][0], 20, 510, 100, 25)
$Button12 = GUICtrlCreateButton($buttonArray[12][0], 20, 547, 100, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)


搜索出来的结果A大的哦,没看多明白。

    Local $BTXL[5], $XLlist = 1, $XLspaceX = 95, $XLspaceY = 80, $XLbjx = 170, $XLbjy = 35
    $Form1 = GUICreate('Form1', 623, 442)
    Local $aBtn[5][2] = [['运行notepad'],['bbb'],['c'],['d'],['退出']]
    For $i = 0 To UBound($BTXL) - 1
            $aBtn[$i][1] = GUICtrlCreateButton($aBtn[$i][0], $XLspaceX * Mod($i, $XLlist) + $XLbjx, $XLspaceY * Floor($i / $XLlist) + $XLbjy, 160, 35)
    Next
    GUISetState()

    While 1
            $nMsg = GUIGetMsg()
            Switch $nMsg
                    Case -3, $aBtn[4][1]
                            Exit
                    Case $aBtn[0][1]
                            Run('notepad.exe')
                    Case $aBtn[1][1] To $aBtn[3][1]
                            MsgBox(0, '按钮文本', GUICtrlRead($nMsg))
            EndSwitch
    WEnd
发表于 2016-4-26 11:08:09 | 显示全部楼层
本帖最后由 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][2] = [ _                                ;---- 定义二维数组,这里仅赋值一维(控件文本)即可
                ['运行notepad'], _
                ['bbb'], _
                ['c'], _
                ['d'], _
                ['退出']]

_Main()        ;---- 调用主函数


Func _Main()        ;======== 主函数
        Local $i, $nMsg
        GUICreate('批量创建控件')
        For $i = 0 To $cBtn - 1                        ;---- 以下批量创建,将控件ID存储于二维数组的另一维
                $a2D_BtnInfo[$i][1] = GUICtrlCreateButton($a2D_BtnInfo[$i][0], $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[4][1]
                                Exit
                        Case $a2D_BtnInfo[0][1]
                                Run('notepad.exe')
                        Case $a2D_BtnInfo[1][1] To $a2D_BtnInfo[3][1]
                                MsgBox(0, '按钮文本', GUICtrlRead($nMsg))
                EndSwitch
        WEnd
EndFunc   ;==>_Main
 楼主| 发表于 2016-4-26 11:13:40 | 显示全部楼层
回复 2# afan

A大的建议应该好好学习,因为都是捷径,我下来好好看看代码。
发表于 2016-4-26 11:19:46 | 显示全部楼层
回复  afan

A大的建议应该好好学习,因为都是捷径,我下来好好看看代码。
heroxianf 发表于 2016-4-26 11:13



    用数组(变量)存储数据可方便调用、Get、Set 等,也便于代码的维护。一楼你的代码,只需将IniReadSection($bIni, "Data") 之后整理到一个数组即可,其它的均可直接套用例子
 楼主| 发表于 2016-4-26 11:27:50 | 显示全部楼层
回复 4# afan

好的,谢谢A大的指导,下来我研究一下。
发表于 2016-4-26 13:49:13 | 显示全部楼层
回复 2# afan


   
强  又学到一招
 楼主| 发表于 2016-4-28 17:10:55 | 显示全部楼层
回复 4# afan


    A大如果我创建的按钮一列排不完,如何自动跳到第二例继续创建呢?或者我规定一列只创建5个 多的就往第二列创建。
发表于 2016-4-28 17:18:04 | 显示全部楼层
回复  afan


    A大如果我创建的按钮一列排不完,如何自动跳到第二例继续创建呢?或者我规定一列只创 ...
heroxianf 发表于 2016-4-28 17:10



    不是给你注释了吗? $iCol 就是列数,你改为2试试? 自己要学会调试。
 楼主| 发表于 2016-4-28 17:31:39 | 显示全部楼层
回复 8# afan

看到了,我再折腾一下。
发表于 2016-5-2 15:10:44 | 显示全部楼层
A大的代码精炼,赞
 楼主| 发表于 2016-5-6 12:08:41 | 显示全部楼层
回复 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[0][0]
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][2]

_Main()

Func _Main()
        Local $i, $nMsg
        GUICreate('批量创建控件示例')
        For $i = 0 To $cBtn - 1
                $a2D_BtnInfo[$i][1] = GUICtrlCreateButton($aArray[$i + 1][0], $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[0][1] To $a2D_BtnInfo[$cBtn - 1][1]
;~                                 MsgBox(0, '按钮文本', GUICtrlRead($nMsg), 2)
                                Local $sRead = IniRead($ini, "Data", GUICtrlRead($nMsg), "默认值")
                                ShellExecute($sRead)
                EndSwitch
        WEnd
EndFunc   ;==>_Main


INI文件内容
[Data]
百度首页=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
发表于 2016-5-6 12:22:07 | 显示全部楼层
回复 11# heroxianf


    这里阵列的方式是只指定列数行数是随 总数/列数 来的,所以,你指定行数6当然无效。你从显示结果也可以看出,它是一行一行序列的
 楼主| 发表于 2016-5-6 13:26:30 | 显示全部楼层
本帖最后由 heroxianf 于 2016-5-6 13:48 编辑

回复 12# afan

那只能事先按照界面大小指定列数,就这样解决。那如果我要写成事件模式,如何修改呢?
发表于 2016-5-6 14:38:34 | 显示全部楼层
回复  afan

那只能事先按照界面大小指定列数,就这样解决。那如果我要写成事件模式,如何修改呢?
heroxianf 发表于 2016-5-6 13:26



    恶补基础知识!
Local $ini = @ScriptDir & '/Test.ini'
Local $aArray = IniReadSection($ini, 'Data')
Global $cBtn = $aArray[0][0]
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][0], $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
 楼主| 发表于 2016-5-6 14:56:19 | 显示全部楼层
回复 14# afan


       谢谢,下来认真看基础。

While 1
        Sleep(1000)
WEnd   
居然这个要移除来。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-4-20 01:36 , Processed in 0.083516 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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