━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ レンタル掲示板とクイズ投稿サイトを開発した櫻井文人の プログラムの考え方が身につくメルマガ『プログラムは考え方です』 ─────────────────────────────────── メルマガ発行人 櫻井文人のプロフィール ⇒ 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 (メール送信の際は、●を@に置き換えてください。) (櫻井が確実に読みますが、返信は保障できません。) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |