• 新浪微博:
  • 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:03-18

按键精灵安卓版
立即下载

软件版本:3.6.5
软件大小:46.2M
更新时间:03-02

按键精灵iOS版
立即下载

软件版本:1.7.6
软件大小:29.2M
更新时间:12-06

最新企业版UiBot
立即下载

软件版本:3.3
软件大小:282M
更新时间:08-06

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

[郭立员] [3分钟学堂]下拉框的选项也可以搜索了 [复制链接]

1#

大家好,我是郭立员,前两天在群里看到这么一个问题感觉挺有意思的,拿出来和大家分享一下,问题是这样的,看下图:



下拉框里面有100多个选项,一个个去找想点的选项很麻烦,想做个搜索功能


我在看到这个问题的时候,第一感觉是不难,而后一想又发现有些难度。


先来看看做好的效果:(源码在文章最底部)



下面我来说一下我的思路过程:思考过程可能会有些绕,如果有“懵逼”情况,请多看几遍


第一步思考:先完成从多个内容中搜索某一个的功能。


假设把所有内容都放入数组中,然后通过循环遍历所有内容,之后逐一比对,确定第几个是我们要搜索的内容。

  1. Dim arr=array("点赞","留言","评论","私信","回复")
  2. Dim key="留言"
  3. For i = 0 To UBOUND(arr)
  4. If arr(i) = key Then
  5. TracePrint "第"&i+1&"位置找到"
  6. Exit for
  7. End If
  8. If i = UBOUND(arr) Then
  9. TracePrint "没有找到"
  10. End If
  11. Next
复制代码

第二步思考,优化一下判断部分,第一步中的搜索是精准匹配,我们通常的搜索都是模糊匹配,判断条件使用查找命令代替等于即可,优化后是这样的。

  1. Dim arr=array("点赞","留言","评论","私信","回复")
  2. Dim key="留言"
  3. For i = 0 To UBOUND(arr)
  4. If instr(1,arr(i),key)>0 Then
  5. TracePrint "第"&i+1&"位置找到"
  6. Exit for
  7. End If
  8. If i = UBOUND(arr) Then
  9. TracePrint "没有找到"
  10. End If
  11. Next
复制代码

第三步思考:搜索可能不止有一个满足条件的选项,那这种情况,我们在平时都是点一下按钮,往后搜索一个,直到搜索完。


这步的难点是每一次运行(点击)之间是有联系的,第2运行的搜索起始位置,是第1次运行的结束位置,第3次是从第2次结束位置开始,以此类推……


一模一样的代码,每次点运行却有不同的结果,是不是有点头疼了。


每次运行的不同点在哪里?


起始位置!!!


那么我们把这个位置信息用一个东西存储起来。存东西第一个想到是啥?


变量,这里明显不行,只要重新运行代码,变量就会重置。


什么存储不会重置,配置文件对吧,那么我们用一个文本当做配置文件。


  1. Dim arr=array("点赞","留言","评论","私信","回复","文章留言")
  2. Dim key="留言"
  3. Dim number=file.read("/sdcard/pictures/config.txt")
  4. For i = number To UBOUND(arr)
  5. If instr(1,arr(i),key)>0 Then
  6. TracePrint "第"&i+1&"位置找到"
  7. file.Write ("/sdcard/pictures/config.txt",i+1)
  8. Exit for
  9. End If
  10. If i = UBOUND(arr) Then
  11. TracePrint "没有找到"
  12. End If
  13. Next
复制代码

把文本记录加入进去了,每次获得的位置结果+1,当做下一次的起始位置,+1的目的是为了上步结尾和下步开始错开一个查找位置。


这种写法,又出现bug了,就是如果搜索到的结果是数组的最后一个内容,那么就根本不进入循环。


for i=6 to 5

就像这种写法,当i的值大于了to后面的值,for循环根本不会执,因为超出了循环范围。


回到我说的bug,因为+1的存在,如果搜索结果i的位置是最后一个,那么+1以后就会超出范围了。


解决办法,给记录文本读取的内容单独加个判断,如果已经大于数组里面内容的个数,那么直接输出查找完所有内容了,不用继续查了。

  1. Dim arr=array("点赞","留言","评论","私信","文章留言","回复")
  2. Dim key="留言"
  3. Dim number=file.read("/sdcard/pictures/config.txt")
  4. If cint(number) > UBOUND(arr) Then
  5. TracePrint "所有内容已经搜索完毕!"
  6. End If


  7. For i = number To UBOUND(arr)
  8. If instr(1,arr(i),key)>0 Then
  9. TracePrint "第"&i+1&"位置找到"
  10. file.Write ("/sdcard/pictures/config.txt",i+1)
  11. Exit for
  12. End If
  13. If i = UBOUND(arr) Then
  14. TracePrint "所有内容已经搜索完毕!"
  15. End If
  16. Next
复制代码

思考部分又来了,写到这一步,我又想到一个问题,记录文本咋清零?


清零我想到两种情况:


①搜索完毕了,直接把0写入达到记录文本

②更换搜索的关键词,这里就需要用一个文本记录关键词,搜索前查询关键词是否发生变化。


思考的差不多了,来解答最开始的问题:


下拉框里面有100多个选项,一个个去找想点的选项很麻烦,想做个搜索功能

分析一下:


打开脚本,把所有选项存入数组,按钮点一下,搜索一次,搜索到了就把选项在下拉框中显示。


这里面有个知识点,修改下拉框的初始选项的数字,就可以修改选项内容。



获取和修改界面元素的命令:

  1. 获取:uip.GetAttribute
  2. 修改:uip.SetAttribute
复制代码

最后我们直接上代码了:


【界面元素代码】

  1. 界面1:
  2. {
  3. 下拉框搜索:
  4. {
  5. 水平布局:
  6. {
  7. 输入框:
  8. {
  9. 注释:"初始文本、文字大小、最大输入长度、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
  10. 名称:"输入框1",
  11. 提示内容:" ",
  12. 初始文本:"",
  13. 仅输入数字:false,
  14. 文字大小:0,
  15. 最大输入长度:0,
  16. 高度:0,
  17. 宽度:0
  18. },
  19. 按钮:
  20. {
  21. 注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
  22. 名称:"按钮1",
  23. 显示内容:"搜索",
  24. 点击响应:"函数名1",
  25. 文字大小:0,
  26. 高度:0,
  27. 宽度:0
  28. },

  29. },
  30. 下拉框:
  31. {
  32. 注释:"初始选项是可选属性,默认值为0。模版中设置了三个选项,您可以根据需要增加或减少,注意各选项之间用逗号分隔。",
  33. 名称:"下拉框1",
  34. 选择响应:"函数名2",
  35. 选项:
  36. [
  37. "点赞",
  38. "留言",
  39. "评论",
  40. "私信",
  41. "文章留言",
  42. "回复"
  43. ],
  44. 初始选项:0
  45. },
  46. },


  47. }
复制代码

【界面函数代码】

  1. Function 函数名1()
  2. Dim key=uip.GetAttribute("输入框1")
  3. Dim keyword=file.read("/sdcard/pictures/keyword.txt")
  4. If Len(keyword) = 0 Then
  5. file.write("/sdcard/pictures/keyword.txt","")
  6. End If
  7. If keyword <> key["初始文本"] Then
  8. file.Write ("/sdcard/pictures/config.txt", 0)
  9. End If
  10. Dim m=uip.GetAttribute("下拉框1")
  11. Dim arr=m["选项"]
  12. Dim number=file.read("/sdcard/pictures/config.txt")
  13. If cint(number) > UBOUND(arr) Then
  14. ShowMessage "所有内容已经搜索完毕!"
  15. file.Write ("/sdcard/pictures/config.txt", 0)
  16. End If
  17. For i = number To UBOUND(arr)
  18. If InStr(1, arr(i), key["初始文本"]) > 0 Then
  19. file.Write "/sdcard/pictures/config.txt", i + 1
  20. file.write("/sdcard/pictures/keyword.txt", key["初始文本"])
  21. ShowMessage "第" & i + 1 & "位置找到["&key["初始文本"]&"]"
  22. uip.SetAttribute("下拉框1",{"初始选项":i})
  23. Exit for
  24. End If
  25. If i = UBOUND(arr) Then
  26. ShowMessage "所有内容已经搜索完毕!"
  27. file.Write ("/sdcard/pictures/config.txt", 0)
  28. End If
  29. Next
  30. End Function
复制代码

今天分享的内容就这些了,大家可以去试试了,如果觉得本期文章还行,记得点赞、分享、留言


最后编辑郭立员 最后编辑于 2022-06-30 09:24:31
扫码免费获取我的基础教程【视频教程】
扫码下方二维码关注我的公众号:3分钟学堂

QQ交流群:936858410
发新话题 回复该主题