13 数据记录控件
本章节详细描述数据记录控件在LUA中的应用,包含添加、插入、清除、偏移、获取记录数、读取记录、修改、删除、选择、导出等等功能,本例程中以一个成绩单为例子,如序号+名字+分数组成,如下所示,在画面ID0中添加数据记录控件ID4,其中配置为允许选择、显示序号、按钮控件ID5~ID14用于实现对应的功能、文本控件ID15用于显示对应的信息,如读取的记录、总记录数等
相关API函数如下所示,详细的形参说明,参考LUA 脚本API 接口
- 添加记录:record_add(screen,control,record)
- 插入记录:record_insert (screen,control,position,record)
- 清除记录:record_clear(screen,control)
- 涉及记录偏移:record_setoffset(screen,control,offset)
- 获取记录数:record_get_count(screen,control)
- 读取记录:record_read(screen,control,position)
- 修改记录:record_modify(screen,control, position ,record)
- 删除单条记录:record_delete(screen,control,position)
- 选择记录:record_select(screen,control,position)
- 导出记录:record_export(screen,control)
适用范围:M系列、W系列、X系列、F系列(固件版本 >= V4.2.401.0)
例程下载链接:《LUA - 数据记录控件应用》(点击跳转)
13.1 添加记录
画面配置
点击按钮控件ID5,弹出画面ID1,该画面用于文本键值输入添加的数据,如下所示
- 文本控件ID9:现在添加的序号
- 文本控件ID10:键盘输入姓名
- 文本控件ID11:键盘输入分数
- 按钮控件ID12:取消返回到主页
- 按钮控件ID13:添加到数据记录控件,并返回主页
LUA脚本
若是序号,可以用 $NUM 自动累加计算,LUA脚本如下所示
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
if control == 4 then
print("Lua_debug select -> "..math.ceil(value + 1).."th row")
cur_select_record = value
return 1
--添加记录
elseif control == 5 and value == 0
then
local cur_cnt = record_get_count(sc_home,4) + 1 --当前添加的序号
set_text(sc_add_record, 9, cur_cnt)
set_text(sc_add_record, 10, '')
set_text(sc_add_record, 11, '')
change_child_screen(sc_add_record) --切换到添加记录页面
......
elseif screen == sc_add_record
then
if control == 13 and value == 0
then
local add_name = get_text(sc_add_record, 10) --获取名字
local add_score = get_text(sc_add_record, 11) --获取分数
local cur_add_record = '$NUM;'..add_name..';'..add_score..';'
record_add(sc_home, 4, cur_add_record) --添加记录到数据记录控件
end
......
end
end
运行预览
用户点击“添加”,弹出输入框时,输入cp、100,点击回车,如下所示
13.2 插入记录
点击按钮控件ID6,弹出画面ID2,该画面用于文本键值输入插入的数据,如下所示
- 文本控件ID9:现在添加插入的行号(从0开始,0表示第一行)
- 文本控件ID10:键盘输入姓名
- 文本控件ID11:键盘输入分数
- 按钮控件ID12:取消返回到主页
- 按钮控件ID13:添加到数据记录控件,并返回主页
LUA脚本
插入数据到表格中,索引从0开始,LUA脚本如下所示
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
......
--插入记录
elseif control == 6 and value == 0
then
set_text(sc_insert_record, 9, '')
set_text(sc_insert_record, 10, '')
set_text(sc_insert_record, 11, '')
change_child_screen(sc_insert_record) --切换到插入记录页面
......
elseif screen == sc_insert_record
then
if control == 13 and value == 0
then
local cur_cnt = record_get_count(sc_home, 4)
local insert_sn = tonumber(get_text(sc_insert_record, 9)) --获取输入的行号
local insert_name = get_text(sc_insert_record, 10) --获取输入的名字
local insert_score = get_text(sc_insert_record, 11) --获取输入的分数
local cur_insert_record = '$NUM;'..insert_name..';'..insert_score..';' --拼接数据
--判断输入行号的合法性
if insert_sn < 0
then
insert_sn = 0
elseif insert_sn > cur_cnt
then
insert_sn = cur_cnt
end
record_insert (sc_home, 4, insert_sn, cur_insert_record)
end
......
end
end
运行预览
用户点击“插入”,弹出输入框时,输入1、yu、147,点击回车,如下所示
13.3 修改记录
画面配置
点击按钮控件ID7,弹出画面ID3,该画面用于修改记录,如下所示
- 文本控件ID11:显示现在要修改的行号
- 文本控件ID12:显示现在要修改的名字
- 文本控件ID13:显示现在要修改的分数
- 文本控件ID21:显示现在要修改的行号
- 文本控件ID22:文本键值输入要修改的名字
- 文本控件ID23:文本键值输入要修改的分数
- 按钮控件ID17:跳转到画面ID4,选择要修改的序号颜色值
- 按钮控件ID18:跳转到画面ID4,选择要修改的名字颜色值
- 按钮控件ID19:跳转到画面ID4,选择要修改的分数颜色值
LUA脚本
选中要修改的记录,触发数据记录控件ID4回调,即value为选中的行号。 修改记录时,需要将改记录读取出来,是以字符串形式存在,如第一行假设为“1 cp 100”,得到的结果为“$ NUM;cp;100;”,通过字符串分割,获取对应的数据和颜色,再进行修改,拼接成新的记录写入原数据记录控件中。LUA脚本如下所示
--split string
--@str :target string
--@pat :split token
--@return : tb
function my_split(str, pat)
local t = {}
local last_end = 0
local s, e = string.find(str, pat, 1) -- 第一个分割号的位置
while s
do
-- 找出分割符的前的参数
table.insert(t, string.sub(str, last_end + 1, last_end + s - last_end - 1))
last_end = e
s, e = string.find(str, pat, last_end + 1)
end
if last_end <= #str and last_end ~= 0 then
cap = string.sub(str, last_end + 1)
table.insert(t, cap)
end
return t
end
--检索颜色标识$CLR,分割并得出颜色值
function my_get_cur_record_color(cur_item)
local cur_color = false
local color_index = string.find(cur_item, "$CLR", 1)
if color_index ~= nil
then
cur_color = string.sub(cur_item, (color_index + 4), (color_index + 7))
end
return cur_color
end
--检索颜色标识$CLR,分割并得出数据
function my_get_cur_record_data(cur_item)
local data = cur_item
local index_sign1 = string.find(cur_item, "$CLR", 1)
if index_sign1 ~= nil
then
print("Lua_debug : 1th data -> "..data)
data = string.sub(cur_item, (index_sign1 + 9), string.len(cur_item))
end
print("Lua_debug : 2th data -> "..data)
return data
end
-- 系统函数: 触摸回调函数
function on_press(state,x,y)
local cur_screen = get_current_screen()
--拖动显示预览颜色的效果
if cur_screen == sc_modify_color and (x >= 210 and x <= 590) and (y >= 50 and y <= 430)
then
local rgb = get_pixel(x, y)
local yy = math.abs(center_y - y) * math.abs(center_y - y)
local xx = math.abs(center_x - x) * math.abs(center_x - x)
local R = math.sqrt(yy + xx)
print("Lua_debug : cur_x -> "..x.." / cur_y -> "..y)
if back_color ~= rgb and R < radius
then
modify_x_point[modify_xitem] = x - 25
modify_y_point[modify_xitem] = y - 25
modify_rgb[modify_xitem] = rgb
end
print("Lua_debug : modify_rgb["..modify_xitem.."] -> ".. modify_rgb[modify_xitem])
redraw()
end
end
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
if control == 4
then
print("Lua_debug select -> "..math.ceil(value + 1).."th row")
cur_select_record = value --选中对应的记录
return 1
......
--修改记录
elseif control == 7 and value == 0
then
local cur_record = record_read(sc_home, 4, cur_select_record)
item_info = my_split(cur_record, ';')
cur_item_color = {}
if #(item_info) > 0
then
for i = 1, #(item_info) - 1
do
cur_item_color[i] = my_get_cur_record_color(item_info[i]) --获取颜色值
cur_item_data[i] = my_get_cur_record_data(item_info[i]) --获取数值
if cur_item_color[i] == false
then
cur_item_color[i] = 0xFFFF --如果是错误值,则初始化为白色
end
cur_rgb[i] = cur_item_color[i]
modify_rgb[i] = cur_item_color[i]
end
end
--初始化修改页面的值
set_text(sc_modify_record, 11, math.ceil((cur_select_record + 1)))
set_text(sc_modify_record, 21, math.ceil((cur_select_record + 1)))
set_text(sc_modify_record, 12, cur_item_data[2])
set_text(sc_modify_record, 22, cur_item_data[2])
set_text(sc_modify_record, 13, cur_item_data[3])
set_text(sc_modify_record, 23, cur_item_data[3])
change_child_screen(sc_modify_record)
......
elseif screen == sc_modify_record --修改数值
then
if control == 9 and value == 0
then
local modify_name = get_text(sc_modify_record, 22) --获取数值
local modify_score = get_text(sc_modify_record, 23) --获取分数
local cur_modify_record = "$CLR"..string.format('%04X', modify_rgb[1]).."$NUM;"..
"$CLR"..string.format('%04X', modify_rgb[2]).."$"..modify_name..";"..
"$CLR"..string.format('%04X', modify_rgb[3]).."$"..modify_score..";"
record_modify(sc_home, 4, cur_select_record , cur_modify_record)
elseif (control >= 17 and control <= 19) and value == 0 --修改颜色
then
modify_xitem = control - 16
change_child_screen(sc_modify_color)
end
elseif screen == sc_modify_color --修改颜色
then
if control == 5 and value == 0
then
change_screen(sc_modify_record)
refresh_screen()
end
......
end
end
function on_draw(screen)
if screen == sc_modify_record --初始化修改记录画面的颜色
then
if type(cur_rgb[1]) == 'string'
then
cur_rgb[1] = tonumber(cur_rgb[1],16)
end
set_pen_color(cur_rgb[1])
draw_rect(cur_color_x[1], cur_color_y[1], (cur_color_x[1] + show_w), (cur_color_y[1] + show_h), 1)
if type(cur_rgb[2]) == 'string'
then
cur_rgb[2] = tonumber(cur_rgb[2],16)
end
set_pen_color(cur_rgb[2])
draw_rect(cur_color_x[2], cur_color_y[2], (cur_color_x[2] + show_w), (cur_color_y[2] + show_h), 1)
if type(cur_rgb[3]) == 'string'
then
cur_rgb[3] = tonumber(cur_rgb[3],16)
end
set_pen_color(cur_rgb[3] )
draw_rect(cur_color_x[3], cur_color_y[3], (cur_color_x[3] + show_w), (cur_color_y[3] + show_h), 1)
if type(modify_rgb[1]) == 'string'
then
modify_rgb[1] = tonumber(modify_rgb[1],16)
end
set_pen_color(modify_rgb[1])
draw_rect(modify_color_x[1], modify_color_y[1], (modify_color_x[1] + show_w), (modify_color_y[1] + show_h), 1)
if type(modify_rgb[2]) == 'string'
then
modify_rgb[2] = tonumber(modify_rgb[2],16)
end
set_pen_color(modify_rgb[2])
draw_rect(modify_color_x[2], modify_color_y[2], (modify_color_x[2] + show_w), (modify_color_y[2] + show_h), 1)
if type(modify_rgb[3]) == 'string'
then
modify_rgb[3] = tonumber(modify_rgb[3],16)
end
set_pen_color(modify_rgb[3])
draw_rect(modify_color_x[3], modify_color_y[3], (modify_color_x[3] + show_w), (modify_color_y[3] + show_h), 1)
elseif screen == sc_modify_color --设置选择颜色是的预览效果
then
set_pen_color(modify_rgb[modify_xitem])
draw_image(select_rgb_image_id, select_rgb_visiable, modify_x_point[modify_xitem], modify_y_point[modify_xitem], 53, 53, 0, 0)
draw_rect(570, 100, 620, 125, 1)
end
end
运行预览
选中第一行 “cp 100”,点击修改,将原数据修改为“ui 125”,并把序号修改为红色,如下所示
13.4 删除记录
选中一行记录,点击按钮控件ID8,删除对应行号
LUA脚本
选中要修改的记录,触发数据记录控件ID4回调,即value为选中的行号(value 从0开始)。 直接调用record_delete删除该索引即可。LUA脚本如下所示:
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
if control == 4 then
print("Lua_debug select -> "..math.ceil(value + 1).."th row")
cur_select_record = value
return 1
......
--删除 - 删除一条记录
elseif control == 8 and value == 1
then
record_delete(sc_home, 4, cur_select_record)
......
end
......
end
end
运行预览
假设选中第一行“1 cp 159 ”,点击删除,如下所示
13.5 读取记录
选中一行记录,点击按钮控件ID9,将该行内容显示在文本控件ID15中
LUA脚本
读取返回的字符串,放回的是最原始数据,包括序号属性“$NUM”、颜色属性等等“$CLRXXXX”,LUA脚本如下所示
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
if control == 4 then
print("Lua_debug select -> "..math.ceil(value + 1).."th row")
cur_select_record = value
return 1
......
--读取记录
elseif control == 9 and value == 1
then
local cur_record = record_read(sc_home, 4, cur_select_record)
set_text(sc_home, 15, cur_record)
......
end
......
end
end
运行预览
选中第3行,读取的结果如下所示
13.6 读取总记录条数
点击按钮控件ID10,将数据记录控件的总行数显示到文本控件ID15中
LUA脚本
调用record_get_count函数,获取数据记录控件当前总条数,显示在文本控件ID15上,LUA脚本如下所示
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
......
--记录数量
elseif control == 10 and value == 1
then
local cur_cnt = record_get_count(sc_home, 4)
set_text(sc_home, 15, 'Total : '..cur_cnt)
......
end
......
end
end
运行预览
点击“总记录数”,如下所示
13.7 设置记录偏移
设置记录偏移,即是定位到偏移索引位置,则可利用该API,可以实现翻页效果
画面配置
点击按钮控件ID11,弹出画面ID5,该画面用于设置记录偏移,如下所示
- 文本控件ID11:显示总的记录数
- 文本控件ID12:键值输入偏移的行号
LUA脚本
调用record_setoffset函数,设置当前数据记录控件内容显示的位置,形参offset从0开始,LUA脚本如下所示
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
......
--记录偏移
elseif control == 11 and value == 1
then
local cur_cnt = record_get_count(sc_home, 4) --获取当前总条数
--初始化显示
set_text(sc_offset_record, 11, math.ceil(cur_cnt))
set_text(sc_offset_record, 12, '')
change_child_screen(sc_offset_record) --切换到数据偏移设置画面
......
end
......
elseif screen == sc_offset_record --数据偏移设置画面
then
if control == 8 and value == 0
then
local offset_sn = get_text(sc_offset_record, 12) --获取键值输入的偏移量
record_setoffset(sc_home, 4, (offset_sn - 1))
end
......
end
end
运行预览
若当前记录有6条,显示第2-6条的数据记录内容,当输入偏移到第1条时候,显示第1-5条的数据记录内容,如下所示
13.8 选中记录
调用API选中对应数据记录,效果和用户点击数据记录控件选中一样
画面配置
点击控件ID12,弹出画面ID6,用于设置选中的行数,画面中添加以下控件,如下所示
- 文本控件ID11:显示当前总记录数
- 文本控件ID12:显示要选中的行号
LUA脚本
调用record_select函数,设置当前数据记录控件内容显示的位置,形参offset从0开始,LUA脚本如下所示
![record_select](H:\Online Technical Documentation\LUA\image\record_select.gif)--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
......
--选中记录
elseif control == 12 and value == 1
then
local cur_cnt = record_get_count(sc_home, 4) -获取当前记录总数
--初始化显示
set_text(sc_select_record, 11, math.ceil(cur_cnt))
set_text(sc_select_record, 12, '')
change_child_screen(sc_select_record)
......
end
......
elseif screen == sc_select_record
then
if control == 8 and value == 0
then
local select_sn = get_text(sc_select_record, 12)
record_select(sc_home, 4, (select_sn - 1))
end
......
end
end
运行预览
运行虚拟屏,若当前总记录数为6条,选中第4条,效果如下所示
13.9 清除记录
点击按钮控件ID13,将数据记录控件的所有内容清除
LUA脚本
调用record_clear函数,将当前记录的内容全部清空
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
......
--清除记录
elseif control == 13 and value == 1
then
record_clear(sc_home, 4)
end
......
end
end
运行预览
点击清除,清空所有记录,效果如下所示
13.10 导出记录
点击按钮控件ID14,将数据记录控件内容导出U盘或SD卡
LUA脚本
插入SD卡或U盘,调用record_export函数,自动将当前记录的内容导出
--用户通过触摸修改控件后,执行此回调函数。
--点击按钮控件,修改文本控件、修改滑动条都会触发此事件。
function on_control_notify(screen,control,value)
if screen == sc_home
then
......
--导出记录
elseif control == 14 and value == 1
then
record_export(sc_home, 4)
end
......
end
end