【PB案例学习笔记】-12秒表实现

写在前面

这是PB案例学习笔记系列文章的第11篇,该系列文章适合具有一定PB基础的读者。

通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。

文章中设计到的源码,小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git

gitee代码仓库

需要源代码的小伙伴们可以自行下载查看,后续文章涉及到的案例代码也都会提交到这个仓库【pb-project-example

如果对小伙伴有所帮助,希望能给一个小星星⭐支持一下小凡。

一、小目标

这篇文章,我们将回顾Time事件得使用。最终实现一个计时秒表功能。

具体功能为界面上有【计时】、【暂停】、【清除】三个按钮,单击【计时】按钮,文本框中时间开始计时;

单击【暂停】按钮,文本框计时暂停,此时按钮文本变成【继续】字样;单击【继续】按钮,计时继续;

单击【清除】按钮,文本框数字归零,具体效果如下

秒表计时

二、创建程序基本框架

① 新建examplework 工作区

② 新建exampleapp 应用

③ 新建w_main窗口

以上步骤如果忘记的小伙伴可以翻一翻该系列的第一篇文章

④ 在w_main窗口中添加控件

在窗口中建立一个SingleLineEdit控件和3个CommandButton控件,各个控件名称依次为sle_1,cb_1cb_2,cb_3

调整位置后布局如下图所示

页面布局

⑤ 保存窗口

三、编写代码

为了实现秒表中的清零功能,我们需要用到一个全局变量

说到全局变量,我们这里列举出各种变量的作用域及使用说明

变量类型中文名称说明
Global全局变量在应用的任何地方都可以访问,可以在ApplicationWindowUserObjectFunctionMenu中定义全局变量
Instance实例变量如同一个对象的属性,可以在``ApplicationWindowUserObjectMenu`中定义实例变量
Shared共享变量共享变量在一个对象中定义,存在于这个对象的不同实例可以在``ApplicationWindowUserObjectMenu`中定义共享变量
Local局部变量只能在定义的脚本中访问变量,可以在任何控件和对象的脚本中定义

① 定义全局变量

我们在w_main窗口中的Declare Global Variables选项卡中添加如下全局变量

Long gl_time

定义全局变量

② 窗口打开时,【计时】按钮可操作,【暂停】【清除】按钮不可以操作

w_main窗口的open中添加如下代码

cb_1.enabled=true
cb_2.enabled=false
cb_3.enabled=false

设置按钮可编辑

③ 编辑Timer事件代码

这一步时最关键的,这段代码的主要功能是将一个表示总毫秒数的变量 l_time 更新为增加1毫秒后的新时间,并将更新后的时、分、秒和毫秒格式化为字符串显示在一个文本控件 sle_1.text 上。

// 定义了四个长整型变量,分别表示时、分、秒和毫秒
LONG ll_hour   // 小时
LONG ll_min    // 分钟
LONG ll_sec    // 秒
LONG ll_msec   // 毫秒// 假设 `l_time` 是一个包含总毫秒数的变量,这里将其加1
gl_time = gl_time + 1// 计算新的毫秒数,使用取模运算得到当前毫秒数
ll_msec = mod(gl_time, 100)// 计算新的秒数,先减去毫秒部分,然后对100取模,再除以60得到秒数
ll_sec = mod((gl_time - ll_msec) / 100, 60)// 计算新的分钟数,从剩余的时间中减去秒数,然后对60取模
ll_min = mod((gl_time - ll_msec - ll_sec * 100) / 6000, 60)// 计算新的小时数,从剩余的时间中减去分钟和秒数,然后对3600取模
ll_hour = mod((gl_time - ll_msec - ll_sec * 100 - ll_min * 6000) / 360000, 60)// 将时间格式化为字符串,如 "00:00:00 00",并显示在控件 `sle_1.text` 上
sle_1.text = string(ll_hour, "00:") + string(ll_min, "00:") + string(ll_sec, "00") + string(ll_msec, " 00")

添加timer事件

④ 添加【计时】按钮Clicked事件代码

// 设置控件 `cb_1` 的启用状态为 false,使其不可用
cb_1.enabled = false// 设置控件 `cb_2` 的启用状态为 true,使其可用
cb_2.enabled = true// 设置控件 `cb_3` 的启用状态为 false,使其不可用
cb_3.enabled = false// 修改 `cb_2` 的文本内容为 "暂停"
cb_2.text = "暂停"// 将变量 `l_time` 设为0,可能用于记录某种计时或状态
gl_time = 0// 调用 `timer` 函数,参数为0.01,这通常意味着设置一个定时器,每隔0.01秒执行一次回调函数
timer(0.01)

这段代码的解释如下:

  1. 首先,用户点击了【计时】后禁用了 【计时】cb_1 按钮
  2. 然后,启用了【暂停】 cb_2 按钮
  3. 接着,禁用了【清除】 cb_3 控件,是为了防止在特定条件下使用
  4. 修改【暂停】cb_2 按钮的文本为 “暂停”
  5. l_time 变量被重置为0,用于初始化一个计时器或者表示某种状态的清零
  6. 最后,调用 timer 函数,设置了一个定时器,每0.01秒触发一次回调函数

⑤ 添加【暂停】按钮Clicked事件代码

// 设置控件 `cb_1` 的启用状态为 false,使其不可用
cb_1.enabled = false// 设置控件 `cb_2` 的启用状态为 true,使其可用
cb_2.enabled = true// 设置控件 `cb_3` 的启用状态为 true,使其可用
cb_3.enabled = true// 判断 `cb_2` 的文本是否为 "暂停"
if cb_2.text = "暂停" then// 如果是,将 `cb_2` 的文本更改为 "继续"cb_2.text = "继续"// 停止定时器,可能停止之前的0.01秒定时器timer(0)
else// 如果不是(即文本为 "继续"),将 `cb_2` 的文本恢复为 "暂停"cb_2.text = "暂停"// 启动定时器,设置为每0.01秒执行一次timer(0.01)
end if

这段代码的功能是根据 cb_2 控件的文本内容来切换其状态和定时器的行为:

  1. 首先,将【计时】cb_1 和 【暂停】cb_2 按钮被设置为可用状态,【清除】 cb_3 也是可用的。
  2. 然后,检查 cb_2 的文本是否为 “暂停”。
  3. 如果是 “暂停”,则将 cb_2 的文本更改为 “继续”,并停止计数
  4. 如果不是 “暂停”(即当前文本是 “继续”),则将 cb_2 的文本改回 “暂停”,并重新启动定时器,设置为每0.01秒执行一次

注意,这里的 timer(0) 表示停止定时器,而 timer(0.01) 表示设置定时器每0.01秒触发一次

⑥ 添加【清除】按钮Clicked事件代码

// 设置控件 `cb_1` 的启用状态为 true,允许用户与其交互
cb_1.enabled = true// 设置控件 `cb_2` 的启用状态为 false,禁止用户交互
cb_2.enabled = false// 设置控件 `cb_3` 的启用状态也为 false,同样不允许用户操作
cb_3.enabled = false// 将控件 `sle_1`的文本设置为初始时间值 "00:00:00 00",表示0小时0分钟0秒0毫秒
sle_1.text = "00:00:00 00"// 重置变量 `l_time` 的值为0,这通常用于开始一个新的计时周期或作为时间累计的起点
gl_time = 0

代码解释:

  1. 点击【清除】按钮后,启用控件 cb_1:允许用户点击【计时】 cb_1按钮继续操作
  2. 禁用控件 cb_2cb_3:这两个控件暂时不允许用户操作
  3. 重置时间显示:将显示时间的控件 sle_1 的文本设置为 “00:00:00 00”,表示时间被重置为零
  4. 重置计时变量:将 gl_time 变量设置为0,这是计时的基础变量,用于累计时间

⑦ 在开发界面左边的System Tree 窗口中双击exampleapp并在其Open事件中添加如下代码

open(w_main)

四、运行程序

以上代码添加完成后,我们运行程序,来测试一下是否达到了我们预期的效果

秒表计时

效果很好,达到了我们预期的效果,完结撒花 ★,°:.☆( ̄▽ ̄)/ : ∗ . ° ★ ∗ 。 ∗ ★ , ° ∗ : . ☆ (  ̄ ▽  ̄ ) / :*.°★* 。*★,°*:.☆( ̄▽ ̄)/ :.°,°:.()/:.°★

本期内容到这儿就结束了,希望对您有所帮助。

我们下期再见 ヾ(•ω•`)o (●’◡’●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19142.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2.文件和目录相关(下)】

一、查看文件内容命令 1、cat 文件名:用于显示文件内容,比如 cat test.c。 (1)cat -b test.c 表示加行号显示文件内容。 (2)cat -s test.c 表示多个空行合并成一个空行显示。 2、nl 文件名:…

2024 京麟ctf -MazeCodeV1

文章目录 检查代码思路一个字节的指令注意附上S1uM4i佬们的exp https://www.ctfiot.com/184181.html 检查 代码 __int64 __fastcall check_solve(char *a1) {__int64 result; // rax__int64 v2; // rax__int64 index_step; // rax__int64 v4; // rax__int64 v5; // rax__int64…

MVC架构中的servlet层重定向404小坑

servlet层中的UserLoginServlet.java package com.mhys.servlet; /*** ClassName: ${NAME}* Description:** Author 数开_11* Create 2024-05-29 20:32* Version 1.0*/import com.mhys.pojo.User; import com.mhys.service.UserService; import com.mhys.service.impl.UserSer…

MySQL之创建高性能的索引(六)

创建高性能的索引 选择合适的索引列顺序 当使用前缀索引的时候,在某些条件值的基数比正常值高的时候,问题就来了。例如,在某些应用程序中,对于没有登录的用户,都将其用户名记录为"guest",在记录…

基于python flask的旅游数据大屏实现,有爬虫有数据库

背景 随着旅游行业的快速发展,数据在旅游决策和规划中的重要性日益凸显。基于 Python Flask 的旅游数据大屏实现研究旨在结合爬虫技术和数据库存储,为用户提供全面、实时的旅游信息展示平台。 爬虫技术作为数据采集的重要手段,能够从各种网…

错误记录:从把项目从Tomcat8.5.37转到Tomcat10.1.7

错误信息:在本地Servlet项目里没有报错,但是浏览器跳转该servlet时报错 型 异常报告 消息 实例化Servlet类[com.wangdao.lx.MyServlet1]异常 描述 服务器遇到一个意外的情况,阻止它完成请求。 例外情况 jakarta.servlet.ServletExceptio…

Generative Action Description Prompts for Skeleton-based Action Recognition

标题:基于骨架的动作识别的生成动作描述提示 源文链接:https://openaccess.thecvf.com/content/ICCV2023/papers/Xiang_Generative_Action_Description_Prompts_for_Skeleton-based_Action_Recognition_ICCV_2023_paper.pdfhttps://openaccess.thecvf.c…

解决文件传输难题:如何绕过Gitee的100MB上传限制

引言 在版本控制和代码托管领域,Gitee作为一个流行的平台,为用户提供了便捷的服务。然而,其对单个文件大小设定的100MB限制有时会造成一些不便。 使用云存储服务 推荐理由: 便捷性:多数云存储服务如: Dro…

零基础学习图生图

目录 一、图生图是什么二、安装秋叶整合包2.1 秋叶包安装2.2 秋叶包拓展安装:2.3 ckpt配置:2.4 界面常用功能配置: 三、图生图基本功能展示3.1 图生图的界面3.2 重要的参数设置:3.3 涂鸦功能3.4 局部重绘功能3.5 涂鸦重绘3.6 上传…

网络智能化的发展对仿真环境的需求

1. 网络智能化背景介绍 1.1 什么是网络智能化 网络智能化是指利用人工智能(AI)、机器学习(ML)、优化算法等技术来实现网络的信息化、自动化和智能化。相对5G、6G、算力网络等领域,网络智能化是针对网络全场景、全要素…

使用C语言openssl库实现 RSA加密 和 消息验证

Q:什么是RSA? A:RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,是最早的一种用于公开密钥加密和数字签名的算法。它使用一对公钥(public key)和私钥(private key&…

IEEE Latex模版踩雷避坑指南

参考文献 原Latex模版 \begin{thebibliography}{1} \bibliographystyle{IEEEtran}\bibitem{ref1} {\it{Mathematics Into Type}}. American Mathematical Society. [Online]. Available: https://www.ams.org/arc/styleguide/mit-2.pdf\bibitem{ref2} T. W. Chaundy, P. R. Ba…

基于 FastAI 文本迁移学习的情感分类(93%+Accuracy)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

[vue3后台管理二]首页和登录测试

[vue3后台管理二]首页和登录测试 1 修改main.js import ./assets/main.cssimport { createApp } from vue import App from ./App.vue import router from ./router createApp(App).use(router).mount(#app)2 路由创建 import {createRouter, createWebHistory} from vue-ro…

计算机网络学习笔记——运输层(b站)

目录 一、 运输层概述 二、运输层端口号、复用与分用的概念 三、UDP和TCP的对比 四、TCP的流量控制 五、TCP的拥塞控制 六、TCP超时重传时间的选择 七、TCP可靠传输的实现 八、TCP报文段的首部格式 一、 运输层概述 物理层、数据链路层、网络层实现了主机到主机的通信…

剪映网页版

https://www.capcut.cn/web 免费,免安装,跨平台,视频云合成,简直太好用了!

echarts-事件

echarts部分事件 添加点击事件 添加点击事件: let options {tooltip: {},xAxis: {type: "category",data: ["d1", "d2", "d3", "d4"],},yAxis: {},series: [{type: "line",data: d1,},{type: &qu…

Codeforces Round 948 (Div. 2) E. Tensor(思维题-交互)

题目 n(3<n<100)个点的有向图&#xff0c; 图的边的关系未知&#xff0c;但保证以下两点&#xff1a; 1. 只存在j->i&#xff08;i<j&#xff09;的边 2. 对于任意三个点i、j、k&#xff08;i<j<k&#xff09;&#xff0c;要么k可以到达i&#xff0c;要么…

知识付费小程序源码系统 界面支持万能DIY装修,一站式运营 附带完整的源代码以及搭建教程

系统概述 这是一款功能强大的知识付费小程序源码系统&#xff0c;它为用户提供了一个全面的平台&#xff0c;能够满足各种知识付费场景的需求。其界面支持万能 DIY 装修&#xff0c;让用户可以根据自己的品牌形象和风格进行个性化定制&#xff0c;打造出独具特色的小程序界面。…

【云原生】Kubernetes----PersistentVolume(PV)与PersistentVolumeClaim(PVC)详解

目录 引言 一、存储卷 &#xff08;一&#xff09;存储卷定义 &#xff08;二&#xff09;存储卷的作用 1.数据持久化 2.数据共享 3.解耦 4.灵活性 &#xff08;三&#xff09;存储卷的分类 1.emptyDir存储卷 1.1 定义 1.2 特点 1.3 示例 2.hostPath存储卷 2.1 …