找回密码
 加入
搜索
楼主: 夜猫猫

[网络通信] 卡壳了,不得不发贴,判断ListView项目复选框是否选中?(解决)

 火.. [复制链接]
发表于 2011-7-23 13:32:41 | 显示全部楼层
回复 30# netegg
_RecFileListToArray这个函数的行数较多.
但提供了搜索,按层级搜索,搜索特定扩展名,搜索过滤关键字.
返回文件名,返回相对于搜索路径的文件名,包含完整路径的文件名.
发表于 2011-7-23 13:55:40 | 显示全部楼层
回复 31# 3mile

嗯,看了,可自定义的地方基本都包括到了
 楼主| 发表于 2011-7-23 17:25:33 | 显示全部楼层
本帖最后由 夜猫猫 于 2011-7-23 17:37 编辑

INI判断使用整理?边写边判断能行吗?

不用4百行,搜索目录第几层,定义扩展名.搜索文件全名.

本帖子中包含更多资源

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

×
发表于 2011-7-23 21:47:04 | 显示全部楼层
本帖最后由 netegg 于 2011-7-23 21:50 编辑

回复 33# 夜猫猫
算了,你这哪是做目录呀,整个是在创建一个小型搜索引擎.
如果要满足这个要求,你最好做个全盘目录索引,然后直接从里面挑,还来得快些
 楼主| 发表于 2011-7-23 22:29:59 | 显示全部楼层
本帖最后由 夜猫猫 于 2011-7-23 23:03 编辑

哈哈..你才知道啊.本来是想给游戏菜单添加个搜索功能的,原来就一点点想法,谁知道越讨论.搞的越大..33楼的已经能使用了...就是搜索输出问题没解决,
按3mile 的INI整理方法,感觉不理想.

比如搜索到
[QQ三国]
执行程序 =G:\网络游戏\QQ三国\QQSG.exe
[QQ飞车]
执行程序 =G:\网络游戏\QQ飞车\QQSpeedLauncher.exe
[倩女幽魂]
执行程序 =G:\网络游戏\倩女幽魂\Launcher.exe
[穿越火线]
执行程序 =G:\网络游戏\穿越火线\Login.exe
而INI里面已经有
[QQ三国]
执行程序 =G:\网络游戏\QQ三国\QQSG.exe
怎么跳过这则信息.继续添加下面的
[QQ飞车]
执行程序 =G:\网络游戏\QQ飞车\QQSpeedLauncher.exe
[倩女幽魂]
执行程序 =G:\网络游戏\倩女幽魂\Launcher.exe
[穿越火线]
执行程序 =G:\网络游戏\穿越火线\Login.exe

我的

Local $jg =""
      For $i = 0 To _GUICtrlListView_GetItemCount($ListView)
        $P=IniReadSectionNames(@ScriptDir&"\LOGO.ini")
        $M=_GUICtrlListView_GetItemText($ListView, $i, 1)
        $N=_GUICtrlListView_GetItemText($ListView, $i, 2)
                        
             If _GUICtrlListView_GetItemChecked(GUICtrlGetHandle($ListView), $i) = $GUI_CHECKED Then
                 If StringInStr($M, $P) Then 
                       ContinueLoop
                  Else 
                                      $jg &=  "["&$M &"]"& @CRLF&"执行程序 ="& $N& @CRLF
                   EndIf
        EndIf
        Next                                            
        FileWrite(@ScriptDir&"\LOGO.ini", $jg)
       MsgBox(16,"","添加完成 !")


刚才搞错了.输出的INI有问题.修改了下.但是还是会重复加入,不会判断.

怎么设置递加? 就是判断两个值一致的时候,往当前的数值加一
 楼主| 发表于 2011-7-23 23:21:36 | 显示全部楼层
这循环判断那出错了? INI文件有几项.就重复几次..

Local $jg =""
      For $i = 0 To _GUICtrlListView_GetItemCount($ListView)
        $P=IniReadSectionNames(@ScriptDir&"\LOGO.ini")
        $M=_GUICtrlListView_GetItemText($ListView, $i, 1)
        $N=_GUICtrlListView_GetItemText($ListView, $i, 2)
                        
             If _GUICtrlListView_GetItemChecked(GUICtrlGetHandle($ListView), $i) = $GUI_CHECKED Then

                  For $ii = 1 To $P[0]
                                                
                                  
                        If StringInStr($P, $M) Then 
                                                        ContinueLoop
                                               
                                         Else 
                          $jg &= '第 ' & $I & ' 行:"' & _GUICtrlListView_GetItemText($ListView, $i, 1) & $P & '" 已勾选' & @CRLF
                                       EndIf
                                  Next
        EndIf
        Next  
      MsgBox(0, '勾选的项目',  $jg)
发表于 2011-7-23 23:34:52 | 显示全部楼层
回复 36# 夜猫猫
首先你要搞清楚filewrite(fileread)是可以写入(或读出)重复的数据,但iniwrite(iniread)是不可以写入重复的字段或关键字的.
发表于 2011-7-24 02:23:14 | 显示全部楼层
本帖最后由 netegg 于 2011-7-24 02:25 编辑

楼主直接做个sqlite然后直接输出算了,有没有重复项让数据库自己去整
 楼主| 发表于 2011-7-24 02:34:54 | 显示全部楼层
本帖最后由 夜猫猫 于 2011-7-24 02:36 编辑

处理INI写入用了个笨办法,先输出一个临时的.再与INI对比写入
51新炫舞=G:\网络游戏\51新炫舞\01\Setup.exe
取=号右边 与右边数据 .使用什么函数? String的函数好象都不可以
正则?
如何取?
发表于 2011-7-24 03:05:39 | 显示全部楼层
回复 39# 夜猫猫

文件对比更慢
 楼主| 发表于 2011-7-24 03:45:18 | 显示全部楼层
搞定!收工....

Dim $a,$b,$var1[1]
$var = "穿越火线=G:\网络游戏\穿越火线\Login.exe"
$sr=StringRegExp($var, '([^\→]*)\=(.+?)(?:\r\n|$)',1)
   If Not @error Then
         For $i = 0 To UBound($sr) - 1
        If $sr[$i] > ""  Then 
           $a = $sr[0]
           $b = $sr[1]
        EndIf
         Next
 EndIf
MsgBox(0, "字符是: ", $b )
 楼主| 发表于 2011-7-24 19:06:30 | 显示全部楼层
本帖最后由 夜猫猫 于 2011-7-24 19:20 编辑

汗..刚刚才看到,我这贴关键词居然是老婆??


我需要的最终配置表INI
========================
[配置]
XX=XX
XX=XX
[网络游戏]
XX=XX\XX\XXXXX
XX=XX\XX\XXX\XXXXX
[单机游戏]
XX=XX\XX\XXXXX
XX=XX\XX\XXX\XXXXX
=============================

下面的代码,基本都是论坛找的.只是想使用简单代码来做相应的事.3mile 大大的代码.对与我来说太长,太复杂了.看不懂

INI.选择输出的时候,会写入.但.没有选取的.INI文件里已经有的会被删除,写入新选取的.怎么从相应的字段尾行写入数据?清理相同的?
重新整理下.之前有测试时候留的垃圾

#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_Icon=..\..\..\WINDOWS\system32\SHELL32.dll|-23
#AutoIt3Wrapper_Res_Comment=文件搜索 BY 夜MaoMao
#AutoIt3Wrapper_Res_Description=文件搜索
#AutoIt3Wrapper_Res_FileVersion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=1.0.0.0
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#cs ------------------------------------
        脚本作者:夜MaoMao
        Email:yuko1176@126.com
        操作系统版本:Win SP2/ W7
        操作系统语言:GB2312
        autoit版本:.3.6.1-2
#ce ------------------------------------
;脚本开始

#include <file.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
#include <SendMessage.au3>

Local $arr, $num, $str
Local $chen
Global $icon, $CKBOXE_ID[1000], $CT1
Global $Ini=@ScriptDir & "\LOGO.ini"
$Skin_dll = @TempDir & "\Skin.dll"
$Skin_she = @TempDir & "\black.she"
FileInstall("Skin.dll", $Skin_dll)
FileInstall("black.she", $Skin_she)
Skin($Skin_dll, $Skin_she)
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("搜索文件", 564, 577, 192, 124)
$Label1 = GUICtrlCreateLabel("搜索路径:", 20, 42, 60, 20)
$Input1 = GUICtrlCreateInput("G:\网络游戏", 75, 37, 115, 20)
$Label2 = GUICtrlCreateLabel("搜索匹配:", 263, 42, 60, 20)
$Input2 = GUICtrlCreateInput("QQSG,Launcher,QQSpeedLauncher,Setup,Login", 318, 37, 133, 20)
$Label2 = GUICtrlCreateLabel("层数:", 470, 42, 60, 20)
$Combo1 = GUICtrlCreateCombo("1", 500, 37, 40, 20)
GUICtrlSetData(-1, "2|3|4|5|6", "1")


$LabelA1 = GUICtrlCreateLabel("总项目计数:", 63, 115, 120, 20)
$Button1 = GUICtrlCreateButton("浏览", 193, 35, 50, 25)
$Button2 = GUICtrlCreateButton("搜索", 232, 95, 97, 33)
$Button3 = GUICtrlCreateButton("(全选)", 132, 542, 60, 25)
$Button4 = GUICtrlCreateButton("(添加)", 332, 537, 60, 25)
$Label3 = GUICtrlCreateLabel("", 30, 70, 300, 20)
$Edit1 = GUICtrlCreateEdit("", 5, 440, 555, 100, $ES_AUTOVSCROLL + $WS_VSCROLL)
GUICtrlSetData($Edit1, FileRead($Ini))

$ListView = GUICtrlCreateListView(' 选择| 主文件夹名 |     文件路径', 5, 140, 555, 290)
_GUICtrlListView_SetExtendedListViewStyle($ListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_CHECKBOXES))
_GUICtrlListView_SetColumnWidth($ListView, 0, 61)
_GUICtrlListView_SetColumnWidth($ListView, 1, 100)
_GUICtrlListView_SetColumnWidth($ListView, 2, 355)

$LHand = GUICtrlGetHandle($ListView)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                        FileDelete($Skin_dll)
                        FileDelete($Skin_she)
                Case $Button1
                        $file = FileSelectFolder("选择文件夹.", "")
                        GUICtrlSetData($Input1, $file)
                Case $Button2
                        _SendMessage($LHand, $LVM_DELETEALLITEMS)
                        GUICtrlSetData($Label3,"正在搜索中....")
                        ct1()
                        $chen = GUICtrlRead($Combo1) + 1
                        _filelist(GUICtrlRead($Input1))
                        
                        If _GUICtrlListView_GetItemCount($ListView) = 0 Then
                                CCT1()
                                GUICtrlSetData($Label3,"没有找到任何文件,请确认路径/匹配/目录层是否有错!")
                                ct3()
                        ElseIf _GUICtrlListView_GetItemCount($ListView) > 0 Then
                                CCT1()
                                GUICtrlSetData($LabelA1, "搜索到: " & _GUICtrlListView_GetItemCount($ListView) & " 个文件")
                                ct2()
                                GUICtrlSetData($Label3,"搜索完成!")
                        EndIf
                Case $Button3
                        _GUICtrlListView_SetItemChecked($ListView, -1)

Case $Button4
        Local $jg = ""
                        Dim $a, $b
                        For $i = 0 To _GUICtrlListView_GetItemCount($ListView)
                                $M = _GUICtrlListView_GetItemText($ListView, $i, 1)
                                $N = _GUICtrlListView_GetItemText($ListView, $i, 2)

                                If _GUICtrlListView_GetItemChecked(GUICtrlGetHandle($ListView), $i) = $GUI_CHECKED Then
                                        $jg &= $M & "=" & $N & @CRLF
                                EndIf
                        Next
                $sr = StringRegExp($jg, '([^\→]*)\=(.+?)(?:\r\n|$)', 1) ;上面的$M $N 这里无法获取,只好在匹配下拆分出来,
                        If Not @error Then
                                For $i = 0 To UBound($sr) - 1
                                        If $sr[$i] > "" Then
                                                $a = $sr[0]
                                                $b = $sr[1]
                                        EndIf
                                Next
                        EndIf
                        $hSouce = IniReadSection($Ini, "网络游戏")
                        For $i = 1 To $hSouce[0][0]
                                If StringInStr($hSouce[$i][0], $a) Then ;对比关键字,匹配则跳出
                                        ContinueLoop
                                Else
                                        IniWriteSection($Ini, "网络游戏", $jg)
                                EndIf
                        Next

                        GUICtrlSetData($Edit1, FileRead($Ini))
                        MsgBox(32, "", "添加完成 !")
        EndSwitch
WEnd

;主程序
Func _filelist($searchdir)
        $search = FileFindFirstFile($searchdir & "\*.*") ;;;;查指定目录下的文件
        Local $sPathExclude = GUICtrlRead($Input2) ;搜索使用不排除的数值
        If $search = -1 Then Return -1 ;;;;如果找不到,返回值 -1
        While 1
                $file = FileFindNextFile($search) ;;;查找下一个文件
                If @error Then ;;;如果找不到文件
                        FileClose($search) ;;;则关闭此句柄
                        Return ;;;返回
                ElseIf $file = "." Or $file = ".." Then ;;如果找到的文件名为.或..则ContinueLoop
                ContinueLoop 
                ElseIf StringInStr(FileGetAttrib($searchdir & "\" & $file), "D") Then;;如果找到的是一个文件夹,则
                        $arr = StringRegExp($searchdir & "\" & $file, '\\', 3)
                        $num = UBound($arr)
                        If $num < $chen Then
                                _filelist($searchdir & "\" & $file) ;;递归调用filelist函数,并传参数
                        EndIf
                EndIf ;;;$file为查找到的文件夹名称,上一行意思就是进入此文件夹继续查找文件.如此循环
                
                $a_Arr = StringSplit($searchdir & "\" & $file, "\") ;拆分路径。判断输出文件夹名
                If UBound($a_Arr) = 2 Then
                        $FileNmae = $a_Arr[0]
                ElseIf UBound($a_Arr) = 3 Then
                        $FileNmae = $a_Arr[1]
                ElseIf UBound($a_Arr) = 4 Then
                        $FileNmae = $a_Arr[2]
                Else
                        $FileNmae = $a_Arr[3]
                EndIf
                
                If $sPathExclude And StringLen($sPathExclude) > 0 Then $sPathExclude = StringSplit($sPathExclude, ",");读取排除数值
                
                For $i = 1 To UBound($sPathExclude) - 1
                        $ext = "exe" ;扩展名
                        If StringRight($searchdir & "\" & $file, StringLen($ext)) = $ext And StringInStr($file, $sPathExclude[$i] & "." & $ext) And StringRight($file, StringLen($sPathExclude[$i] & "." & $ext)) = $file Then ;匹配对象输出并将数值显示在ListView
                                $CKBOXE_ID[$i] = GUICtrlCreateListViewItem("  |" & $FileNmae & '|' & $searchdir & "\" & $file, $ListView)
                                GUICtrlSetImage(-1, $searchdir & "\" & $file)
                                If StringInStr($file, '.EXE') Then $str &= $searchdir & "\" & $file & @CRLF;

                        EndIf
                Next
        WEnd
EndFunc  

;提示窗口
Func CCT1()
        GUIDelete($CT1)
EndFunc   
Func ct1()
        $CT1 = GUICreate("窗体1", 222, 88, 180, 220, 0x80880000, 0x00000040, $Form1)
        $Labe01 = GUICtrlCreateLabel("搜索中!请稍等...", 24, 32, 174, 24)
        GUICtrlSetFont(-1, 15, 400, 0, "黑体")
        GUICtrlSetColor(-1, 0xAA0000)
        GUISetState(@SW_SHOW)
        #EndRegion ### END Koda GUI section ###
        WinSetTrans($CT1, "", 200)
EndFunc   ;==>ct1

Func ct2()
        $CT2 = GUICreate("窗体1", 222, 88, 180, 220, 0x80880000, 0x00000040, $Form1)
        $Labe02 = GUICtrlCreateLabel(" 搜索完成 !", 50, 32, 174, 24)
        GUICtrlSetFont($Labe02, 15, 400, 0, "黑体")
        GUICtrlSetColor($Labe02, 0xFFAA00)
        GUISetState(@SW_SHOW)
        #EndRegion ### END Koda GUI section ###
        WinSetTrans($CT2, "", 200)
        While 1
                Sleep(1000)
                GUIDelete($CT2)
                ExitLoop
        WEnd
EndFunc   ;==>ct2

Func ct3()
        $CT3 = GUICreate("窗体1", 222, 88, 180, 220, 0x80880000, 0x00000040, $Form1)
        $Labe03 = GUICtrlCreateLabel("没有找到任何文件,请确认路径/匹配/目录层是否有错!", 7, 22, 220, 44)
        GUICtrlSetFont($Labe03, 12, 400, 0, "黑体")
        GUICtrlSetColor($Labe03, 0xFF00AA)
        GUISetState(@SW_SHOW)
        #EndRegion ### END Koda GUI section ###
        WinSetTrans($CT3, "", 200)
        While 1
                Sleep(2000)
                GUIDelete($CT3)
                ExitLoop
        WEnd
EndFunc   ;==>ct3

;皮肤
Func Skin($Skin_dll, $Skin_she)
        $Dll = DllOpen($Skin_dll)
        DllCall($Dll, "int", "SkinH_AttachEx", "str", $Skin_she, "str", "mhgd")
        DllCall($Dll, "int", "SkinH_SetAero", "int", 1)
EndFunc   ;==>Skin

本帖子中包含更多资源

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

×
发表于 2011-7-25 10:50:17 | 显示全部楼层
边学边写  不会就要问  加油
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-16 19:18 , Processed in 0.073990 second(s), 15 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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