关于 GUICtrlCreateList 中文字的自动排序功能
本帖最后由 chenronting 于 2010-6-1 22:28 编辑不知道大家有没有发现. 用 guictrlsetdata 往 list 里写入数据. 会自动排序 .
而我不想要这个自动排序的功能要怎么做呢.
我这里上个图吧.
看右边.
如果只是 9个. 那么就正常的. 10 个的话. 开头是 10的. 就会自动跑第二个去了.
不知道 list有没有什么样式能控制这种自动排序功能的.
晚安 .!
:face (16):
还是水木子大哥。 厉害 。。相当的!~ 本帖最后由 水木子 于 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:38 编辑
回复 1# chenronting
是否用了 $LBS_SORT $LBS_STANDARD 。。。。。。。。。。 回复 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
这两个循环和其中的判断没有意义啊,为何要这样写?而且还浪费效率。 回复 1# chenronting
可否提供源码? 本帖最后由 水木子 于 2010-5-27 08:44 编辑
回复 4# pusofalse
If $nMsg = $aFiterm[$i]
P版是指的这句判断吗?这句判断是有用的啊!当初我也认为是多余的,谁知道去掉以后出现项目无法勾选的情况。(点击项目完全没反应勾不上) 回复 6# 水木子
不只是判断,两个for循环也是多余的。$nMsg就是$aFitem[$i]啊,你对$aFitem[$i]进行操作,实际不就是对$nMsg操作吗?$nMsg总是在aFitem 、$aFitem, $aSitem 、$aSitem之间的,Switch $nMsg不是判断$nMsg的范围的吗。 不只是判断,两个for循环也是多余的。 不只是判断,两个for循环也是多余的。
zhouning 发表于 2010-5-27 13:22 http://www.autoitx.com/images/common/back.gif
你有什么高招? 回复 3# 131738
请问你这个是对LIST 而言吗.. 我对LIST 没加样式 .,
而你说的这两个我都没加.
是要加上这两个吗. 要加在哪里 .? 回复 5# newuser
水木子. 发的.就是源码 .:face (28): 回复 10# chenronting
帮助说这两个样式有排序作用。。。。 本帖最后由 水木子 于 2010-5-31 08:34 编辑
非常感谢P版的指点,我重新修改了2楼的代码,并添加了“模拟安装”,希望的代码之前没有误导大家。 水木子的代码很好,谢谢。 新手,跟着学习学习
页:
[1]
2