chenronting 发表于 2010-5-26 20:48:18

关于 GUICtrlCreateList 中文字的自动排序功能

本帖最后由 chenronting 于 2010-6-1 22:28 编辑

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

:face (16):

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

水木子 发表于 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, $aSitem
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
                If StringIsDigit($var[$i]) Then
                        $f += 1
                        $sFtext = IniRead($Path, $var[$i], 'ParentName', '')
                        $aFitem[$f] = GUICtrlCreateTreeViewItem($sFtext, $TreeView1)
                        $aFitem[$f] = $sFtext
                Else
                        $s += 1
                        $sStext = IniRead($Path, $var[$i], 'ChildName', '')
                        $aSitem[$s] = GUICtrlCreateTreeViewItem($sStext, $aFitem[$f])
                        $aSitem[$s] = $sStext
                EndIf
        Next
EndIf
GUISetState()

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case - 3
                        Exit
                Case $aFitem To $aFitem ;父项目
                        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 To $aSitem ;子项目
                        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]) Then
                                        GUICtrlSetData($List1, StringFormat("[%02d]", $x) & $aSitem[$i]) ;如果项目被勾选则写入List
                                        $sItemText &= $aSitem[$i] & '|'
                                        $x += 1
                                EndIf
                        Next
                Case $But1
                        $sText = ''
                        For $i = 0 To UBound($aSitem) - 1
                                If _GUICtrlTreeView_GetChecked($TreeView1, $aSitem[$i]) Then
                                        $sText &= '被选项目句柄:' & $aSitem[$i] & '   ' & '项目文本:' & $aSitem[$i] & @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, '' & $aLines[$i])
                _GUICtrlListBox_SetCurSel($List1, $i)
        Next
        MsgBox(0, '', '安装完成!')
EndFunc   ;==>begin

131738 发表于 2010-5-26 23:36:49

本帖最后由 131738 于 2010-5-26 23:38 编辑

回复 1# chenronting


    是否用了 $LBS_SORT      $LBS_STANDARD 。。。。。。。。。。

pusofalse 发表于 2010-5-27 02:33:52

回复 2# 水木子

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

这两个循环和其中的判断没有意义啊,为何要这样写?而且还浪费效率。

newuser 发表于 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]
P版是指的这句判断吗?这句判断是有用的啊!当初我也认为是多余的,谁知道去掉以后出现项目无法勾选的情况。(点击项目完全没反应勾不上)

pusofalse 发表于 2010-5-27 11:53:15

回复 6# 水木子


    不只是判断,两个for循环也是多余的。$nMsg就是$aFitem[$i]啊,你对$aFitem[$i]进行操作,实际不就是对$nMsg操作吗?$nMsg总是在aFitem 、$aFitem, $aSitem 、$aSitem之间的,Switch $nMsg不是判断$nMsg的范围的吗。

zhouning 发表于 2010-5-27 13:22:39

不只是判断,两个for循环也是多余的。

qq342252004 发表于 2010-5-27 14:33:42

不只是判断,两个for循环也是多余的。
zhouning 发表于 2010-5-27 13:22 http://www.autoitx.com/images/common/back.gif

你有什么高招?

chenronting 发表于 2010-5-27 14:55:33

回复 3# 131738

请问你这个是对LIST 而言吗.. 我对LIST 没加样式 .,
而你说的这两个我都没加.
是要加上这两个吗. 要加在哪里 .?

chenronting 发表于 2010-5-27 14:56:37

回复 5# newuser


    水木子. 发的.就是源码 .:face (28):

131738 发表于 2010-5-27 21:28:33

回复 10# chenronting

帮助说这两个样式有排序作用。。。。

水木子 发表于 2010-5-31 00:12:25

本帖最后由 水木子 于 2010-5-31 08:34 编辑

非常感谢P版的指点,我重新修改了2楼的代码,并添加了“模拟安装”,希望的代码之前没有误导大家。

hao1926 发表于 2010-5-31 19:53:02

水木子的代码很好,谢谢。

yejier1983 发表于 2010-6-1 22:21:32

新手,跟着学习学习
页: [1] 2
查看完整版本: 关于 GUICtrlCreateList 中文字的自动排序功能