最近做了小工具,太依赖listview了,况且数据量不小,需要有查询功能,现在搞定了,分享给大家。
/* 方法1,从现有listview数据中,获取全部数据,然后关键词匹配,筛选出结果,然后在新的listview中展示,并隐藏之前的表格。 问题:太依赖listview这个功能,多个切换使用不畅,不要这么麻烦。 备注:一般情况下,足够用了,足够了。 */ Gui, +AlwaysonTop Gui, Font, s10, Verdana Gui, Add, Text, x20 y15, 输入关键词 Gui, Add, Edit, x160 y12 w205 vInputSearch gInputGo, ; 给input添加一个标签,是为了让每一个输入,都能触发这个标签。 Gui, Add, ListView,grid x12 y47 r15 w600 -LV0x10 vMyList, 默认 Gui, Add, ListView,grid x12 y47 r15 w600 -LV0x10 vych ,搜索结果 Gui, Show, ,Window gosub,展示默认 gosub,初始化数据 Return InputGo: Gui, Submit, NoHide if (InputSearch=""){ gosub,展示默认 return } else gosub,InputSearch return InputSearch: Gui, 1:Default ;设定GUI1为默认GUI Gui,ListView,MyList ;设定MyList为默认listview Search_Results = ;初始化一个变量 Loop % LV_GetCount() ;LV_GetCount() 是Listview中具有条目的行数,循环次数 { LV_GetText(Site, A_Index) ;利用循环,获取每一行第一列数据。 If InStr(Site, InputSearch) ; 用输入关键词匹配listview内容,没有数字,则默认取第一列 { ;如果匹配成功,则 LV_GetText(Address, A_Index, 2) ; 从该行获取其余数据,这里是第二列 LV_GetText(Date, A_Index, 3) ;从该行获取其余数据,这里是第三列 Search_Results .= Site . "|" . Address . "|" . Date . "`n" ; 将收集的数据构建到变量中。 } } ; 如果省略此参数, 则删除 ListView 中所有行. 否则, 仅删除指定 RowNumber 所在的行. 成功时返回 1 而失败时返回 0. Gui, ListView, ych ;设定ych为默认listview LV_Delete() ;清空listview数据 Loop, Parse, Search_Results, `n ;使用`n解析结果,因此每个A_Loopfield将包含一行的站点,地址和日期 { If !A_LoopField ; 忽略空数据 { continue } StringSplit, Result, A_LoopField, | ; 将数据行组成一个'数组' LV_Add("", Result1, Result2, Result3) ; 把数据添加到新的listview中 } gosub,展示搜索结果 return 初始化数据: Gui,ListView,MyList LV_Delete() url=%A_ScriptDir%\测试原型.ini ;要注意路径和文本名称 IniRead,key_all,%url%,默认 ;因为我使用的是ini,所以需要带上区块名称 key_array :=StrSplit(key_all,"`n") ;将多行字符串分解为数组 for i,j in key_array{ LV_Add("",j) } return 展示默认: Control,Hide,,SysListView322,Window Control,Show,,SysListView321,Window return 展示搜索结果: Control,Show,,SysListView322,Window Control,Hide,,SysListView321,Window return f5::Reload 以下仅展示ini文件中的内容 [默认] 4 警方通报扔车执法 新闻 视频 图片 5452676 5 李现发文怼私生饭 新闻 视频 图片 5167966 6 央视批评周琦 新闻 视频 图片 5046785 7 华为愿出售5G技术 新闻 视频 图片 4571066 8 蒙牛收购贝拉米 新闻 视频 图片 4055547 以上,方法1介绍完成
方法1一般情况够用了,但是我的工具里有多个listview,这样一个show一个hide,太麻烦了。
以下介绍方法2
url=%A_ScriptDir%\测试原型.ini IniRead, excelall, %url%,默认 excelall:=StrSplit(excelall,"`n") #SingleInstance Force #NoEnv SetWorkingDir %A_ScriptDir% SetBatchLines -1 Gui Add, Edit, x512 y32 w92 h21 gInputSearch vInputSearch Gui Add, Tab3, x0 y0 w491 h406, 面板1 Gui Tab, 1 Gui Add, ListView, x0 y24 w484 h372 +LV0x4000 v表格1, 关键词|权重|账号|密码 Gui Tab Gui Show, w620 h420, Window gosub,数据初始化 Return f5::Reload GuiEscape: GuiClose: ExitApp 数据初始化: Gui,Tab,1 Gui,ListView,表格1 for i,j in excelall LV_Add("", j) LV_ModifyCol( ) ;为空,那么列宽自动调整 return InputSearch: Gui,Submit,NoHide Gui,Tab,1 Gui,ListView,表格1 LV_Delete() Search_Results = loop,% excelall.length(){ If InStr(excelall[A_Index],InputSearch) { LV_Add("", excelall[A_Index]) } } LV_ModifyCol( ) ;为空,那么列宽自动调整 return
方法1和方法2的区别
方法1的好处在于,不需要每次加载数据,因为元数据已经加载好,只是隐藏了。与此相对的,方法2的坏处,就是删除关键词后,默认数据需要重新加载。
方法2的好处在于,逻辑简单,易上手。
其实二者可以结合,留给你的作业吧。
😀
方法2效率高。方法1我搜索速度大约只有方法2的1/10.也就是耗时长10倍
确实效率会有区别。之前是做的账号密码小工具,所以量非常小,也就用不出差别来了。