BUNZIN NET ポータル / プログラムは考え方です / メルマガバックナンバーリスト
前のメルマガ / 次のメルマガ

2009/11/24発行 『【櫻井です】タイマーの「カウントダウン実行中」の処理を追加』

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
レンタル掲示板とクイズ投稿サイトを開発した櫻井文人の
プログラムの考え方が身につくメルマガ『プログラムは考え方です』
───────────────────────────────────
メルマガ発行人
櫻井文人のプロフィール ⇒ http://www.bunzin.net/program/prof.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

こんにちは、メルマガ発行人の櫻井文人です。
あなたは人の作ったプログラムを読むのは好きですか?
詳しくは編集後記で。


引き続きイベント駆動型プログラミングを使ったタイマーのプログラムを
作っていきましょう。

いよいよ今回の処理の追加で、タイマーが動きだします。
というわけで、タイマーの「カウントダウン実行中」の処理を
追加しましょう。


───────────────────────────────────
【お知らせ】

 これからの季節・・・オフィスの乾燥対策してますか?

 USB対応で、蒸気も目に見えない気化式なので、
 周りに気兼ねすることなく、あなたのデスクでも使えます。

  デスクにうるおいを☆USB加湿器 エアロブリーズ 
  USB加湿器 エアロブリーズ
 
 販売価格:3,480円 (税込:3,654円)

  コチラ ⇒ http://www.moshimo.com/article/121691/45706

 <3個買ったら送料無料でお届けします!>


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■ タイマーの「カウントダウン実行中」の処理を追加
───────────────────────────────────

今回は、タイマープログラムの状態が
「カウントダウン中の状態(EXE_COUNT_DOWN)」の時に実行される
「カウントダウン実行中の時の処理」に処理を追加します。

いよいよ今回の修正で、カウントダウンが開始されるようになります。


■追加する処理の概要

 定期的に現在の秒を取得します。
 そして前回取得した時の秒と比較して違う値だったら、
 1秒経過したとみなして、カウントを1つ減らします。

 カウントがゼロになったら「時間になりました」と
 メッセージを表示します。


■「カウントダウン実行中」の処理を追加

 タイマーのプログラムのイベントハンドラー「exe_count_down()」に
 「カウントダウン実行中」の処理を追加します。 

 追加後のイベントハンドラー「exe_count_down()」の内容は
 以下のとおりです。


    1行目:rem **********************************************
    2行目:rem イベントハンドラ「exe_count_down()」
    3行目:rem カウントダウン実行中の時の処理
    4行目:rem **********************************************
    5行目:function exe_count_down()
    6行目:   now_cnt = ie.Document.GetElementsByName("COUNTER")(0).value
    7行目:   now_sec = Second(Now)
    8行目:   If bef_sec <> now_sec Then
    9行目:      bef_sec = now_sec
  10行目:      now_cnt = now_cnt - 1
  11行目:      ie.Document.GetElementsByName("COUNTER")(0).value = now_cnt
  12行目:   End If
  13行目:   If now_cnt <= 0 Then
  14行目:      MsgBox "時間になりました"
  15行目:      status = "IDLE"
  16行目:   End If
  17行目:end function


 今回は6行目から16行目を追加しました。

 ・6行目では、画面の入力欄から秒を取得して、now_cnt変数に
  格納しています。

 ・7行目では、Second関数で得られるの現在の秒(1秒〜60秒)を
  now_sec変数に格納しています。

 ・8行目では、1秒経過したかどうかを判定しています。
  前回取得した秒を格納しているbef_sec変数と
  現在の秒を格納しているnow_sec変数の内容を比較しています。
  比較した結果、違う値だったら、1秒経過したとみなして、
  次の9行目から11行目を実行します。
  比較した結果が同じ値だったら9行目から11行目は実行しません。

 ・9行目では、次に前回の秒として扱う時のために、
  現在の秒を保存しておきます。

 ・10行目と11行目は、カウントダウンの処理です。
  10行目では、now_cnt変数の値を1減らしています。
  そして、11行目でnow_cnt変数の値を画面の入力欄に戻しています。

 ・13行目では、カウントがゼロになったかをどうかを比較しています。
  比較した結果、カウントがゼロだったら、次の14行目と15行目を実行します。
  カウントがゼロでなかったら、14行目と15行目は実行しません。

 ・14行目と15行目は、カウントがゼロになった時の処理です。
  14行目では、「時間になりました」とメッセージを表示します。
  15行目では、プログラムの状態を「何もしていない状態 (IDLE)」に
  変更しています。変更しないとプログラムの状態が
  「カウントダウン中の状態 (EXE_COUNT_DOWN)」のままになるので、
  いつまでも無意味に「カウントダウン実行中の時の処理」が呼ばれ続ける
  ことになってしまいます。


■修正後のプログラム

 以下が、修正後のタイマープログラムです。

----------------------------------------------------------------------
rem プログラムの開始

rem **********************************************
rem お手軽タイマープログラム
rem **********************************************

rem **********************************************
rem プログラムの準備
rem **********************************************
set w = WScript

set ie = CreateObject("InternetExplorer.Application")
ie.Width = 350
ie.Height = 130
ie.ToolBar = false
ie.StatusBar = false
ie.Resizable = false
ie.Visible = true
ie.Navigate "about:blank"
do while ie.Busy
  w.sleep 100
loop

html = "" _
+ "<form name=""form1"" >" _
+ "   <table width=300><tr><td>" _
+ "      <input type=""hidden"" name=""CLICKED_PLUS""  value=""false"">" _
+ "      <input type=""hidden"" name=""CLICKED_MINUS"" value=""false"">" _
+ "      <input type=""hidden"" name=""CLICKED_START"" value=""false"">" _
+ "      <input type=""hidden"" name=""CLICKED_STOP""  value=""false"">" _
+ "      <input type=""hidden"" name=""CLICKED_CLOSE"" value=""false"">" _
+ "      <input type=""text"" name=""COUNTER"" size=5>" _
+ "      <input type=""button"" " _
+ "         onClick = ""getElementsByName('CLICKED_PLUS')(0).value = 'true';""" _
+ "         value=""+"">" _
+ "       <input type=""button"" " _
+ "         onClick = ""getElementsByName('CLICKED_MINUS')(0).value = 'true';""" _
+ "         value=""−"">" _
+ "      <br>" _
+ "      <input type=""button"" " _
+ "         onClick = ""getElementsByName('CLICKED_START')(0).value = 'true';""" _
+ "         value=""スタート"">" _
+ "      <input type=""button"" " _
+ "         onClick = ""getElementsByName('CLICKED_STOP')(0).value = 'true';""" _
+ "         value=""ストップ"">" _
+ "   </td><td align=""right"" valign=""top"">" _
+ "      <input type=""button"" " _
+ "         onClick = ""getElementsByName('CLICKED_CLOSE')(0).value = 'true';""" _
+ "         value=""閉じる"">" _
+ "   </td></tr></table>" _
+ "</form>" _

ie.Document.Body.InnerHtml = html
ie.Document.Title = "お手軽タイマー"

on error resume next

ie.Document.GetElementsByName("COUNTER")(0).value = 180
status = "IDLE"
bef_sec = 0

rem **********************************************
rem イベントループ
rem **********************************************
do while ie.Busy or status <> "CLOSE"

   If ie.Document.GetElementsByName("CLICKED_PLUS")(0).value <> "false" Then
      ie.Document.GetElementsByName("CLICKED_PLUS")(0).value = "false"
      clicked_plus()
   End If

   If ie.Document.GetElementsByName("CLICKED_MINUS")(0).value <> "false" Then
      ie.Document.GetElementsByName("CLICKED_MINUS")(0).value = "false"
      clicked_minus()
   End If

   If ie.Document.GetElementsByName("CLICKED_START")(0).value <> "false" Then
      ie.Document.GetElementsByName("CLICKED_START")(0).value = "false"
      clicked_start()
   End If

   If ie.Document.GetElementsByName("CLICKED_STOP")(0).value <> "false" Then
      ie.Document.GetElementsByName("CLICKED_STOP")(0).value = "false"
      clicked_stop()
   End If

   If ie.Document.GetElementsByName("CLICKED_CLOSE")(0).value <> "false" Then
      ie.Document.GetElementsByName("CLICKED_CLOSE")(0).value = "false"
      clicked_close()
   End If

   If status = "EXE_COUNT_DOWN" Then exe_count_down()

   w.sleep 100

loop

ie.Quit

rem **********************************************
rem イベントハンドラ「clicked_plus()」
rem 「+」ボタンがクリックされた時の処理
rem **********************************************
function clicked_plus()
end function

rem **********************************************
rem イベントハンドラ「clicked_minus()」
rem 「-」ボタンがクリックされた時の処理
rem **********************************************
function clicked_minus()
end function

rem **********************************************
rem イベントハンドラ「clicked_start()」
rem 「スタート」ボタンがクリックされた時の処理
rem **********************************************
function clicked_start()
   now_cnt = ie.Document.GetElementsByName("COUNTER")(0).value
   If now_cnt = "" Then
      MsgBox "秒数を入力してください。"
   ElseIf IsNumeric(now_cnt) = false Then
      MsgBox "秒数は数字で入力してください。"
   ElseIf now_cnt < 1 Then
      MsgBox "秒数は1秒以上で入力してください。"
   Else
      bef_sec = Second(Now)
      status = "EXE_COUNT_DOWN"
   End If
end function

rem **********************************************
rem イベントハンドラ「clicked_stop()」
rem 「ストップ」ボタンがクリックされた時の処理
rem **********************************************
function clicked_stop()
end function

rem **********************************************
rem イベントハンドラ「clicked_close()」
rem 「閉じる」ボタンがクリックされた時の処理
rem **********************************************
function clicked_close()
   status = "CLOSE"
end function

rem **********************************************
rem イベントハンドラ「exe_count_down()」
rem カウントダウン実行中の時の処理
rem **********************************************
function exe_count_down()
   now_cnt = ie.Document.GetElementsByName("COUNTER")(0).value
   now_sec = Second(Now)
   If bef_sec <> now_sec Then
      bef_sec = now_sec
      now_cnt = now_cnt - 1
      ie.Document.GetElementsByName("COUNTER")(0).value = now_cnt
   End If
   If now_cnt <= 0 Then
      MsgBox "時間になりました"
      status = "IDLE"
   End If
end function

rem プログラムの終了
----------------------------------------------------------------------


■プログラムを動かしてみる。

 途中からメルマガを読んだ方などのために、復習も兼ねて、プログラムを
 動かす方法を記述しておきます。

 【プログラムを動かす方法】

   (1)「rem プログラムの開始」から「rem プログラムの終了」までを
     コピーしてメモ帳を開いて貼り付けましょう。

   (2)そして「timer.vbs」いうファイル名で適当な場所に保存しましょう。

   (3)保存した「timer.vbs」をダブルクリックすると、
     すぐにプログラムが動きます。


■次回のメルマガでは・・・

 ついにタイマーの基本的なところは完成しました。

 今回のプログラムの追加で、クリックしたりしなくても
 プログラムが動き続けるようになったので、
 本当の意味で、動いた感じを味わえたのではないでしょうか。

 次回からは、残りの機能を少しずつ追加していってプログラムを
 仕上げていきます。

 お楽しみに・・・。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■ 編集後記
───────────────────────────────────

あなたは人の作ったプログラムを読むのは好きですか?

人の作ったプログラムを読むのは嫌だという人もいるかもしれません。
私も実はあんまり好きではないです。

しかし、我慢して読み砕いてなんとか理解してみると、
新しいプログラムの考え方が身についたりすることがあるので侮れません。

昔は、先輩の作ったプログラムを嫌々読み砕いて修正したりなんて
ことをやらなくてはならないことも、よくありました。
でも、そういった経験のおかげで私の中のプログラムの考え方は、
かなり広がりました。

なので、気が進まなくても人のプログラムをたまに読んでみるのは
お勧めです。
ただ、読んでも、ためにならないしょぼいプログラムに出くわすこと
があると思います。そういう場合も、逆に自分ならこうするかな
とか考えると、それはそれで勉強になると思うので良いと思います。


最後までお読みいただき、ありがとうございました。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

●櫻井が開発したレンタル掲示板は
  コチラ ⇒ http://www.bunzin.gr.jp/m_board/

  画像のアップロードも可能なレンタル掲示板です。
  無料ですのでお気軽にどうぞ。


●櫻井が開発したクイズ投稿サイトは
  コチラ ⇒ http://www.bunzin.gr.jp/quiz/

  あなたが考えたクイズを投稿することができます。
  投稿されたクイズに回答することもできます。
  無料ですのでお気軽にどうぞ。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
メルマガ発行人 櫻井文人

メルマガ発行責任者情報は
 コチラ ⇒ http://www.bunzin.net/program/mghsinfo.html

アドレス変更と登録解除はコチラ ⇒ http://www.mag2.com/m/0000293166.html

メルマガバックナンバーは
 コチラ ⇒ http://www.bunzin.net/program/mailmaga/backnumber/

櫻井文人のプロフィール ⇒ http://www.bunzin.net/program/prof.html

ご意見・ご感想はコチラ ⇒ bunzin●bunzin.gr.jp
(メール送信の際は、●を@に置き換えてください。)
(櫻井が確実に読みますが、返信は保障できません。)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 
メルマガ登録・解除
 
前のメルマガ / 次のメルマガ
企画・運営・管理 BUNZIN NET