繰り返しビープ音

タグの編集
投稿者 ママン  (学生) 投稿日時 2010/1/13 03:24:34
vb.netです

スイッチを押したら3秒毎にビープ音をだすプログラムを作りたいのですが、オーバーフローになってできません。

どうしたらよいですか?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       
        hajimetime = 3
        Timer1.Interval = 1000
        keikatime = 0
        Timer1.Start()


    End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        
        Dim nokoritime As Integer
        Dim i As Integer

        i = 0

 While (i < 10)
            keikatime = keikatime + 1

            nokoritime = hajimetime - keikatime

            If nokoritime = 0 Then

                Timer1.Stop()
                Beep()
                i = i + 1
            End If
 end while

    End Sub
End Class
投稿者 まだまだ  (中学生) 投稿日時 2010/1/13 04:12:33
わざわざそのようにたくさんの変数を置かなくても、
Timer1のIntervalを3000にしてBeep()を呼び出せばいいと思います。

Button1,2,Timer1を置いて、作ってみました。
Button1を押すと始まって、Button2を押すと止まります。
Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
        timer1.start()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button2.Click
        Timer1.Stop()
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Timer1.Tick
        Beep()
    End Sub
End Class
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2010/1/13 04:12:51
> オーバーフローになってできません。

実際に動かしてはいませんが、元のコードをざっと眺めてみると、
Tick イベントで、恐らくこういう動きをしているのだと思います。

1. i が 0 の状態でループ開始(10未満なので処理される)
2.   keikatime を 0 → 1 に増加
3.   nokoritime に 3 - keikatime すなわち 2 をセット
4.   nokoritime は 0 ではないので、If 文の中身は処理されない
   (音もしないし、変数 i の値も変化しない)

5. i の値が 0 のまま、再度ループ処理を続行
6.   keikatime を 1 → 2 に増加
7.   nokoritime に 3 - keikatime すなわち 1 をセット
8.   nokoritime は 0 ではないので、If 文の中身は処理されない
   (音もしないし、変数 i の値も変化しない)

9. i の値が 0 のまま、再々度ループ処理を続行


これを延々と繰り返すうちに、変数 keikatime の値が Integer の管理範囲外の値に
なってしまい、桁溢れ(オーバーフロー)となってしまうのでしょう。


> 3秒毎にビープ音をだすプログラムを作りたいのですが、

こういうことかな?

Sub Timer1_Tick(……
  Beep()
End Sub

'開始ボタン 
Sub Button1_Click(……
  Button1.Enabled = False
  Timer1.Interval = 3000
  Tiemr1.Start()
  Button2.Enabled = True
End Sub

'停止ボタン 
Sub Button2_Click(……
  Button2.Enabled = False
  Timer1.Stop()
  Button1.Enabled = True
End Sub
投稿者 ママン  (学生) 投稿日時 2010/1/13 19:59:13
>魔界の仮面弁士さん、まだまださん

とてもスマートな解答例ありがとうございます。

おかげで理解でき、プログラムを作動させることができました。