スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)
ここには、タイマーのサンプル・ソースを載せておきます。
このタイマーは、WM_TIMER メッセージのタイマー・イベントを使って1秒間に20回更新させます。
- [START]ボタンは、タイマーの開始(再開)
- [STOP]ボタンは、タイマーの一時停止
- [RESET]ボタンは、タイマーのリセット
上記の3つのボタンは、タイマーの基本操作ボタンを用意してます。
[START]→[STOP]→[START]→[STOP]→[RESET]という感じでボタンを押す事になるでしょう。
なお、プリセット・ボタンを押さずに[START]ボタンを押すとストップウォッチ機能になります。
- [1分]ボタンは、1分用のプリセット
- [2分]ボタンは、2分用のプリセット
- [3分]ボタンは、3分用のプリセット
- [4分]ボタンは、4分用のプリセット
- [5分]ボタンは、5分用のプリセット
- [6分]ボタンは、6分用のプリセット
- [7分]ボタンは、7分用のプリセット
- [8分]ボタンは、8分用のプリセット
- [9分]ボタンは、9分用のプリセット
- [10分]ボタンは、10分用のプリセット
上記の10個のボタンは、プリセット・タイマーの操作ボタンです。
このボタン類は押すとタイマー時間が自動的にセットされて、即タイマーが開始されます。
動作中にプリセット・ボタンを押すとタイマーが一時停止します。
一時停止中にプリセット・ボタンを押すとタイマー時間が自動的にセットされます。
タイマー時間がセットされた時に、プリセット・ボタンを押すとタイマーが開始されます。
つまり、
(00"00:02:59.456) [3分]ボタンを押すと自動的に3分タイマーが開始される。
↓
(00"00:02:58.281) [5分]ボタンを押すと一時停止状態になる。
↓
(00"00:05:00.000) [5分]ボタンを押すとタイマー時間がセットされる。
↓
(00"00:04:59.456) [5分]ボタンを押すと自動的に5分タイマーが開始される。
↓
(00"00:04:56.500) [STOP]ボタンを押すとタイマーは一時停止される。
↓
(00"00:05:00.000) [RESET]ボタンを押すとタイマー時間がプリセットされる。
↓
(00"00:00:00.000) [RESET]ボタンを押すとタイマー時間がリセットされる。
このような感じで動作します。
タイマーのソース
管理上このサンプルは sample353b.hsp のソースです。
//------------------------------------------------------------------------------ // タイマーのサンプル by 科学太郎 //============================================================================== // 新規作成日:2019-07-08 (月) 11:38:00 // 最終更新日:2019-07-10 (水) 16:12:00 //------------------------------------------------------------------------------ #cmpopt varinit 1 #packopt hide 1 #packopt name __FILE__ # #include "User32.as" #include "Kernel32.as" //-------------------------------------- // 記号定数(API定数) //-------------------------------------- #const global NULL 0 #const global WM_TIMER $00000113 //-------------------------------------- // 記号定数 //-------------------------------------- #const WID_MAIN (0) ;ウインドウID #const TID_TIMER (1) ;タイマーID #const TMS_TIMER (50) ;タイマー間隔(ms) //-------------------------------------- // メイン部 //-------------------------------------- *Init dim nPreset ;タイマー時間(ms) dim nStart ;開始時間(ms) dim nCount ;経過時間(ms) dim nMode ;モード状態(0=停止,1=計測中) *Main screen WID_MAIN,700,100,SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_HIDE syscolor 15:boxf:color:title "タイマーのサンプル by 科学太郎" font MSGOTHIC,75:SetTimer hWnd,TID_TIMER,TMS_TIMER,NULL ;設定 oncmd gosub *OnTimer, WM_TIMER onexit gosub *OnQuit ;配置(1) objsize 100,25 button gosub "START", *PushStart button gosub "STOP", *PushStop button gosub "RESET", *PushReset ;配置(2) objsize 70,25 x=ginfo_cx y=ginfo_cy repeat 10 pos x,y:x+=70:button gosub strf("%d分",cnt+1), *PushTimer loop ;表示 DrawTimer gsel WID_MAIN,1 stop //-------------------------------------- // スタートの処理 //-------------------------------------- *PushStart if(nMode==0){ nMode=1:nStart=GetTickCount() } return //-------------------------------------- // ストップの処理 //-------------------------------------- *PushStop if(nMode){ nMode=0:nCount+=(GetTickCount()-nStart) } return //-------------------------------------- // リセットの処理 //-------------------------------------- *PushReset if(nStart==0)and(nCount==0)and(nMode==0){ nPreset=0 } else{ nStart=0 nCount=0 nMode=0 } return //-------------------------------------- // ラーメンタイマーの実行 //-------------------------------------- *PushTimer if(nMode):gosub *PushStop:return ;設定 h=(0) m=(stat-3)+1 s=(0) nPreset=((h*3600)+(m*60)+s)*1000 ;リセット if(nStart):gosub *PushReset:return if(nCount):gosub *PushReset:return ;スタート gosub *PushStart return //-------------------------------------- // タイマーの処理 //-------------------------------------- *OnTimer if(wParam==TID_TIMER){ redraw 0 DrawTimer redraw 1 } return 0 //-------------------------------------- // タイマーの描画 //-------------------------------------- #deffunc DrawTimer if(nMode):n=(nCount+(GetTickCount()-nStart)):else:n=nCount ;タイマー if(nPreset){ n=(nPreset-n) if(n<0):gosub *PushReset:dialog "時間ですよ~。",0,"確認":return } ;分離 t=(n\1000) :n/=1000 s=(n\60) :n/=60 m=(n\60) :n/=60 h=(n\24) :n/=24 d=(n\100) :n/=100 ;座標 s=strf("%02d\"%02d:%02d:%02d.%03d",d,h,m,s,t) n=strlen(s)*75/2 x=100+(600-n)/2 y=0 ;描画 color $80,$00,$00:boxf color $66,$00,$00:pos(x+2),(y+2):mes s color $FF,$00,$00:pos(x+0),(y+0):mes s return //-------------------------------------- // 終了時の割り込み処理 //-------------------------------------- *OnQuit KillTimer hWnd,TID_TIMER end return //------------------------------------------------------------------------------ // End of sample353b.hsp //------------------------------------------------------------------------------
上記のソースは、前回のストップウォッチのサンプル・ソースを少し改良した形です。
そのため DrawStopwatch 命令と DrawTimer 命令の違いはタイマー部を少し追加した形になります。
タイマーの改良
上記の3つのボタンは、普通のタイマーのように[START/STOP]ボタン、[STOP/RESET]ボタンではありません。このようなボタンは nMode 変数の状態で呼び出すサブルーチンを切り分ければ良いのです。
つまり、次のようなサブルーチンを2つ用意すれば良いでしょう。
//-------------------------------------- // スタート/ストップの処理 //-------------------------------------- *PushStartStop if(nMode):gosub *PushStop:else:gosub *PushStart return //-------------------------------------- // ストップ/リセットの処理 //-------------------------------------- *PushResetStop if(nMode):gosub *PushStop:else:gosub *PushReset return
続いて、プッシュボタンの配置を少し改良してみます。
;配置(1) objsize 100,25 button gosub "START/STOP", *PushStartStop button gosub "STOP/RESET", *PushResetStop button gosub "RESET", *PushReset
これで良くありがちなタイマーのボタンになりましたね。
タイマーのテンキー機能
今回はタイマーの基本ソースを紹介してるためテンキー機能はありません。
テンキーによる入力には、時、分、秒の3つに分けた変数を用意してから SetTenKey 命令を実装します。
この他にもテンキー入力状態の bInput フラグ変数も必要になるでしょう。
この bInput フラグ変数を見て DrawTimer 命令、*PushStart サブルーチンを見直します。
この命令、サブルーチンの改良については、閲覧者(読者)の課題にしておきます。
ブログに載せるのは容易いですが、自分で考えてみるのも面白いと思います。
よって、ここではソースを公開しないでおきます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます