寫在前面
這是PB案例學習筆記系列文章的第11篇,該系列文章適合具有一定PB基礎的讀者。
通過一個個由淺入深的編程實戰案例學習,提高編程技巧,以保證小伙伴們能應付公司的各種開發需求。
文章中設計到的源碼,小凡都上傳到了gitee代碼倉庫https://gitee.com/xiezhr/pb-project-example.git
需要源代碼的小伙伴們可以自行下載查看,后續文章涉及到的案例代碼也都會提交到這個倉庫【pb-project-example】
如果對小伙伴有所幫助,希望能給一個小星星?支持一下小凡。
一、小目標
這篇文章,我們將回顧Time
事件得使用。最終實現一個計時秒表功能。
具體功能為界面上有【計時】、【暫停】、【清除】三個按鈕,單擊【計時】按鈕,文本框中時間開始計時;
單擊【暫停】按鈕,文本框計時暫停,此時按鈕文本變成【繼續】字樣;單擊【繼續】按鈕,計時繼續;
單擊【清除】按鈕,文本框數字歸零,具體效果如下
二、創建程序基本框架
① 新建examplework
工作區
② 新建exampleapp
應用
③ 新建w_main
窗口
以上步驟如果忘記的小伙伴可以翻一翻該系列的第一篇文章
④ 在w_main
窗口中添加控件
在窗口中建立一個SingleLineEdit
控件和3個CommandButton
控件,各個控件名稱依次為sle_1
,cb_1
,cb_2
,cb_3
調整位置后布局如下圖所示
⑤ 保存窗口
三、編寫代碼
為了實現秒表中的清零功能,我們需要用到一個全局變量
說到全局變量,我們這里列舉出各種變量的作用域及使用說明
變量類型 | 中文名稱 | 說明 |
---|---|---|
Global | 全局變量 | 在應用的任何地方都可以訪問,可以在Application 、Window 、UserObject 、Function 、Menu 中定義全局變量 |
Instance | 實例變量 | 如同一個對象的屬性,可以在``Application、 Window、 UserObject、 Menu`中定義實例變量 |
Shared | 共享變量 | 共享變量在一個對象中定義,存在于這個對象的不同實例可以在``Application、 Window、 UserObject、 Menu`中定義共享變量 |
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")
④ 添加【計時】按鈕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)
這段代碼的解釋如下:
- 首先,用戶點擊了【計時】后禁用了 【計時】
cb_1
按鈕 - 然后,啟用了【暫停】
cb_2
按鈕 - 接著,禁用了【清除】
cb_3
控件,是為了防止在特定條件下使用 - 修改【暫停】
cb_2
按鈕的文本為 “暫停” l_time
變量被重置為0,用于初始化一個計時器或者表示某種狀態的清零- 最后,調用
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
控件的文本內容來切換其狀態和定時器的行為:
- 首先,將【計時】
cb_1
和 【暫停】cb_2
按鈕被設置為可用狀態,【清除】cb_3
也是可用的。 - 然后,檢查
cb_2
的文本是否為 “暫停”。 - 如果是 “暫停”,則將
cb_2
的文本更改為 “繼續”,并停止計數 - 如果不是 “暫停”(即當前文本是 “繼續”),則將
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
代碼解釋:
- 點擊【清除】按鈕后,啟用控件
cb_1
:允許用戶點擊【計時】cb_1
按鈕繼續操作 - 禁用控件
cb_2
和cb_3
:這兩個控件暫時不允許用戶操作 - 重置時間顯示:將顯示時間的控件
sle_1
的文本設置為 “00:00:00 00”,表示時間被重置為零 - 重置計時變量:將
gl_time
變量設置為0,這是計時的基礎變量,用于累計時間
⑦ 在開發界面左邊的System Tree
窗口中雙擊exampleapp
并在其Open
事件中添加如下代碼
open(w_main)
四、運行程序
以上代碼添加完成后,我們運行程序,來測試一下是否達到了我們預期的效果
效果很好,達到了我們預期的效果,完結撒花 ★,°:.☆( ̄▽ ̄)/ : ? . ° ★ ? 。 ? ★ , ° ? : . ☆ (  ̄ ▽  ̄ ) / :*.°★* 。*★,°*:.☆( ̄▽ ̄)/ :?.°★?。?★,°?:.☆( ̄▽ ̄)/:.°★ 。
本期內容到這兒就結束了,希望對您有所幫助。
我們下期再見 ヾ(?ω?`)o (●’?’●)