[教程]GUI使用了listview,如何做搜索功能?两个demo

最近做了小工具,太依赖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的好处在于,逻辑简单,易上手。

其实二者可以结合,留给你的作业吧。

给TA捐赠
共{{data.count}}人
人已捐赠
其他案例

西路狂想曲|关于WM_QUERYENDSESSION与WM_ENDSESSION对于win7的关机的一些看法

2019-9-14 1:28:07

其他

【需求】做一个鼠标光标移左左键按下 按鼠标光标移右 右键按下

2019-9-17 23:25:25

3 条回复 A文章作者 M管理员
  1. AHK中文社区

    😀

  2. 孤独求败

    方法2效率高。方法1我搜索速度大约只有方法2的1/10.也就是耗时长10倍

    • 悠然生活

      确实效率会有区别。之前是做的账号密码小工具,所以量非常小,也就用不出差别来了。

个人中心
购物车
优惠劵
有新私信 私信列表
搜索