找回密码
 加入
搜索
查看: 8349|回复: 17

[AU3基础] 关于 GUICtrlCreateList 中文字的自动排序功能

 火.. [复制链接]
发表于 2010-5-26 20:48:18 | 显示全部楼层 |阅读模式
本帖最后由 chenronting 于 2010-6-1 22:28 编辑

不知道大家有没有发现. 用 guictrlsetdata 往 list 里写入数据. 会自动排序 .
而我不想要这个自动排序的功能要怎么做呢.
我这里上个图吧.
看右边.
如果只是 9个. 那么就正常的. 10 个的话. 开头是 10的. 就会自动跑第二个去了.
不知道 list  有没有什么样式能控制这种自动排序功能的.
晚安 .!



还是水木子大哥。 厉害 。。相当的!~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-5-26 21:33:38 | 显示全部楼层
本帖最后由 水木子 于 2010-5-31 00:07 编辑
#include <GUIListBox.au3>
#include <GuiTreeView.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>

$Path = @ScriptDir & '\SWInstall.ini'
$aRegFitem = StringRegExp(FileRead($Path), '\[\d+\]', 3)
$aRegSitem = StringRegExp(FileRead($Path), '\[\d+-\d+\]', 3)

Local $aFitem[UBound($aRegFitem)][2], $aSitem[UBound($aRegSitem)][2]
Local $sItemText
Local $z = 1, $f = -1, $s = -1

$iStyle = BitOR($TVS_EDITLABELS, $TVS_HASBUTTONS, $TVS_HASLINES, $TVS_LINESATROOT, $TVS_DISABLEDRAGDROP, $TVS_SHOWSELALWAYS, $TVS_CHECKBOXES)
GUICreate("TreeView项目勾选操作", 600, 450)
$TreeView1 = GUICtrlCreateTreeView(5, 5, 290, 380, $iStyle, $WS_EX_CLIENTEDGE)
$List1 = GUICtrlCreateList('', 300, 5, 295, 380)
$But1 = GUICtrlCreateButton("读取被选项目", 100, 400, 100, 30, $WS_GROUP)
$But2 = GUICtrlCreateButton("开始模拟安装", 400, 400, 100, 30, $WS_GROUP)

$var = IniReadSectionNames($Path)
If Not @error Then
        For $i = 1 To $var[0]
                If StringIsDigit($var[$i]) Then
                        $f += 1
                        $sFtext = IniRead($Path, $var[$i], 'ParentName', '')
                        $aFitem[$f][0] = GUICtrlCreateTreeViewItem($sFtext, $TreeView1)
                        $aFitem[$f][1] = $sFtext
                Else
                        $s += 1
                        $sStext = IniRead($Path, $var[$i], 'ChildName', '')
                        $aSitem[$s][0] = GUICtrlCreateTreeViewItem($sStext, $aFitem[$f][0])
                        $aSitem[$s][1] = $sStext
                EndIf
        Next
EndIf
GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $aFitem[0][0] To $aFitem[UBound($aFitem) - 1][0] ;父项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果父项目勾选,其下所有子项目全选。
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $nMsg))
                                For $i = $nMsg To $nMsg + $iSitemNumber
                                        GUICtrlSetState($i, $GUI_CHECKED)
                                Next
                        Else
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $nMsg))
                                For $i = $nMsg To $nMsg + $iSitemNumber
                                        GUICtrlSetState($i, $GUI_UNCHECKED)
                                Next
                        EndIf
                        ContinueCase
                Case $aSitem[0][0] To $aSitem[UBound($aSitem) - 1][0] ;子项目
                        If BitAND(GUICtrlRead($nMsg), $GUI_CHECKED) Then ;如果子项目勾选,其父项目也跟着勾选。
                                $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
                                GUICtrlSetState($hFitemHandle, $GUI_CHECKED)
                        Else ;父项目下的所有子项目全部取消勾选,父项目也跟着取消勾选。
                                $hFitemHandle = _GUICtrlTreeView_GetParentParam($TreeView1, $nMsg)
                                $iSitemNumber = Number(_GUICtrlTreeView_GetChildCount($TreeView1, $hFitemHandle))
                                For $i = $hFitemHandle To $hFitemHandle + $iSitemNumber
                                        If GUICtrlRead($i) = $GUI_CHECKED Then ExitLoop
                                        If $i = $hFitemHandle + $iSitemNumber Then GUICtrlSetState($hFitemHandle, $GUI_UNCHECKED)
                                Next
                        EndIf

                        $x = 1
                        $sItemText = ''
                        GUICtrlSetData($List1, '') ;清空List内所有数据
                        For $i = 0 To UBound($aSitem) - 1
                                If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
                                        GUICtrlSetData($List1, StringFormat("[%02d]", $x) & $aSitem[$i][1]) ;如果项目被勾选则写入List
                                        $sItemText &= $aSitem[$i][1] & '|'
                                        $x += 1
                                EndIf
                        Next
                Case $But1
                        $sText = ''
                        For $i = 0 To UBound($aSitem) - 1
                                If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i][0]) Then
                                        $sText &= '被选项目句柄:' & $aSitem[$i][0] & '   ' & '项目文本:' & $aSitem[$i][1] & @CRLF
                                EndIf
                        Next
                        If $sText <> '' Then MsgBox(0, '获取被选项目句柄+项目文本', $sText)
                Case $But2
                        begin()
        EndSwitch
WEnd

Func begin()
        $aLines = StringSplit($sItemText, '|', 2)
        For $i = 0 To UBound($aLines) - 1
                _GUICtrlListBox_ReplaceString($List1, $i, '[→]' & $aLines[$i])
                _GUICtrlListBox_SetCurSel($List1, $i)
                Sleep(800)
                _GUICtrlListBox_ReplaceString($List1, $i, '[OK]' & $aLines[$i])
                _GUICtrlListBox_SetCurSel($List1, $i)
        Next
        MsgBox(0, '', '安装完成!')
EndFunc   ;==>begin

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 3金钱 +70 贡献 +5 收起 理由
lynfr8 + 5
hzxymkb + 50 强大
pusofalse + 20

查看全部评分

发表于 2010-5-26 23:36:49 | 显示全部楼层
本帖最后由 131738 于 2010-5-26 23:38 编辑

回复 1# chenronting


    是否用了 $LBS_SORT      $LBS_STANDARD 。。。。。。。。。。
发表于 2010-5-27 02:33:52 | 显示全部楼层
回复 2# 水木子

For $i = 0 To UBound($aFitem) - 1 ;父项目操作
    If $nMsg = $aFiterm[$i][0] ...
Next
For $z = 0 To UBound($aSitem) - 1 ;子项目操作
    If $nMsg = $aSitem[$i][0] ...
Next

这两个循环和其中的判断没有意义啊,为何要这样写?而且还浪费效率。
发表于 2010-5-27 07:54:28 | 显示全部楼层
回复 1# chenronting
可否提供源码?
发表于 2010-5-27 08:30:19 | 显示全部楼层
本帖最后由 水木子 于 2010-5-27 08:44 编辑

回复 4# pusofalse
If $nMsg = $aFiterm[$i][0]
P版是指的这句判断吗?这句判断是有用的啊!当初我也认为是多余的,谁知道去掉以后出现项目无法勾选的情况。(点击项目完全没反应勾不上)
发表于 2010-5-27 11:53:15 | 显示全部楼层
回复 6# 水木子


    不只是判断,两个for循环也是多余的。$nMsg就是$aFitem[$i][0]啊,你对$aFitem[$i][0]进行操作,实际不就是对$nMsg操作吗?$nMsg总是在aFitem[0][0] 、$aFitem[UBound($aFitem) - 1][0], $aSitem[0][0] 、$aSitem[UBound($aSitem) - 1][0]之间的,Switch $nMsg不是判断$nMsg的范围的吗。
发表于 2010-5-27 13:22:39 | 显示全部楼层
不只是判断,两个for循环也是多余的。
发表于 2010-5-27 14:33:42 | 显示全部楼层
不只是判断,两个for循环也是多余的。
zhouning 发表于 2010-5-27 13:22


你有什么高招?
 楼主| 发表于 2010-5-27 14:55:33 | 显示全部楼层
回复 3# 131738

请问你这个是对LIST 而言吗.. 我对LIST 没加样式 .,
而你说的这两个我都没加.
是要加上这两个吗. 要加在哪里 .?
 楼主| 发表于 2010-5-27 14:56:37 | 显示全部楼层
回复 5# newuser


    水木子. 发的.就是源码 .
发表于 2010-5-27 21:28:33 | 显示全部楼层
回复 10# chenronting

帮助说这两个样式有排序作用。。。。
发表于 2010-5-31 00:12:25 | 显示全部楼层
本帖最后由 水木子 于 2010-5-31 08:34 编辑

非常感谢P版的指点,我重新修改了2楼的代码,并添加了“模拟安装”,希望的代码之前没有误导大家。
发表于 2010-5-31 19:53:02 | 显示全部楼层
水木子的代码很好,谢谢。
发表于 2010-6-1 22:21:32 | 显示全部楼层
新手,跟着学习学习
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-4 13:27 , Processed in 0.095266 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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