我该如何记录用户数据
- 您所在的用户组无法下载或查看附件
使用按键精灵写出一个脚本,无论是几十行的脚本还是上万行的脚本,他们都离不开两个东西,甚至说只有这两样东西----数据与数据操作方式(逻辑),后者为前者服务,可见数据才是一个脚本的重中之重,那么问题来了?我们该如果去记录使用他呢?
- 您所在的用户组无法下载或查看附件
按键中定义数据的方式有两种:
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中的方式呢?- setGlobalData "IsA", ReadUIConfig("任务A")
- setGlobalData "IsB", ReadUIConfig("任务B")
- setGlobalData "IsC", ReadUIConfig("任务C")
-
- setGlobalData "UserIsA", false
- setGlobalData "UserIsB", false
- setGlobalData "UserIsC", false
复制代码为每个数据单独的起一个key,也就是变量名。虽然是可行的,但是试想一下,一个完善的脚本,含有的数据是很庞大的,这样的方式使用到后面,自己都容易混乱,因此这种方式不能算是一种好的方法(打自己脸都打肿了→_→)。
既然要让数据能够方便认知并且操作方便,那么肯定是使用复合数据结构,我们的第一个想法:数组。如上面的代码,我们可以这样写:
- Dim 用户勾选 = Array(true,true,true)
- setGlobalData "用户勾选", 用户勾选
- Dim 实际情况 = Array(false,false,false)
- setGlobalData "实际情况", 实际情况
复制代码 然而这种方式,要读取需要根据数组下标,当然我们可以再创建一个数组来定义下标,但是这样等于又复杂化了,并且,当我们的任务不仅含有是否完成的情况,还有时间等数据,那么简单的数组已经无法完成我们的需求了,那么我们有更好的选择吗?当然是有的!那就是table。- 您所在的用户组无法下载或查看附件
我们在命令大全中找到相关的命令(隐藏的很深啊!),找到如上图的命令,并找到table的使用方式,一个table中包含一个个的key-value值,那么我们就可以建立类似“任务A-未完成”这样的关系,并且value值本身也可以是一个table类型,那么这就可以完美的记录用户的数据:
- Dim userinfo=_
- {"账号1":{_
- "任务A":_
- {"完成":false,"时间":"15:00"},_
- "任务B":false},_
- "账号2":{_
- "任务A":_
- {"完成":false,"时间":"14:00"},_
- "任务B":false,_
- "任务C":false}_
- }
复制代码 使用“_”来进行分行,让我们的结构呈现树状图更加易懂,并且可以根据key直接访问内容,方便的不要不要的,相信有一定lua基础的同学一定对于这个相当熟悉,并且习惯性的使用“userinfo.账号1.任务A.时间”这样的方式去读取内容,然而可惜的是,按键并不提供这样的读取方式,那么,我们自己整合出类似的功能(当然没有lua中这么方便),直接看代码:- Dim userinfo=_
- {"账号1":{_
- "任务A":_
- {"完成":false,"时间":"15:00"},_
- "任务B":false},_
- "账号2":{_
- "任务A":_
- {"完成":false,"时间":"14:00"},_
- "任务B":false,_
- "任务C":false}_
- }
- Dim arr=Array("账号1","任务A","时间")
- TracePrint readtable(userinfo,arr)
- updatatable(userinfo,arr,"15:05")
- TracePrint readtable(userinfo,arr)
- Function readtable(table, arr)
- Dim tablelen = UBound(arr)
- If tablelen = 0 Then
- readtable = table[arr(0)]
- Else
- Dim arr1 =Array()
- For i= 0 to tablelen-1
- arr1(i) = arr(i+1)
- Next
- readtable = readtable(table[arr(0)], arr1)
- End If
- End Function
- Function updatatable(table, arr,value)
- Dim tablelen = UBound(arr)
- If tablelen = 0 Then
- table[arr(0)] = value
- Else
- Dim arr1 =Array()
- For i= 0 to tablelen-1
- arr1(i) = arr(i+1)
- Next
- updatatable = updatatable(table[arr(0)], arr1,value)
- End If
- End Function
复制代码主要是读取和修改两个函数,其中table是原始表,arr是查询key的数组,value是要修改的值。函数中由于table的层数未知,因此我们采用递归来实现。(table表的使用会越来越完善,下个版本就能直接使用而不需要自己编写方法,但是根据这个学会递归的用法才是重点!)
这样我们就完成了一个良好的数据规范,当用户完成相关情况时就往表中写入内容。配合上任务管理机制,让我们的脚本更加完美!想学习更多吗!请关注本系列教程!
- 您所在的用户组无法下载或查看附件