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

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

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

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

发新话题 回复该主题

[13教程进阶篇]3.我该如何记录用户数据 [复制链接]

1#

我该如何记录用户数据


您所在的用户组无法下载或查看附件



使用按键精灵写出一个脚本,无论是几十行的脚本还是上万行的脚本,他们都离不开两个东西,甚至说只有这两样东西----数据与数据操作方式(逻辑),后者为前者服务,可见数据才是一个脚本的重中之重,那么问题来了?我们该如果去记录使用他呢?

您所在的用户组无法下载或查看附件



按键中定义数据的方式有两种:

1. Dim

作为使用频率最高的命令之一,我们定义数据基本都是使用Dim,在函数外使用则为全局变量,在函数内使用则为局部变量。

2. Thread.SetShareVar

线程共享变量,采用key-value的方式记录的数据,可以在线程间共享。


直观上来说我们可以挑选喜好的使用,但是实际上并不是如此,我们使用Dim在函数外定义的变量,在多线程中是无法使用的,也就是说Dim定义的实际上是线程的全局变量,而Thread.SetShareVar定义的是脚本的全局变量,但是Thread.SetShareVar在函数内使用依旧属于全局。因此,我们有个最好的选择,定义全局变量使用Thread.SetShareVar,而在函数内部则使用Dim来定义。


明白了这两个的含义后,我们再来分析一下用户的数据记录,显而易见,用户数据在整个脚本中,我们需要使用的只有一份,因此,需要使用Thread.SetShareVar来定义。


明白了定义数据的方法及原因后,我们该定义什么样子的数据呢?是否是类似第一篇教程http://bbs.anjian.com/showtopic-630414-1.aspx中的方式呢?
  1. setGlobalData "IsA", ReadUIConfig("任务A")
  2. setGlobalData "IsB", ReadUIConfig("任务B")
  3. setGlobalData "IsC", ReadUIConfig("任务C")

  4. setGlobalData "UserIsA", false
  5. setGlobalData "UserIsB", false
  6. setGlobalData "UserIsC", false
复制代码

为每个数据单独的起一个key,也就是变量名。虽然是可行的,但是试想一下,一个完善的脚本,含有的数据是很庞大的,这样的方式使用到后面,自己都容易混乱,因此这种方式不能算是一种好的方法(打自己脸都打肿了→_→)


既然要让数据能够方便认知并且操作方便,那么肯定是使用复合数据结构,我们的第一个想法:数组。如上面的代码,我们可以这样写:

  1. Dim 用户勾选 = Array(true,true,true)
  2. setGlobalData "用户勾选", 用户勾选

  3. Dim 实际情况 = Array(false,false,false)
  4. setGlobalData "实际情况", 实际情况
复制代码
然而这种方式,要读取需要根据数组下标,当然我们可以再创建一个数组来定义下标,但是这样等于又复杂化了,并且,当我们的任务不仅含有是否完成的情况,还有时间等数据,那么简单的数组已经无法完成我们的需求了,那么我们有更好的选择吗?当然是有的!那就是table

您所在的用户组无法下载或查看附件


我们在命令大全中找到相关的命令(隐藏的很深啊!),找到如上图的命令,并找到table的使用方式,一个table中包含一个个的key-value值,那么我们就可以建立类似“任务A-未完成这样的关系,并且value值本身也可以是一个table类型,那么这就可以完美的记录用户的数据:

  1. Dim userinfo=_
  2. {"账号1":{_
  3. "任务A":_
  4. {"完成":false,"时间":"15:00"},_
  5. "任务B":false},_
  6. "账号2":{_
  7. "任务A":_
  8. {"完成":false,"时间":"14:00"},_
  9. "任务B":false,_
  10. "任务C":false}_
  11. }
复制代码
使用“_”来进行分行,让我们的结构呈现树状图更加易懂,并且可以根据key直接访问内容,方便的不要不要的,相信有一定lua基础的同学一定对于这个相当熟悉,并且习惯性的使用“userinfo.账号1.任务A.时间”这样的方式去读取内容,然而可惜的是,按键并不提供这样的读取方式,那么,我们自己整合出类似的功能(当然没有lua中这么方便),直接看代码:
  1. Dim userinfo=_
  2. {"账号1":{_
  3. "任务A":_
  4. {"完成":false,"时间":"15:00"},_
  5. "任务B":false},_
  6. "账号2":{_
  7. "任务A":_
  8. {"完成":false,"时间":"14:00"},_
  9. "任务B":false,_
  10. "任务C":false}_
  11. }
  12. Dim arr=Array("账号1","任务A","时间")

  13. TracePrint readtable(userinfo,arr)
  14. updatatable(userinfo,arr,"15:05")
  15. TracePrint readtable(userinfo,arr)


  16. Function readtable(table, arr)
  17. Dim tablelen = UBound(arr)
  18. If tablelen = 0 Then
  19. readtable = table[arr(0)]
  20. Else
  21. Dim arr1 =Array()
  22. For i= 0 to tablelen-1
  23. arr1(i) = arr(i+1)
  24. Next
  25. readtable = readtable(table[arr(0)], arr1)
  26. End If
  27. End Function

  28. Function updatatable(table, arr,value)
  29. Dim tablelen = UBound(arr)
  30. If tablelen = 0 Then
  31. table[arr(0)] = value
  32. Else
  33. Dim arr1 =Array()
  34. For i= 0 to tablelen-1
  35. arr1(i) = arr(i+1)
  36. Next
  37. updatatable = updatatable(table[arr(0)], arr1,value)
  38. End If
  39. End Function
复制代码

主要是读取和修改两个函数,其中table是原始表,arr是查询key的数组,value是要修改的值。函数中由于table的层数未知,因此我们采用递归来实现。(table表的使用会越来越完善,下个版本就能直接使用而不需要自己编写方法,但是根据这个学会递归的用法才是重点!)

这样我们就完成了一个良好的数据规范,当用户完成相关情况时就往表中写入内容。配合上任务管理机制,让我们的脚本更加完美!想学习更多吗!请关注本系列教程!


您所在的用户组无法下载或查看附件


    已有1评分我要评分查看所有评分

    本主题由 超级版主 瑞祥幽冥狼 于 2023/10/16 22:48:08 执行 审核帖子 操作
    2#

    学习中,,,

    3#

    该用户帖子内容已被屏蔽

    庚辰插件专区   
    网页自动填表就用庚辰插件
    4#

    123455123

    5#

    6666666666666666666

    6#

    Thanks for sharing !

    7#

    我来学习了

    8#

    根本俄突突突突突突头天躺v

    9#

    asdsadsdd

    10#

    少打个电话好好干吧

    11#

    666666666

    12#

    学习学习心得

    13#

    谢谢分享。。。

    14#

    阿斯发个

    15#

    丩妈说了

    16#


    17#

    用文本乱码

    18#

    1111111111111

    19#

    更加牛逼了

    20#


    发新话题 回复该主题