动手创造 · PROJECT LAB
准备探索你的新作品
我的待办清单
0%
★★ 项目难度每一步,都离作品更近
先了解你将做出什么
应用介绍
这次做一个真正有用的小工具:输入任务后加入清单,点选任务就能完成并移除,退出 App 再打开,
任务仍然保留。列表显示框 负责显示,微数据库 负责保存。

我的待办清单教程(难度系数:★★)
准备界面
| 组件类型 | 组件名称 | 关键设置 |
|---|---|---|
| 文本输入框 | 文本输入框_任务 |
输入任务文字 |
| 按钮 | 按钮_添加 |
文本:添加 |
| 按钮 | 按钮_完成 |
文本:完成所选 |
| 按钮 | 按钮_清空 |
文本:清空全部 |
| 列表显示框 | 列表显示框_任务 |
显示任务列表 |
| 标签 | 标签_计数 |
显示任务数量 |
| 微数据库 | 微数据库1 |
非可视组件 |
先声明状态和刷新过程
列表数据有两个地方要同步:屏幕上的 列表显示框_任务 和 微数据库1 里的持久数据。
把显示列表的动作集中到一个过程里,新增、删除、启动时都调用它,避免重复写同一段代码。
global 待办事项 = []
global 当前选择 = 0
procedure 刷新列表() {
列表显示框_任务.Elements = 待办事项
标签_计数.Text = join("共 ", length(待办事项), " 项")
}
App 启动时恢复任务
第一次打开时,微数据库1 还没有“任务”这个标签,所以给 GetValue 一个空列表作为默认值。
这样后面直接取长度、添加任务都不会遇到空值。
when Screen1.Initialize() {
待办事项 = 微数据库1.GetValue("任务", [])
刷新列表()
}
添加任务并保存
添加成功后要按这个顺序做四件事:把文字加入列表、保存列表、清空输入框、刷新显示。 少了最后一步,数据虽然变了,屏幕却不会马上更新。
when 按钮_添加.Click() {
if isempty(文本输入框_任务.Text) {
标签_计数.Text = "先输入一项任务"
} else {
listadd(待办事项, 文本输入框_任务.Text)
微数据库1.StoreValue("任务", 待办事项)
文本输入框_任务.Text = ""
刷新列表()
}
}
选中并完成任务
列表的下标从 1 开始,SelectionIndex 正好给出被点中项目的下标。没有选中项目时它是 0,
所以完成前先检查一下,避免删除不存在的项。
when 列表显示框_任务.AfterPicking(selection) {
当前选择 = 列表显示框_任务.SelectionIndex
标签_计数.Text = join("已选:", selection)
}
when 按钮_完成.Click() {
if 当前选择 = 0 {
标签_计数.Text = "先点选一项任务"
} else {
listremove(待办事项, 当前选择)
微数据库1.StoreValue("任务", 待办事项)
当前选择 = 0
刷新列表()
}
}
清空全部任务
清空时同时修改内存列表和数据库标签。只把列表设为空而不调用 ClearTag,下次启动时旧任务
又会被读回来。
when 按钮_清空.Click() {
待办事项 = []
当前选择 = 0
微数据库1.ClearTag("任务")
刷新列表()
}
开始测试
- 添加两三项任务,列表是否立即出现新内容。
- 不选任务直接点“完成所选”,是否只提示而不报错。
- 选中一项完成,剩余任务和数量是否正确。
- 完全退出 App 再打开,任务是否还在。
- 清空后退出重进,列表是否仍然为空。
剩余工作
可以把“完成”改成在任务前加勾选符号,或者增加优先级、截止日期;如果要多人共享,再把
微数据库 换成 云数据库,并为异步的 GotValue 事件重新设计数据流程。
边做边查
打开全部组件速查
卡在哪一步?直接查操作
不用退出当前教程。速查会在新页面打开,查完回来继续刚才的进度。