13 数据记录控件

本章节详细描述数据记录控件在LUA中的应用,包含添加、插入、清除、偏移、获取记录数、读取记录、修改、删除、选择、导出等等功能,本例程中以一个成绩单为例子,如序号+名字+分数组成,如下所示,在画面ID0中添加数据记录控件ID4,其中配置为允许选择、显示序号、按钮控件ID5~ID14用于实现对应的功能、文本控件ID15用于显示对应的信息,如读取的记录、总记录数等

record_allattr

相关API函数如下所示,详细的形参说明,参考LUA 脚本API 接口

  1. 添加记录:record_add(screen,control,record)
  2. 插入记录:record_insert (screen,control,position,record)
  3. 清除记录:record_clear(screen,control)
  4. 涉及记录偏移:record_setoffset(screen,control,offset)
  5. 获取记录数:record_get_count(screen,control)
  6. 读取记录:record_read(screen,control,position)
  7. 修改记录:record_modify(screen,control, position ,record)
  8. 删除单条记录:record_delete(screen,control,position)
  9. 选择记录:record_select(screen,control,position)
  10. 导出记录:record_export(screen,control)

适用范围:M系列、W系列、X系列、F系列(固件版本 >= V4.2.401.0)

例程下载链接:《LUA - 数据记录控件应用》(点击跳转)

13.1 添加记录

画面配置

点击按钮控件ID5,弹出画面ID1,该画面用于文本键值输入添加的数据,如下所示

  • 文本控件ID9:现在添加的序号
  • 文本控件ID10:键盘输入姓名
  • 文本控件ID11:键盘输入分数
  • 按钮控件ID12:取消返回到主页
  • 按钮控件ID13:添加到数据记录控件,并返回主页

record_add

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,点击回车,如下所示

record_add

13.2 插入记录

点击按钮控件ID6,弹出画面ID2,该画面用于文本键值输入插入的数据,如下所示

  • 文本控件ID9:现在添加插入的行号(从0开始,0表示第一行)
  • 文本控件ID10:键盘输入姓名
  • 文本控件ID11:键盘输入分数
  • 按钮控件ID12:取消返回到主页
  • 按钮控件ID13:添加到数据记录控件,并返回主页

record_inser

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,点击回车,如下所示

record_inser.gif

13.3 修改记录

画面配置

点击按钮控件ID7,弹出画面ID3,该画面用于修改记录,如下所示

  • 文本控件ID11:显示现在要修改的行号
  • 文本控件ID12:显示现在要修改的名字
  • 文本控件ID13:显示现在要修改的分数
  • 文本控件ID21:显示现在要修改的行号
  • 文本控件ID22:文本键值输入要修改的名字
  • 文本控件ID23:文本键值输入要修改的分数

record_modify

  • 按钮控件ID17:跳转到画面ID4,选择要修改的序号颜色值
  • 按钮控件ID18:跳转到画面ID4,选择要修改的名字颜色值
  • 按钮控件ID19:跳转到画面ID4,选择要修改的分数颜色值

record_modifycolor

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”,并把序号修改为红色,如下所示

record_modify.gif

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 ”,点击删除,如下所示

record_del.gif

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:键值输入偏移的行号

record_offset

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条的数据记录内容,如下所示

record_offset.gif

13.8 选中记录

调用API选中对应数据记录,效果和用户点击数据记录控件选中一样

画面配置

点击控件ID12,弹出画面ID6,用于设置选中的行数,画面中添加以下控件,如下所示

  • 文本控件ID11:显示当前总记录数
  • 文本控件ID12:显示要选中的行号

record_select

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条,效果如下所示

record_select.gif

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

results matching ""

    No results matching ""