【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.pswp.cn/bicheng/19142.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/19142.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/19142.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python3 筆記:math模塊

要使用 math 函數必須先導入math模塊 語法:import math Python math 模塊提供了許多對浮點數的數學運算函數。 math 模塊下的函數,返回值均為浮點數,除非另有明確說明。 如果需要計算復數,需使用 cmath 模塊中的同名函數。 m…

【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…

vb.net,C#強制結束進程,“優雅”的退出方式

在VB.NET中,Application.Exit()和Environment.Exit(0)都用于結束程序,但它們的使用場景和背后的邏輯略有不同。 **Application.Exit()**: Application.Exit()通常用于Windows Forms應用程序中。當調用Application.Exit()時,它會觸…

cocos 屏幕點擊坐標轉換為節點坐標

let scPos event.getLocation(); let camera find(Canvas/Camera).getComponent(Camera).screenToWorld(new Vec3(scPos.x,scPos.y,0));//攝像機 let p this.node.getComponent(UITransform).convertToNodeSpaceAR(camera);//this.node為指定的節點為原點(0,0&…

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…

Unix環境高級編程--8-進程控制---8.7函數waitid 8.8函數wait3 wait4

1、Single Unix Specification支持一個取得進程終止狀態的函數--waitid,此函數類似于waitpid: pid_t wait(int *status); pid_t waitpid(pid_t pid, int *status, int options); int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options); …

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

創建高性能的索引 選擇合適的索引列順序 當使用前綴索引的時候,在某些條件值的基數比正常值高的時候,問題就來了。例如,在某些應用程序中,對于沒有登錄的用戶,都將其用戶名記錄為"guest",在記錄…

【axios】的淺度分析

一、Axios的攔截器能干些什么? Axios攔截器的實現原理主要涉及兩個方面:請求攔截器和響應攔截器,它們分別在請求發送前和響應返回后進行預處理和后處理。 Axios內部維護了兩個數組,一個用于存儲請求攔截器,另一個用于…

數據庫基礎+增刪查改初階

數據庫基礎增刪查改初階 一。數據庫操作 1.概念: 一個mysql服務器上有很多的表,把有關系的表放在一起就構成了一個數據集合,此時稱為“數據庫”,一個mysql1服務器上可以有多個這樣的數據庫 2.創建數據庫: create …

穩住!一招制勝:打造JavaScript防抖函數的終極指南【含代碼示例】

穩住!一招制勝:打造JavaScript防抖函數的終極指南【含代碼示例】 防抖函數:概念與作用基礎實現:案例一簡單防抖函數使用示例 進階功能:案例二 - 立即執行版本性能優化與安全考量實戰技巧與問題排查實際問題與解決方案結…

基于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…

現代操作系統上創建各類鏈接的方法匯總

文章目錄 現代操作系統上創建各類鏈接的方法匯總windows: cmd下的mklink創建鏈接示例 powershell 創建鏈接創建常規文件和目錄創建鏈接 linux shell 創建硬鏈接NAMESYNOPSIS詳細說明常用選項示例 檢查與辨識符號鏈接🎈linux下檢查ls -l 命令file 命令 windows下檢查…

零基礎學習圖生圖

目錄 一、圖生圖是什么二、安裝秋葉整合包2.1 秋葉包安裝2.2 秋葉包拓展安裝:2.3 ckpt配置:2.4 界面常用功能配置: 三、圖生圖基本功能展示3.1 圖生圖的界面3.2 重要的參數設置:3.3 涂鴉功能3.4 局部重繪功能3.5 涂鴉重繪3.6 上傳…

SQL 語言:存儲過程和觸發器

文章目錄 基本概述創建觸發器更改和刪除觸發器總結 基本概述 存儲過程,類似于高階語言的函數或者方法,包含SQL語句序列,是可復用的語句,保存在數據庫中,在服務器中執行。特點是復用,提高了效率&#xff0c…

網絡智能化的發展對仿真環境的需求

1. 網絡智能化背景介紹 1.1 什么是網絡智能化 網絡智能化是指利用人工智能(AI)、機器學習(ML)、優化算法等技術來實現網絡的信息化、自動化和智能化。相對5G、6G、算力網絡等領域,網絡智能化是針對網絡全場景、全要素…

使用C語言openssl庫實現 RSA加密 和 消息驗證

Q:什么是RSA? A:RSA(Rivest-Shamir-Adleman)是一種非對稱加密算法,是最早的一種用于公開密鑰加密和數字簽名的算法。它使用一對公鑰(public key)和私鑰(private key&…