heroxianf 发表于 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, 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: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] = [ _                                ;---- 定义二维数组,这里仅赋值一维(控件文本)即可
                ['运行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

heroxianf 发表于 2016-4-26 11:13:40

回复 2# afan

A大的建议应该好好学习,因为都是捷径,我下来好好看看代码。

afan 发表于 2016-4-26 11:19:46

回复afan

A大的建议应该好好学习,因为都是捷径,我下来好好看看代码。
heroxianf 发表于 2016-4-26 11:13 http://www.autoitx.com/images/common/back.gif


    用数组(变量)存储数据可方便调用、Get、Set 等,也便于代码的维护。一楼你的代码,只需将IniReadSection($bIni, "Data") 之后整理到一个数组即可,其它的均可直接套用例子

heroxianf 发表于 2016-4-26 11:27:50

回复 4# afan

好的,谢谢A大的指导,下来我研究一下。

hnfeng 发表于 2016-4-26 13:49:13

回复 2# afan


    {:face (468):}
强又学到一招

heroxianf 发表于 2016-4-28 17:10:55

回复 4# afan


    A大如果我创建的按钮一列排不完,如何自动跳到第二例继续创建呢?或者我规定一列只创建5个 多的就往第二列创建。

afan 发表于 2016-4-28 17:18:04

回复afan


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


    不是给你注释了吗? $iCol 就是列数,你改为2试试? 自己要学会调试。

heroxianf 发表于 2016-4-28 17:31:39

回复 8# afan

看到了,我再折腾一下。

Netfox 发表于 2016-5-2 15:10:44

A大的代码精炼,赞

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

afan 发表于 2016-5-6 12:22:07

回复 11# heroxianf


    这里阵列的方式是只指定列数,行数是随 总数/列数 来的,所以,你指定行数6当然无效。你从显示结果也可以看出,它是一行一行序列的

heroxianf 发表于 2016-5-6 13:26:30

本帖最后由 heroxianf 于 2016-5-6 13:48 编辑

回复 12# afan

那只能事先按照界面大小指定列数,就这样解决。那如果我要写成事件模式,如何修改呢?

afan 发表于 2016-5-6 14:38:34

回复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

heroxianf 发表于 2016-5-6 14:56:19

回复 14# afan


    {:face (197):}   谢谢,下来认真看基础。

While 1
      Sleep(1000)
WEnd   
居然这个要移除来。
页: [1] 2
查看完整版本: 按钮数组创建和设置,等距离创建思路,请指导一下[已解决]