- ベストアンサー
vb.net タイマーに引数を渡す
vb.net(visual studio 2010)です。趣味(もちろん素人です。)でソフトを作ってます。timerに引数を渡すことはできるのでしょうか。integer型の引数を渡したいです。的外れな質問かもしれませんが、実現できたらうれしいです。よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 音量アップボタンをButton0、ダウンボタンをButton1とします。 > (1)Button0または、Button1を押す。 > (2)Button0または、Button1から、番号0または、1を取りだしてタイマーに渡し、タイマーを起動。インターバルは300msとしています。 > (3)番号0で、音量アップ。番号1で、音量ダウン。 であれば,「タイマーに引数を渡す」ではなく,クラスのフィールドを用意するのが普通の書き方だと思います。 音量変更メソッドの引数も,コントロールの番号ではなく,変更幅自体を渡したり, 「上げる」「下げる」をEnumとしておき,それをメソッドに渡すようにした方がよいでしょう。 Public Class Form1 Private _volumeChangeValue As Integer ' 音量の変更幅 Private Sub Button_MouseDown (sender As Object, e As MouseEventArgs) Handles Button0.MouseDown, Button1.MouseDown If e.Button <> MouseButton.Left Then Return ' 左ボタン以外は処理しない If Timer2.Enabled Then Return ' タイマーが有効であれば処理しない If sender Is Button0 Then _volumeChangeValue = 1 ' Button0が押された Else If sender Is Button1 Then _volumeChangeValue = -1 ' Button1が押された Else Return End If Timer2.Enabled = True End Sub Private Sub Button_MouseUp (sender As Object, e As MouseEventArgs) Handles Button0.MouseUp, Button1.MouseUp If e.Button <> MouseButton.Left Then Return ' 左ボタン以外は処理しない _volumeChangeValue = 0 Timer2.Enabled = False End Sub Private Sub Timer2_Tick (sender As Object, e As EventArgs) Handles Timer2.Tick ChangeVolume(_volumeChangeValue) ' 音量変更 End Sub End Class
その他の回答 (4)
- Hayashi_Trek
- ベストアンサー率44% (366/818)
リピートボタンの実装と思われます。 こんな方法はどうですか? (イベント関数の引数などは省略して記載してません) Private ButtonMode As Integer = 0 'ボタン識別のモジュール変数 Private ButtonTime As Integer = 0 'ボタン押し時間のモジュール変数 '/********************************************************************* ' *音量ボタン長押しの場合の処理 ' ********************************************************************/ Private Sub Button0_MouseDown() ButtonMode = 1 'この場合はボタンごとにイベントを記載する 'ButtonMode = Object.Tag のようにButtonのTagプロパティをボタンの識別に使う方法も有り。(イベント関数を1つにすることができる) ret = SetVol(ButtonMode) '押した時の最初の処理 ButtonTime = 0 Timer2.Enabled = True End Sub Private Sub Button0_MouseUp() ButtonMode = 0 Timer2.Enabled = False End Sub '/********************************************************************* ' *タイマー起動 ' ********************************************************************/ Private Sub Timer2_Tick() If Button = 0 Then Return 'ボタン押されていない ButtonTime = ButtonTime + 1 If ButtonTime>10 Then 'リピート反応待ち Dim ret As String ret = SetVol(ButtonMode)'//ボタンの番号によって音量アップ、ダウンをセット End If End Sub
補足
返答が遅れて大変申し訳ありませんでした。 コーディングまでしていただきましてありがとうございました。 リピートボタンの実装は大変参考になりました。 ButtonTime = ButtonTime + 1 のところは使ってみたいと思います。
- Hayashi_Trek
- ベストアンサー率44% (366/818)
Timerに限らず、たいていのコントロールにはTagプロパティがあります。 MSDNでのTagの使用例 http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.tag%28v=vs.80%29.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1 '使用 Dim instance As Timer Dim value As Object value = instance.Tag instance.Tag = value ここのvalueをInteger型にすればよいと思います。
補足
ご回答ありがとうございます。NO.2のYune-Kichiさんの補足に書かせていただきましたが、何となくなんですが動きました。(動いてしまったといのが本当のところです。)Hayashi_Trekさんのようにインスタンスを使って実現するとすすっきりしたプログラムになるのかなと思います。NO.2のYune-Kichiさんの補足にも書きましたが、プログラムは以下です。Hayashi_Trekさんのようにインスタンスを使うには、どこでどうインスタンスを使用すればよろしいでしょうか。御面倒をおかけしてすみません。 '/********************************************************************* ' *音量ボタン長押しの場合の処理 ' ********************************************************************/ Private Sub Button0_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button0.MouseDown, Button1.MouseDown Dim senderName As String = DirectCast(sender, Button).Name '//ボタンのベース名 長さの取得に使用 Dim strBut As String = "Button" '//Buttonxxのxxを取得して数字に直している Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length)) Timer2.Tag = index '//Buttonxxのxxをタイマーに渡す Timer2.Enabled = True End Sub Private Sub Button0_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button0.MouseUp, Button1.MouseUp Dim senderName As String = DirectCast(sender, Button).Name '//ボタンのベース名 長さの取得に使用 Dim strBut As String = "Button" '//Buttonxxのxxを取得して数字に直している Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length)) Timer2.Enabled = False End Sub '/********************************************************************* ' *タイマー起動 ' ********************************************************************/ Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick Dim ret As String ret = SetVol(Timer2.Tag)'//ボタンの番号によって音量アップ、ダウンをセット End Sub
- Yune-Kichi
- ベストアンサー率74% (465/626)
a) Timerをフィールドに持つクラスに,専用のフィールドを持たせる b) (System.Windows.Forms.Timer専用) Tagプロパティに値を持たせる 基本的にはaで済みます。 タイマーのイベントをラムダ式で書いている場合には,外側の変数をキャプチャさせるだけで十分,という場合もありますが……。
補足
御回答ありがとうございます。実現したいのは音量を制御するプログラムです。 音量アップボタンをButton0、ダウンボタンをButton1とします。 (1)Button0または、Button1を押す。 (2)Button0または、Button1から、番号0または、1を取りだしてタイマーに渡し、タイマーを起動。インターバルは300msとしています。 (3)番号0で、音量アップ。番号1で、音量ダウン。 ※(2)でinteger型の引数で0か1かを渡したいです。 実際にプログラムをかいて実行してみたら、動いてしまったんですがこれでよいのでしょうか? 御迷惑でなかったら見ていただきたいのですが・・・ '/********************************************************************* ' *音量ボタン長押しの場合の処理 ' ********************************************************************/ Private Sub Button0_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button0.MouseDown, Button1.MouseDown Dim senderName As String = DirectCast(sender, Button).Name '//ボタンのベース名 長さの取得に使用 Dim strBut As String = "Button" '//Buttonxxのxxを取得して数字に直している Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length)) Timer2.Tag = index '//Buttonxxのxxをタイマーに渡す Timer2.Enabled = True End Sub Private Sub Button0_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Button0.MouseUp, Button1.MouseUp Dim senderName As String = DirectCast(sender, Button).Name '//ボタンのベース名 長さの取得に使用 Dim strBut As String = "Button" '//Buttonxxのxxを取得して数字に直している Dim index As Integer = CInt(senderName.Substring(strBut.Length, senderName.Length - strBut.Length)) Timer2.Enabled = False End Sub '/********************************************************************* ' *タイマー起動 ' ********************************************************************/ Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick Dim ret As String ret = SetVol(Timer2.Tag)'//ボタンの番号によって音量アップ、ダウンをセット End Sub 貴重なお時間すみません。御指摘いただけたら本当にうれしいです。
- 田中 裕之(@bybalsendercase)
- ベストアンサー率88% (56/63)
こんにちは すいません。 Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick ↓ Private Sub Timer1_Tick(sender As Integer , e As System.EventArgs) Handles Timer1.Tick にした場合 Timer1_Tick(300,new EventArgs) で引数に300の整数を渡せますが、 Timer1_のオブジェクトがなくなってしまいますので、Handles Timer1.Tickが機能しなくなってしまいます。 なんか、いい方法はないかな~? 引数の使用方法がわかりませんので、適当に Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick プロシージャに値を渡すサンプルを作成しました。(あまり意味がありませんが) 値を一度 Class timに渡して、再度Timer1_Tickイベントプロシージャに渡してラベルに表示しています。 Public Class Form1 Dim dotime As New tim 'Class timのインスタンス Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown Timer1.Enabled = True Timer1.Interval = 3000 Label1.Text = "test" Dim i1 As Integer = 200 dotime.num(i1) 'Class timに値を渡す End Sub Private Sub Timer1_Tick(sender As Object, e As System.EventArgs) Handles Timer1.Tick Label1.Text = CStr(dotime.timer) 'timerの値を取得してラベルに表示 End Sub End Class Public Class tim Private _it As Integer 'Class Form1から値を取得 Public Sub num(i As Integer) _it = i End Sub 'timerに値を読み取る Public ReadOnly Property timer() As Integer Get Return _it End Get End Property End Class
補足
御回答ありがとうございます。プログラムまで書いていただいて、本当にありがとうございました。 まず理解したいと思います。
お礼
何度も丁寧な御回答ありがとうございます。クラスのフィールドPrivate _volumeChangeValue As Integer ' 音量の変更幅を使った方がすっきりするようですね。それと、If e.Button <> MouseButton.Left Then Return ' 左ボタン以外は処理しない の処理は自分では気づきませんでした。御指摘ありがとうございました。早速使ってみたいと思います。