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

2010/01/14発行 『【櫻井です】「ラーメン(3分)」ボタンのイベントを検知する』

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

こんにちは、メルマガ発行人の櫻井文人です。
初音ミクで遊んでみました。
詳しくは編集後記で。


前回のメルマガでは、
タイマープログラムに追加する、
3分間をワンタッチで計測する機能のために、
「ラーメン(3分)」ボタンを追加しました。

今回は、イベントループ内のイベントディスパッチャに、
「ラーメン(3分)」ボタンがクリックされたイベントの発生を
検知する処理を追加します。


───────────────────────────────────
【おすすめ】

今話題の電子タバコですが、
ちょっと試してみたいと思っても、
どれもだいたい1万円くらいなので、なかなか手が出しにくいですよね。

実は5千円もしない電子タバコのセットがあるんです。

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

  ターボフィルター電子タバコ『マジックスモーカー』
  本体キット《メンソール風味》

  販売価格:4,000円 (税込:4,200円)

これなら、ちょっと試してみるのにはよさそうですね。


━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■ 「ラーメン(3分)」ボタンのイベントを検知する
───────────────────────────────────

今回は、イベントループ内のイベントディスパッチャに、
「ラーメン(3分)」ボタンがクリックされたイベントの発生を
検知する処理を追加します。

イベントの発生を検知した時に呼ばれるイベントハンドラも
追加します。


■イベントディスパッチャに処理を追加

 イベントループ内のイベントディスパッチャに、以下の処理を追加しました。


    1行目:If ie.Document.GetElementsByName("NOODLE_3MIN")(0).value <> "false" Then
    2行目:   ie.Document.GetElementsByName("NOODLE_3MIN")(0).value = "false"
    3行目:   clicked_noodle_3min()
    4行目:End If


 前回のメルマガで説明したように、
 「ラーメン(3分)」ボタンがクリックされたら、
 NOODLE_3MINという名前の部品にtrueが格納されます。
 (クリックされる前はfalseが格納されています)

 なので、1行目でNOODLE_3MINに格納されている値の中身を確認し、
 falseでなかったら、「ラーメン(3分)」ボタンがクリックされたという
 イベントが発生したと判断し、2行目と3行目の処理を実行します。

 2行目で、NOODLE_3MINにfalseを格納します。
 NOODLE_3MINに格納された値がtrueのままだと、
 いつまでも「ラーメン(3分)」ボタンがクリックされた
 と判断され続けてしまうので、true以外の値を格納する必要があります。

 3行目で、イベントハンドラである
 clicked_noodle_3min()を呼び出しています。


■イベントハンドラの追加

 「ラーメン(3分)」ボタンがクリックされたというイベントが発生したら
 呼び出されるイベントハンドラを新しく追加しました。

 以下が追加したイベントハンドラです。


    1行目:rem **********************************************
    2行目:rem イベントハンドラ「clicked_noodle_3min()」
    3行目:rem 「ラーメン(3分)」ボタンがクリックされた時の処理
    4行目:rem **********************************************
    5行目:function clicked_noodle_3min()
    6行目:end function


 今回は追加したイベントハンドラは、中身がからっぽです。
 次回以降で実際の処理を追加していきます。


■修正後のプログラム

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

----------------------------------------------------------------------
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=""NOODLE_3MIN""  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=""ストップ"">" _
+ "      <input type=""button"" " _
+ "         onClick = ""getElementsByName('NOODLE_3MIN')(0).value = 'true';""" _
+ "         value=""ラーメン(3分)"">" _
+ "   </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("NOODLE_3MIN")(0).value <> "false" Then
      ie.Document.GetElementsByName("NOODLE_3MIN")(0).value = "false"
      clicked_noodle_3min()
   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()
   now_cnt = ie.Document.GetElementsByName("COUNTER")(0).value
   If now_cnt = "" Then
      MsgBox "秒数を入力してください。"
   ElseIf IsNumeric(now_cnt) = false Then
      MsgBox "秒数は数字で入力してください。"
   Else
      ie.Document.GetElementsByName("COUNTER")(0).value = now_cnt + 1
   End If
end function

rem **********************************************
rem イベントハンドラ「clicked_minus()」
rem 「-」ボタンがクリックされた時の処理
rem **********************************************
function clicked_minus()
   now_cnt = ie.Document.GetElementsByName("COUNTER")(0).value
   If now_cnt = "" Then
      MsgBox "秒数を入力してください。"
   ElseIf IsNumeric(now_cnt) = false Then
      MsgBox "秒数は数字で入力してください。"
   ElseIf now_cnt > 0 Then
      ie.Document.GetElementsByName("COUNTER")(0).value = now_cnt - 1
   End If
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()
   status = "IDLE"
end function

rem **********************************************
rem イベントハンドラ「clicked_noodle_3min()」
rem 「ラーメン(3分)」ボタンがクリックされた時の処理
rem **********************************************
function clicked_noodle_3min()
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 プログラムの終了
----------------------------------------------------------------------


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

 今回までの修正で、イベント駆動型プログラミングの枠組みとなる部分への
 必要な処理の追加が終わりました。

 次回からは、各イベントハンドラに処理を追加していき、
 引き続き「3分間をワンタッチで計測する」機能の完成を目指します。


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

初音ミクで遊んでみました。

ボーカロイド初音ミク・・・
だいぶ前から話題になっているので、ご存知の方も多いと思います。
簡単に言うと歌を歌わせるソフトです。
音階や歌詞などを指定していって歌を歌わせることができます。

私も、実は初音ミクを買ってました。
買って半年以上たつのですが、なかなか難しそうで手付かずでした。
ただ、いつまでも放置というのもどうかと思うので、
ついに初音ミクを、いじってみることにしたのです

結果的には、それほど操作は難しくありません。
上下が音階、左右が時間軸になっている画面の中から
歌わせたい箇所を選んで歌詞を入力していく感じです。

もっといろいろと細かい設定ができるようですが、
これだけでもかなり遊べます。

適当にいろいろいじってると、だんだんと、
なんかちゃんとした歌を歌わせてみたくなってきました。

いきなり曲を作るのは大変なので、手持ちの楽譜から曲を選んで、
入力してみました。

普段あまり楽譜を見ない人はちょっと大変かも
しれませんが、音符を1つ1つ読み取って楽譜に変換していく作業
は、楽譜を読む良い練習になりそうです。

なんとか楽譜を入力し終わった後、あらためて初音ミクの歌声を
きいてみると、なんとも感慨深いものがありました。

そのうち、なにかオリジナルの曲でも作ってみたいです。
いつになるかは分かりませんが・・・

CRYPTON / 初音ミク <VOCALOID2>


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


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

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

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


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

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


●お手軽!VBScriptを使ってみよう

  コチラ ⇒ http://www.bunzin.net/program/vbscript/


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

メルマガ発行責任者情報は
 コチラ ⇒ 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